summaryrefslogtreecommitdiff
path: root/www-client
diff options
context:
space:
mode:
authorroot <root@alpha.trunkmasters.com>2026-05-31 17:23:40 -0500
committerroot <root@alpha.trunkmasters.com>2026-05-31 17:23:40 -0500
commitf953dc70343485250b836ad157649aaad47ac5bc (patch)
treee3634b454cf48f10ce9f8d12f10e60ad0a749239 /www-client
parent5e07081cf4f5afaef79409b430a018b1daec073e (diff)
downloadbaldeagleos-repo-f953dc70343485250b836ad157649aaad47ac5bc.tar.gz
baldeagleos-repo-f953dc70343485250b836ad157649aaad47ac5bc.tar.xz
baldeagleos-repo-f953dc70343485250b836ad157649aaad47ac5bc.zip
Adding metadata
Diffstat (limited to 'www-client')
-rw-r--r--www-client/badwolf/metadata.xml2
-rw-r--r--www-client/browsh/metadata.xml2
-rw-r--r--www-client/chawan/Manifest1
-rw-r--r--www-client/chawan/chawan-0.3.3.ebuild29
-rw-r--r--www-client/chawan/chawan-0.4.0.ebuild72
-rw-r--r--www-client/chawan/chawan-9999.ebuild29
-rw-r--r--www-client/chawan/metadata.xml2
-rw-r--r--www-client/chromium-common/metadata.xml2
-rw-r--r--www-client/chromium/Manifest10
-rw-r--r--www-client/chromium/chromium-146.0.7680.177.ebuild2
-rw-r--r--www-client/chromium/chromium-148.0.7778.167.ebuild2
-rw-r--r--www-client/chromium/chromium-148.0.7778.178.ebuild1747
-rw-r--r--www-client/chromium/chromium-148.0.7778.215.ebuild1747
-rw-r--r--www-client/chromium/chromium-149.0.7827.14.ebuild2
-rw-r--r--www-client/chromium/chromium-149.0.7827.22.ebuild (renamed from www-client/chromium/chromium-149.0.7815.2.ebuild)16
-rw-r--r--www-client/chromium/chromium-149.0.7827.53.ebuild1749
-rw-r--r--www-client/chromium/chromium-150.0.7846.4.ebuild1765
-rw-r--r--www-client/chromium/metadata.xml2
-rw-r--r--www-client/dillo/metadata.xml2
-rw-r--r--www-client/elinks/elinks-0.18.0.ebuild2
-rw-r--r--www-client/elinks/elinks-0.19.0.ebuild2
-rw-r--r--www-client/elinks/elinks-0.19.1.ebuild2
-rw-r--r--www-client/elinks/elinks-9999.ebuild2
-rw-r--r--www-client/elinks/metadata.xml2
-rw-r--r--www-client/epiphany/epiphany-48.5.ebuild3
-rw-r--r--www-client/epiphany/epiphany-49.3.ebuild3
-rw-r--r--www-client/epiphany/epiphany-49.8.1.ebuild3
-rw-r--r--www-client/epiphany/metadata.xml2
-rw-r--r--www-client/falkon/metadata.xml2
-rw-r--r--www-client/fetch/metadata.xml2
-rw-r--r--www-client/firefox-bin/Manifest397
-rw-r--r--www-client/firefox-bin/firefox-bin-140.11.0.ebuild361
-rw-r--r--www-client/firefox-bin/firefox-bin-151.0.1.ebuild360
-rw-r--r--www-client/firefox-bin/firefox-bin-151.0.2.ebuild359
-rw-r--r--www-client/firefox-bin/firefox-bin-151.0.ebuild360
-rw-r--r--www-client/firefox-bin/metadata.xml2
-rw-r--r--www-client/firefox-l10n/Manifest300
-rw-r--r--www-client/firefox-l10n/firefox-l10n-151.0.1.ebuild181
-rw-r--r--www-client/firefox-l10n/firefox-l10n-151.0.2.ebuild181
-rw-r--r--www-client/firefox-l10n/firefox-l10n-151.0.ebuild181
-rw-r--r--www-client/firefox-l10n/metadata.xml2
-rw-r--r--www-client/firefox/Manifest105
-rw-r--r--www-client/firefox/firefox-140.10.1-r1.ebuild2
-rw-r--r--www-client/firefox/firefox-140.10.2.ebuild2
-rw-r--r--www-client/firefox/firefox-140.11.0.ebuild1422
-rw-r--r--www-client/firefox/firefox-150.0.1.ebuild2
-rw-r--r--www-client/firefox/firefox-150.0.2.ebuild2
-rw-r--r--www-client/firefox/firefox-150.0.3.ebuild2
-rw-r--r--www-client/firefox/firefox-151.0.1.ebuild1386
-rw-r--r--www-client/firefox/firefox-151.0.2.ebuild1384
-rw-r--r--www-client/firefox/firefox-151.0.ebuild1386
-rw-r--r--www-client/firefox/metadata.xml2
-rw-r--r--www-client/google-chrome-beta/Manifest4
-rw-r--r--www-client/google-chrome-beta/google-chrome-beta-149.0.7827.22.ebuild (renamed from www-client/google-chrome-beta/google-chrome-beta-148.0.7778.96.ebuild)0
-rw-r--r--www-client/google-chrome-beta/google-chrome-beta-149.0.7827.53.ebuild (renamed from www-client/google-chrome-beta/google-chrome-beta-149.0.7827.3.ebuild)0
-rw-r--r--www-client/google-chrome-beta/metadata.xml2
-rw-r--r--www-client/google-chrome-unstable/Manifest1
-rw-r--r--www-client/google-chrome-unstable/google-chrome-unstable-150.0.7846.4.ebuild129
-rw-r--r--www-client/google-chrome-unstable/metadata.xml2
-rw-r--r--www-client/google-chrome/Manifest4
-rw-r--r--www-client/google-chrome/google-chrome-148.0.7778.178.ebuild (renamed from www-client/google-chrome/google-chrome-146.0.7680.177.ebuild)0
-rw-r--r--www-client/google-chrome/google-chrome-148.0.7778.215.ebuild (renamed from www-client/google-chrome/google-chrome-147.0.7727.137.ebuild)0
-rw-r--r--www-client/google-chrome/metadata.xml2
-rw-r--r--www-client/helium-bin/Manifest8
-rw-r--r--www-client/helium-bin/helium-bin-0.12.3.1.ebuild (renamed from www-client/helium-bin/helium-bin-0.10.8.1.ebuild)0
-rw-r--r--www-client/helium-bin/helium-bin-0.12.5.1.ebuild (renamed from www-client/helium-bin/helium-bin-0.11.2.1.ebuild)0
-rw-r--r--www-client/helium-bin/metadata.xml2
-rw-r--r--www-client/httrack/metadata.xml2
-rw-r--r--www-client/jd/metadata.xml2
-rw-r--r--www-client/librewolf-bin/Manifest4
-rw-r--r--www-client/librewolf-bin/librewolf-bin-151.0.1_p2.ebuild (renamed from www-client/librewolf-bin/librewolf-bin-150.0.2_p1.ebuild)0
-rw-r--r--www-client/librewolf-bin/metadata.xml2
-rw-r--r--www-client/librewolf/Manifest4
-rw-r--r--www-client/librewolf/librewolf-151.0.1_p2.ebuild (renamed from www-client/librewolf/librewolf-150.0.3_p1.ebuild)6
-rw-r--r--www-client/librewolf/metadata.xml2
-rw-r--r--www-client/links/metadata.xml2
-rw-r--r--www-client/luakit/metadata.xml2
-rw-r--r--www-client/lynx/metadata.xml2
-rw-r--r--www-client/microsoft-edge-beta/Manifest6
-rw-r--r--www-client/microsoft-edge-beta/metadata.xml2
-rw-r--r--www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.16.ebuild (renamed from www-client/microsoft-edge-beta/microsoft-edge-beta-148.0.3967.52.ebuild)5
-rw-r--r--www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.24.ebuild (renamed from www-client/microsoft-edge-beta/microsoft-edge-beta-148.0.3967.54.ebuild)5
-rw-r--r--www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.33.ebuild126
-rw-r--r--www-client/microsoft-edge-dev/Manifest4
-rw-r--r--www-client/microsoft-edge-dev/metadata.xml2
-rw-r--r--www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.4.ebuild125
-rw-r--r--www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.8.ebuild2
-rw-r--r--www-client/microsoft-edge-dev/microsoft-edge-dev-150.0.4041.0.ebuild (renamed from www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.8.ebuild)2
-rw-r--r--www-client/microsoft-edge-dev/microsoft-edge-dev-150.0.4055.0.ebuild (renamed from www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4009.0.ebuild)2
-rw-r--r--www-client/microsoft-edge/Manifest2
-rw-r--r--www-client/microsoft-edge/metadata.xml2
-rw-r--r--www-client/microsoft-edge/microsoft-edge-148.0.3967.96.ebuild (renamed from www-client/microsoft-edge/microsoft-edge-148.0.3967.54.ebuild)5
-rw-r--r--www-client/mullvad-browser-bin/Manifest4
-rw-r--r--www-client/mullvad-browser-bin/metadata.xml2
-rw-r--r--www-client/mullvad-browser-bin/mullvad-browser-bin-15.0.14.ebuild (renamed from www-client/mullvad-browser-bin/mullvad-browser-bin-15.0.12.ebuild)0
-rw-r--r--www-client/netrik/metadata.xml2
-rw-r--r--www-client/netsurf/metadata.xml2
-rw-r--r--www-client/nyxt/metadata.xml2
-rw-r--r--www-client/opera-beta/metadata.xml2
-rw-r--r--www-client/opera-developer/Manifest4
-rw-r--r--www-client/opera-developer/metadata.xml2
-rw-r--r--www-client/opera-developer/opera-developer-132.0.5903.0.ebuild (renamed from www-client/opera-developer/opera-developer-132.0.5883.0.ebuild)0
-rw-r--r--www-client/opera-developer/opera-developer-133.0.5910.0.ebuild (renamed from www-client/opera-developer/opera-developer-132.0.5889.0.ebuild)2
-rw-r--r--www-client/opera-gx-bin/metadata.xml2
-rw-r--r--www-client/opera-gx/metadata.xml2
-rw-r--r--www-client/opera/Manifest2
-rw-r--r--www-client/opera/metadata.xml2
-rw-r--r--www-client/opera/opera-132.0.5905.11.ebuild (renamed from www-client/opera/opera-131.0.5877.55.ebuild)2
-rw-r--r--www-client/pybugz/metadata.xml2
-rw-r--r--www-client/pybugz/pybugz-0.14.ebuild2
-rw-r--r--www-client/pybugz/pybugz-9999.ebuild2
-rw-r--r--www-client/qutebrowser/metadata.xml2
-rw-r--r--www-client/qutebrowser/qutebrowser-3.6.3.ebuild2
-rw-r--r--www-client/qutebrowser/qutebrowser-3.7.0.ebuild2
-rw-r--r--www-client/qutebrowser/qutebrowser-9999.ebuild2
-rw-r--r--www-client/seamonkey/metadata.xml2
-rw-r--r--www-client/seamonkey/seamonkey-2.53.23.ebuild2
-rw-r--r--www-client/surf/metadata.xml2
-rw-r--r--www-client/surfraw/metadata.xml2
-rw-r--r--www-client/tangram/metadata.xml2
-rw-r--r--www-client/torbrowser-launcher/metadata.xml2
-rw-r--r--www-client/torbrowser-launcher/torbrowser-launcher-0.3.9.ebuild2
-rw-r--r--www-client/uget/metadata.xml2
-rw-r--r--www-client/ungoogled-chromium-bin/Manifest3
-rw-r--r--www-client/ungoogled-chromium-bin/metadata.xml2
-rw-r--r--www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.178.ebuild (renamed from www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.96.ebuild)0
-rw-r--r--www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.215.ebuild218
-rw-r--r--www-client/ungoogled-chromium/Manifest15
-rw-r--r--www-client/ungoogled-chromium/files/avif_image_decoder.cc1286
-rw-r--r--www-client/ungoogled-chromium/files/avif_image_decoder.h189
-rw-r--r--www-client/ungoogled-chromium/files/chromium-109-system-openh264.patch20
-rw-r--r--www-client/ungoogled-chromium/files/chromium-109-system-zlib.patch10
-rw-r--r--www-client/ungoogled-chromium/files/chromium-125-cloud_authenticator.patch19
-rw-r--r--www-client/ungoogled-chromium/files/chromium-127-cargo_crate.patch12
-rw-r--r--www-client/ungoogled-chromium/files/chromium-128-cfi-split-lto-unit.patch14
-rw-r--r--www-client/ungoogled-chromium/files/chromium-133-webrtc-fixes.patch11
-rw-r--r--www-client/ungoogled-chromium/files/chromium-134-stdatomic.patch17
-rw-r--r--www-client/ungoogled-chromium/files/chromium-138-nodejs-version-check.patch49
-rw-r--r--www-client/ungoogled-chromium/files/chromium-141-fix-for-kde.patch12
-rw-r--r--www-client/ungoogled-chromium/files/chromium-144-qrcode.patch75
-rw-r--r--www-client/ungoogled-chromium/files/chromium-144-revert-libpng-testiness.patch130
-rw-r--r--www-client/ungoogled-chromium/files/chromium-145-crabby.patch11
-rw-r--r--www-client/ungoogled-chromium/files/chromium-145-fontations.patch728
-rw-r--r--www-client/ungoogled-chromium/files/chromium-145-oauth2-client-switches.patch37
-rw-r--r--www-client/ungoogled-chromium/files/chromium-146-glibc-2.43.patch9
-rw-r--r--www-client/ungoogled-chromium/files/chromium-147-gcc.patch827
-rw-r--r--www-client/ungoogled-chromium/files/chromium-147-no-rust.patch772
-rw-r--r--www-client/ungoogled-chromium/files/chromium-browser.xml13
-rw-r--r--www-client/ungoogled-chromium/files/chromium-cross-compile.patch12
-rw-r--r--www-client/ungoogled-chromium/files/chromium-launcher-r7.sh59
-rw-r--r--www-client/ungoogled-chromium/files/chromium.default10
-rw-r--r--www-client/ungoogled-chromium/files/compiler.patch340
-rw-r--r--www-client/ungoogled-chromium/files/font-gc-asan.patch70
-rw-r--r--www-client/ungoogled-chromium/files/font_format_check.cc122
-rw-r--r--www-client/ungoogled-chromium/files/font_format_check.h56
-rw-r--r--www-client/ungoogled-chromium/files/json_parser.cc872
-rw-r--r--www-client/ungoogled-chromium/files/json_parser.h269
-rw-r--r--www-client/ungoogled-chromium/files/json_parser_r1.cc872
-rw-r--r--www-client/ungoogled-chromium/files/json_parser_r2.cc872
-rw-r--r--www-client/ungoogled-chromium/files/perfetto-system-zlib.patch11
-rw-r--r--www-client/ungoogled-chromium/files/png_image_decoder.cc1587
-rw-r--r--www-client/ungoogled-chromium/files/png_image_decoder.h231
-rw-r--r--www-client/ungoogled-chromium/files/rust_static_library.gni74
-rw-r--r--www-client/ungoogled-chromium/metadata.xml2
-rw-r--r--www-client/ungoogled-chromium/ungoogled-chromium-147.0.7727.55_p1.ebuild2145
-rw-r--r--www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.178_p1.ebuild (renamed from www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.96_p1.ebuild)21
-rw-r--r--www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.215_p1.ebuild (renamed from www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.167_p1.ebuild)25
-rw-r--r--www-client/vimb/metadata.xml2
-rw-r--r--www-client/vivaldi-snapshot/Manifest8
-rw-r--r--www-client/vivaldi-snapshot/metadata.xml2
-rw-r--r--www-client/vivaldi-snapshot/vivaldi-snapshot-8.0.4033.32.ebuild (renamed from www-client/vivaldi-snapshot/vivaldi-snapshot-7.10.4031.3.ebuild)0
-rw-r--r--www-client/vivaldi-snapshot/vivaldi-snapshot-8.1.4057.3.ebuild (renamed from www-client/vivaldi-snapshot/vivaldi-snapshot-8.0.4033.7.ebuild)0
-rw-r--r--www-client/vivaldi/Manifest8
-rw-r--r--www-client/vivaldi/metadata.xml2
-rw-r--r--www-client/vivaldi/vivaldi-8.0.4033.34.ebuild (renamed from www-client/vivaldi/vivaldi-7.9.3970.60.ebuild)2
-rw-r--r--www-client/vivaldi/vivaldi-8.0.4033.35.ebuild (renamed from www-client/vivaldi/vivaldi-7.9.3970.64.ebuild)2
-rw-r--r--www-client/w3m/metadata.xml2
-rw-r--r--www-client/waterfox-bin/Manifest2
-rw-r--r--www-client/waterfox-bin/metadata.xml2
-rw-r--r--www-client/waterfox-bin/waterfox-bin-6.6.13.ebuild (renamed from www-client/waterfox-bin/waterfox-bin-6.6.12.ebuild)0
-rw-r--r--www-client/yandex-browser/metadata.xml2
-rw-r--r--www-client/zen-bin/Manifest8
-rw-r--r--www-client/zen-bin/metadata.xml2
-rw-r--r--www-client/zen-bin/zen-bin-1.19.13b.ebuild (renamed from www-client/zen-bin/zen-bin-1.19.12b.ebuild)0
-rw-r--r--www-client/zen-bin/zen-bin-1.20.1b.ebuild (renamed from www-client/zen-bin/zen-bin-1.18.10b.ebuild)2
185 files changed, 16169 insertions, 12127 deletions
diff --git a/www-client/badwolf/metadata.xml b/www-client/badwolf/metadata.xml
index cb14acc7d1de..ec541e280d57 100644
--- a/www-client/badwolf/metadata.xml
+++ b/www-client/badwolf/metadata.xml
@@ -11,5 +11,5 @@
usable (security=usability^(-1) being false).
</longdescription>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/browsh/metadata.xml b/www-client/browsh/metadata.xml
index f24297ff2cb0..aaf4448f2ce6 100644
--- a/www-client/browsh/metadata.xml
+++ b/www-client/browsh/metadata.xml
@@ -12,5 +12,5 @@
</maintainer>
<bugs-to>https://github.com/browsh-org/browsh/issues</bugs-to>
</upstream>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/chawan/Manifest b/www-client/chawan/Manifest
index 629be9fdf518..413ed01aa0d9 100644
--- a/www-client/chawan/Manifest
+++ b/www-client/chawan/Manifest
@@ -1 +1,2 @@
DIST chawan-0.3.3.tar.gz 3642240 BLAKE2B 96000797713b305e0ef49c83548e0bc046f1a038e63b11ae8ada9e321f9cb1a9a85d4aec0902e5c433ecf9735428fc619502fd78f4892b22764ab8c500c68510 SHA512 56042cc71e6ee33439932b4c9caefc4169c21b5a5ef7268eae922de0e58d11be03aa70d701b1f84af32204fce33abae87975c4167a4b2cce33ab1ce55c5a01ee
+DIST chawan-0.4.0.tar.gz 3694715 BLAKE2B 9079632b99292b3a0827349ba9fe3932ef55d785658d1527806c60317fea86770a3b16201133d6bafe0075170760bdf760d2e1210268f996eff30aaa41c35ecb SHA512 095d1167f13cb756a8c885accf27eb2623f4590f4daced9cbe2a1812b89193a04dd5b3111073d8e1abe9756015e4e7fcdc9bd0679aef3d14ecad75d7dacbb49a
diff --git a/www-client/chawan/chawan-0.3.3.ebuild b/www-client/chawan/chawan-0.3.3.ebuild
index 623a0913e6f0..0bed1cef895c 100644
--- a/www-client/chawan/chawan-0.3.3.ebuild
+++ b/www-client/chawan/chawan-0.3.3.ebuild
@@ -3,6 +3,8 @@
EAPI=8
+inherit toolchain-funcs multiprocessing
+
DESCRIPTION="TUI web browser; supports CSS, images, JavaScript, and multiple web protocols"
HOMEPAGE="https://chawan.net"
@@ -27,10 +29,10 @@ DEPEND="
net-libs/libssh2
"
BDEPEND="
- ${DEPEND}
dev-lang/nim
virtual/pkgconfig
"
+RDEPEND="${DEPEND}"
PATCHES=(
"${FILESDIR}/makefile-0.3.3.patch"
@@ -43,3 +45,28 @@ src_prepare(){
die "Trying to sed the Makefile for lto failed!"
fi
}
+
+src_configure(){
+ # code is mostly copy pasted from the nim_gen_config() function from nim-utils.eclass, modifed a bit to actually
+ # append to the original nim.cfg, instead of replacing it
+ cat >> "${S}"/nim.cfg <<- EOF || die "Failed to append to Nim config"
+ --parallelBuild:"$(makeopts_jobs)"
+
+ cc:"gcc"
+ gcc.exe:"$(tc-getCC)"
+ gcc.linkerexe:"$(tc-getCC)"
+ gcc.cpp.exe:"$(tc-getCXX)"
+ gcc.cpp.linkerexe:"$(tc-getCXX)"
+ gcc.options.speed:"${CFLAGS}"
+ gcc.options.size:"${CFLAGS}"
+ gcc.options.debug:"${CFLAGS}"
+ gcc.options.always:"${CPPFLAGS}"
+ gcc.options.linker:"${LDFLAGS}"
+ gcc.cpp.options.speed:"${CXXFLAGS}"
+ gcc.cpp.options.size:"${CXXFLAGS}"
+ gcc.cpp.options.debug:"${CXXFLAGS}"
+ gcc.cpp.options.always:"${CPPFLAGS}"
+ gcc.cpp.options.linker:"${LDFLAGS}"
+ EOF
+ default
+}
diff --git a/www-client/chawan/chawan-0.4.0.ebuild b/www-client/chawan/chawan-0.4.0.ebuild
new file mode 100644
index 000000000000..81cd3402eaae
--- /dev/null
+++ b/www-client/chawan/chawan-0.4.0.ebuild
@@ -0,0 +1,72 @@
+# Copyright 2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit toolchain-funcs multiprocessing
+
+DESCRIPTION="TUI web browser; supports CSS, images, JavaScript, and multiple web protocols"
+HOMEPAGE="https://chawan.net"
+
+if [[ "${PV}" == 9999 ]]; then
+ inherit git-r3
+ EGIT_REPO_URI="https://git.sr.ht/~bptato/${PN}"
+else
+ SRC_URI="https://git.sr.ht/~bptato/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz"
+ S="${WORKDIR}/${PN}-v${PV}"
+ KEYWORDS="~amd64"
+fi
+
+LICENSE="Unlicense"
+
+SLOT="0"
+
+IUSE="lto"
+
+DEPEND="
+ app-arch/brotli
+ dev-libs/openssl
+ net-libs/libssh2
+"
+BDEPEND="
+ dev-lang/nim
+ virtual/pkgconfig
+"
+RDEPEND="${DEPEND}"
+
+PATCHES=(
+ "${FILESDIR}/makefile-491b4231.patch"
+)
+
+src_prepare(){
+ default
+ if use lto; then
+ sed -i -E 's|^FLAGS\s+\+=.+|& -d:lto|' Makefile ||
+ die "Trying to sed the Makefile for lto failed!"
+ fi
+}
+
+src_configure(){
+ # code is mostly copy pasted from the nim_gen_config() function from nim-utils.eclass, modifed a bit to actually
+ # append to the original nim.cfg, instead of replacing it
+ cat >> "${S}"/nim.cfg <<- EOF || die "Failed to append to Nim config"
+ --parallelBuild:"$(makeopts_jobs)"
+
+ cc:"gcc"
+ gcc.exe:"$(tc-getCC)"
+ gcc.linkerexe:"$(tc-getCC)"
+ gcc.cpp.exe:"$(tc-getCXX)"
+ gcc.cpp.linkerexe:"$(tc-getCXX)"
+ gcc.options.speed:"${CFLAGS}"
+ gcc.options.size:"${CFLAGS}"
+ gcc.options.debug:"${CFLAGS}"
+ gcc.options.always:"${CPPFLAGS}"
+ gcc.options.linker:"${LDFLAGS}"
+ gcc.cpp.options.speed:"${CXXFLAGS}"
+ gcc.cpp.options.size:"${CXXFLAGS}"
+ gcc.cpp.options.debug:"${CXXFLAGS}"
+ gcc.cpp.options.always:"${CPPFLAGS}"
+ gcc.cpp.options.linker:"${LDFLAGS}"
+ EOF
+ default
+}
diff --git a/www-client/chawan/chawan-9999.ebuild b/www-client/chawan/chawan-9999.ebuild
index 9d560f0a0deb..81cd3402eaae 100644
--- a/www-client/chawan/chawan-9999.ebuild
+++ b/www-client/chawan/chawan-9999.ebuild
@@ -3,6 +3,8 @@
EAPI=8
+inherit toolchain-funcs multiprocessing
+
DESCRIPTION="TUI web browser; supports CSS, images, JavaScript, and multiple web protocols"
HOMEPAGE="https://chawan.net"
@@ -27,10 +29,10 @@ DEPEND="
net-libs/libssh2
"
BDEPEND="
- ${DEPEND}
dev-lang/nim
virtual/pkgconfig
"
+RDEPEND="${DEPEND}"
PATCHES=(
"${FILESDIR}/makefile-491b4231.patch"
@@ -43,3 +45,28 @@ src_prepare(){
die "Trying to sed the Makefile for lto failed!"
fi
}
+
+src_configure(){
+ # code is mostly copy pasted from the nim_gen_config() function from nim-utils.eclass, modifed a bit to actually
+ # append to the original nim.cfg, instead of replacing it
+ cat >> "${S}"/nim.cfg <<- EOF || die "Failed to append to Nim config"
+ --parallelBuild:"$(makeopts_jobs)"
+
+ cc:"gcc"
+ gcc.exe:"$(tc-getCC)"
+ gcc.linkerexe:"$(tc-getCC)"
+ gcc.cpp.exe:"$(tc-getCXX)"
+ gcc.cpp.linkerexe:"$(tc-getCXX)"
+ gcc.options.speed:"${CFLAGS}"
+ gcc.options.size:"${CFLAGS}"
+ gcc.options.debug:"${CFLAGS}"
+ gcc.options.always:"${CPPFLAGS}"
+ gcc.options.linker:"${LDFLAGS}"
+ gcc.cpp.options.speed:"${CXXFLAGS}"
+ gcc.cpp.options.size:"${CXXFLAGS}"
+ gcc.cpp.options.debug:"${CXXFLAGS}"
+ gcc.cpp.options.always:"${CPPFLAGS}"
+ gcc.cpp.options.linker:"${LDFLAGS}"
+ EOF
+ default
+}
diff --git a/www-client/chawan/metadata.xml b/www-client/chawan/metadata.xml
index 7c57de81f09e..9e83d582ddb2 100644
--- a/www-client/chawan/metadata.xml
+++ b/www-client/chawan/metadata.xml
@@ -13,5 +13,5 @@
Gemini, Finger, Spartan, and user defined protocols
</longdescription>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/chromium-common/metadata.xml b/www-client/chromium-common/metadata.xml
index 0f5e4a2657ad..5c3c3fb5fc2a 100644
--- a/www-client/chromium-common/metadata.xml
+++ b/www-client/chromium-common/metadata.xml
@@ -10,6 +10,6 @@
<name>Matt Jolly</name>
</maintainer>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
<stabilize-allarches/>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/chromium/Manifest b/www-client/chromium/Manifest
index db9bc2722067..e7b6366dd375 100644
--- a/www-client/chromium/Manifest
+++ b/www-client/chromium/Manifest
@@ -1,8 +1,12 @@
DIST chromium-146.0.7680.177-linux.tar.xz 1476867376 BLAKE2B e446db0f0921f5c1dd05fa6250dd15af950b83ad1e86a930f11839eced6581080b21105f66184a08620c3fa7e9bac53a422195c054b026b4315801482e1ebd75 SHA512 1859630a05a004d69e27a024e2f8a8c3e5ac16a0c889cf2f1571e1960dfebf0a53a3e49564568c87d1d335342bb9a09f1481d303d3e53cdd77349aff0a551c0c
DIST chromium-148.0.7778.167-linux.tar.xz 1592280992 BLAKE2B 19734b03687d7c1c4ecab855f989fdd120e0ded609789adce15e5dc7150608c0c009aa60b7b160cc62f1764bf9b28b5e7f878bde3e9c5580a89b5d88f114c505 SHA512 26c086f5f0693d86e8b14d4d9b14ac8a665118030f82530233ac2a64bcb4e43e61494f36d8aa4de1210d9b43db53aaea9a0ca8e4826e6ee66e665632ee5b5c1c
-DIST chromium-149.0.7815.2-linux.tar.xz 1608143844 BLAKE2B 9164a849627b78611181ee0d00f31f964a5dc3815d010821eb27a65b0ed14b83baa454da0b28c9d9ea8d3711b3cdd3714bb53fe33cd16689d9e92fcb5338053c SHA512 74b052cb8f1ef4dbd4ca86fcea1b606d1817254c06ab97f8f80eb6540ec03600d75a9ae01407b00d6284b2f4209a9e6ead7489aba82242cca3f440df1d5d13b6
+DIST chromium-148.0.7778.178-linux.tar.xz 1592152904 BLAKE2B 8d25be51cab30f196044a8e8da1e65afd025261bd316d0d8f9b8047fe2c0ac72ad8431bc9ca2d637488665a7a44565f6718073a2823fafa20ae1698a44045b84 SHA512 82ff2b4bf9a573cec83ec2e12edd2f1b576dd42ac38c0ac226e751c058c5b5c6afadafffb7d5dac00ac599317d22be8309d68cef2d9a976142ed8a0f1fc7ff2a
+DIST chromium-148.0.7778.215-linux.tar.xz 1593166200 BLAKE2B da7ba3258bd15cdd02ce8c30571e8dcca25d9093e7daefc64ef662b445384b93c6acd548f12561cad9f0fc06b249fdda9e9cfab887cd708d63cef97e6436a961 SHA512 09f381d2b69c5a377ab421727e084857680210754051e922a9d96ba486323f877130f4ae289c408ca0af15f3ba1d4cbcdb02877016c085c81ad35254787e9fbd
DIST chromium-149.0.7827.14-linux.tar.xz 1610554456 BLAKE2B 16eda06a6573cf7c499cf3e70fc3c0dd7dece06aabbfd5115e3cb0b3d7eced94216ef4ec4442b018f85494dc7ed2ce178c584ce869fee5e1e5e443e3c3735b64 SHA512 107a733e3b7fd8dd6b0f37dc524c15bd5a120d8498de3b375edebf93562f014356f71137bc43b54f6c6a1419631395755ba230710f4d4382ee68bef99b075a38
-DIST chromium-clang-llvmorg-23-init-10931-g20b6ec66-2.tar.xz 69658116 BLAKE2B 81687f891c250c59c67c085f63a243533f212263af3f92849104819b77db9d9c0dc9cf6149e684b8d7228ae21cc6226a3f14ef17868850761ec27bf1c9a83ffc SHA512 2eec3745457e5c008b8a703f081e9e7f6c8e62dfb88a0f9cfbe17468d9f2026c8c68136d273599a8fe98255560a89740cf713f19ad684e11404f0e2f635091bb
+DIST chromium-149.0.7827.22-linux.tar.xz 1610762772 BLAKE2B d8887f8952d4530ebf9c0c2b87fea34672d1b55a6ffd7ec53bc9b91a88a42a36324cc9f590c58ed84bbd924b2b564c622aa3bc48b38f077d47a3084504d572e0 SHA512 f99d8596bddfe116fe8560d49aabda8500270d52e9b3fa4d52fe1c72993e3a368bfa9419e1f0ad179a181eab2e77de109d9b43926bb7d5bf6d5b3d0ef7cf8a71
+DIST chromium-149.0.7827.53-linux.tar.xz 1611305116 BLAKE2B 72018ef444c4769234e13dab7cbe0d2abd03d140631d7ba3cf0dcd4b6fa87f777cb8bbfa6b8100de2166f991f4557197545cac090a9935ddf6ec0f988610ad11 SHA512 36aa5854152d0c0ce338331be28c077aa2cf9edc45c608096368fbbdd84700df4d428daf67b7c76c36a3ff423ccd5b5f6518814bc87facce3d2da529e9dafafd
+DIST chromium-150.0.7846.4-linux.tar.xz 1657148168 BLAKE2B a7845c4524253ce4a72bebfcd7c3671e12cccbb069f265110b0d0b0f869eea478dd67196a20589acb3e60b225a6f96ca556a1a551b1444e6e558515b535ee73e SHA512 1ebc61e00dfe3f98ead057b4f91d21a6ec4bee15533bc6528bb51e7fa1d4232512483ec8b6df3a75c07d594b94001bf9d2882f0c05ba8207c8b9a74acc774784
+DIST chromium-clang-llvmorg-23-init-10931-g20b6ec66-11.tar.xz 69635068 BLAKE2B 5250889dac7ca048030266b9e5eb9b08a1288acb1023fff3513555ca361f787fdb273b04d5cb5cc9960d7d13e804604ca63e65b056d1873a8f5e1d56e8f59db8 SHA512 4a1f06bacfb5894e277f3957df3adcc937f262ec91927d6fd97a2e4b88b795e2559a8498be633d6b191dd4d52a5df52669f76c59c2939689f5f88fc7457cabae
DIST chromium-clang-llvmorg-23-init-10931-g20b6ec66-8.tar.xz 69605340 BLAKE2B 5ab6a03bfa76a8523d35c9f9541bc8aff2c33331208ffd2c729e6cd7e6d58e225d236ca8233893df57a52d4cefb0c62d79d61c8f902fbd909cdac8f148822fb8 SHA512 6e013faba35b624144535207c5c884d4675e4166f4eb212d2494c43dbb430b35030734d6f28fc087f5da79a8318531560529a0d0754a96d13e628eb5090de6b5
DIST chromium-clang-llvmorg-23-init-2224-g5bd8dadb-3.tar.xz 57583584 BLAKE2B 7fdfe36655b5fd1f865fb0d74d238c539431fc4abfa403646def47b8076d4d9642a7bc50c9a188bca117939164d46acadbcb6c2c762a39eb11826dc24fc47d70 SHA512 d6bc64fdd9d2f31f317a65d0e355d79b804267811e2026c0ed41699c049c5d90a90d56b15a2039a5c345eb1f11c2d6eef0e84f4665aee938ed36c7a0002ed5af
DIST chromium-clang-llvmorg-23-init-5669-g8a0be0bc-4.tar.xz 68803796 BLAKE2B 334d273c85a8e22dd7f6eec0f0591d54c5acdf85d01925511d0e912c611f5f07c448b3ff35925b4329307a601439dbabf54f5ee186f3b11d1229dc531e2a26af SHA512 570f00c716dd9d6f8ecc1d6364f735884e0485fba5d003bb45e8095cc60215107d11272702c387ce7273400a8c1679180ac5b51ec639e81fc73657aa55043903
@@ -11,10 +15,12 @@ DIST chromium-openpower-eeff222874.tar.bz2 438398 BLAKE2B 86ba3cf4fec44dab06a1d7
DIST chromium-patches-146-2.tar.bz2 18621 BLAKE2B d4c9ae6a2cfee50ea2d62cafeb19d8295a26fc7986ae11d5ed916736275720a066367bd3f4c381912aa43d219567ae83c4dbcc90c1cb6f096bd61b8283a3a4e2 SHA512 add724a848eb138a2f849b66528b3d2e4d5514b1171916cc8f4681a197eed3df5e4b45e9e1acd1e136f203d0f7d740f0badf6c5f72db7c56bbe39775f356b8d4
DIST chromium-patches-148-3.tar.bz2 20088 BLAKE2B 063146caf3fae4c4522e00c0abcbbd32652e4f401a81a6cfece043c36189a4177507ef9f44fc733e470d654e079e51e1ee3cd31604f55fd7625567406a228345 SHA512 769ada4905ad216ee1d6595d15dd88a9e2af432f820fc277d9483a5cb19357b15b5e9a94078a54b5c002afc6a7e7b1739f8d7d41893ea6d15f32e3df23555009
DIST chromium-patches-149-2.tar.bz2 21452 BLAKE2B b9f9ce66998eaa3ff7d23b1d1296ad4a7a984bed08b2031a6e9398e2f724280ca2b4bdd48ddb415cdb5e79f952545c8d322ef3d007f1e5f8303307e45704dd7a SHA512 a318ab70ee226519f02bc114343c4f9794569252f1a2857a71adefdcdd66c6de9ac1ef48ac25e71cef4cbea2c2a56aa537fde7f7142d48e9aedbf1b81c78d027
+DIST chromium-patches-150.tar.bz2 23353 BLAKE2B 91f57017f8a9124878e55ffb152ee40564106d1a48c79707942b4dfe15af0b62e896c8984601fcd5fabe1df9de372f8139cf7ec2ab0aae6d608b0a0a817bcc39 SHA512 c2967f8c21205fb07236689c0fbffea987e8458e6c07307cf46c2e7aa2113cc8c461b2effc1d0e50ca9b6f1dc14b6ff916000d47f7d7ab2529b6eafafd06ab1e
DIST chromium-patches-copium-b00f26bb5e.tar.gz 15099 BLAKE2B 886897afba6cb4495ab74298d8ae72643294dba1996a5a7d2939f83fb4af1cb599f7e4cd263b852fe595cf52e0a3689305d6a3c028014f9c4172df7deaf3e2dd SHA512 c337bcb6487252fa679b5910672230677aba87fa7572ecbfea32b369785326e12f06fd3d44c65f16fe32c1e83b5b8e710e81c970cdf03f24f25a68577f6984b9
DIST chromium-patches-copium-fe1caafa06.tar.gz 15572 BLAKE2B 4baa36a4536f9199caa89553fc10deac79ae7effa336fc4bd92fac59eb81a57749eead426e6f01ffecd9954b417eb34c29c899cc49a9d726fe65bf2e303712a0 SHA512 5310e48743a32f2f998b34138b1ed9667feed873ad16c18d3e495383f44a0d5df0f9634c7c4275cf1839002ae887ef58f6c3ec5fd9c5d46ad5114ffab439a664
DIST chromium-profiler-0.2.tar 259952640 BLAKE2B 5e82389fce00b267280d633b26551231c558b80f0c92cd7d60271095a3503365ab673e7a46dc5f74f8a82db1f21262cb24dcc0531d954bab5fb3b175dab3394d SHA512 9fa89a5ab728419683e7495ae676567480987d68a2d589f2aa97bfcbcf123f3c8f97f8bca5f65e5e3f6e41475535add473ded83b9c7a33bb4746a9d05b298a6c
DIST chromium-rust-toolchain-4c4205163a-2-llvmorg-23-init-10931-g20b6ec66.tar.xz 274625900 BLAKE2B dc3851eb65570795fd789abe5135291cbfeb1fbf9df2c9c9fa3d61b6e3fb0daeb90b43f18c733e28e60bc138391fa9bb028ad3e5b5a4d5acad6addaeef8abdd4 SHA512 6894b2abc7d0e56784485d600d87a1adb373fdf25001c3be2a05d455584b7648ac458938fa84c9f5db4e8bac4c320e8e162b15e05dd8252c1749962a7f5c5e6e
+DIST chromium-rust-toolchain-4c4205163a-3-llvmorg-23-init-10931-g20b6ec66.tar.xz 274604036 BLAKE2B d6359a447599a8f7ab8c74d933c05c552e13f30063be3207f1dbdcd8b6d801fa322517ec9a4ce99dd2b943d823a767c9f8e890bb49a8ce37c2e741bbf6a20568 SHA512 6d3b050dc9f715ebd05bfd3d2506ce48df0c82082ceddb505fcd8388ba54aa990edfe08b295f309bdbb51accba82627ab68de8d2cfdf45fdf79a3df8a8ba0255
DIST chromium-rust-toolchain-6f54d591c3-7-llvmorg-23-init-5669-g8a0be0bc.tar.xz 271641712 BLAKE2B 7436b7243fbdd2c46b6dd0d9e16a6727718bfdc1870df86395229f3f6420e6109d5e5b881b21c48e2e1434844e4d7a6080bf36c2877a60e0f61f3baa9b803389 SHA512 420122a3b4fd984a848d47aed7cd04c3fb9bbdc5e0413c94165a6dc091713ca5f2dfd78dc238357ce05ea547bdd8a36d116f106bd4d94a54e358f0e93c7a6028
DIST chromium-rust-toolchain-7d8ebe3128-3-llvmorg-23-init-2224-g5bd8dadb.tar.xz 266591660 BLAKE2B 1a95ed8da4070f4b69f7b166e4d2fbce9eb938eddfa5b74bd47a68e0ac3990d6925a4b4a18f18e3e3e990e698489104112583bc20eb86b9a6ca089541b0df01f SHA512 40193a790129c6158fa565a447580c8d1bd8147519a8573b47cfb7efc16f51ba8355a2322e6009648ae35b732139b6bc244a775f1990e14db012710994a78dcf
DIST chromium-testfonts-9c07d19d9c.tar.gz 33413117 BLAKE2B 95cb79288de5697b6de2a6f503f81bcfb7687ea1af0bd0e6db8cfc09af7cdaedd9a83f36dd9d0a3ac19dfca8ac7a6c3a891922a192db012688565c06da8a9cf8 SHA512 2d3602b7a924d2bb8d538882f13a05428e23bf16ea3a9cf07eb13801fe7f33261ce61f2e5dc12e5c6f61f21b392526024d1969e8a967cf1f5138c647b84025b6
diff --git a/www-client/chromium/chromium-146.0.7680.177.ebuild b/www-client/chromium/chromium-146.0.7680.177.ebuild
index b0cf1f2e2dc1..4f2d21316d05 100644
--- a/www-client/chromium/chromium-146.0.7680.177.ebuild
+++ b/www-client/chromium/chromium-146.0.7680.177.ebuild
@@ -40,7 +40,7 @@ CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu
sv sw ta te th tr uk ur vi zh-CN zh-TW"
LLVM_COMPAT=( 21 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..13} )
PYTHON_REQ_USE="xml(+)"
RUST_MIN_VER=1.91.0
RUST_NEEDS_LLVM="yes please"
diff --git a/www-client/chromium/chromium-148.0.7778.167.ebuild b/www-client/chromium/chromium-148.0.7778.167.ebuild
index 34a341e60ac6..f27d5299becc 100644
--- a/www-client/chromium/chromium-148.0.7778.167.ebuild
+++ b/www-client/chromium/chromium-148.0.7778.167.ebuild
@@ -39,7 +39,7 @@ CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu
sv sw ta te th tr uk ur vi zh-CN zh-TW"
LLVM_COMPAT=( 21 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..13} )
PYTHON_REQ_USE="xml(+)"
RUST_MIN_VER=1.91.0
RUST_NEEDS_LLVM="yes please"
diff --git a/www-client/chromium/chromium-148.0.7778.178.ebuild b/www-client/chromium/chromium-148.0.7778.178.ebuild
new file mode 100644
index 000000000000..f27d5299becc
--- /dev/null
+++ b/www-client/chromium/chromium-148.0.7778.178.ebuild
@@ -0,0 +1,1747 @@
+# Copyright 2009-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+# PACKAGING NOTES
+
+# Upstream roll their bundled Clang every two weeks, and the bundled Rust
+# is rolled regularly and depends on that. While we do our best to build
+# with system Clang, we may eventually hit the point where we need to use
+# the bundled Clang due to the use of prerelease features.
+
+# USE=bundled-toolchain is intended for users who want to use the same toolchain
+# as the upstream releases. It's also a good fallback in case we fall behind
+# and need to get a release out quickly (less likely with `dev` in-tree).
+# We can't rely on it as a default since the toolchain is only shipped for x86-64;
+# other architectures will need to use system toolchain.
+
+# Since m133 we are using CI-generated tarballs from
+# https://github.com/chromium-linux-tarballs/chromium-tarballs/
+
+# These are bit-for-bit identical to the official releases, but are built
+# using an external CI system that we have some control over, in case
+# issues pop up again with official tarball generation.
+
+GN_MIN_VER=0.2354
+# chromium-tools/get-chromium-toolchain-strings.py (or just use Chromicler)
+TEST_FONT="a28b222b79851716f8358d2800157d9ffe117b3545031ae51f69b7e1e1b9a969"
+BUNDLED_CLANG_VER="llvmorg-23-init-5669-g8a0be0bc-4"
+BUNDLED_RUST_VER="6f54d591c3116ee7f8ce9321ddeca286810cc142-7"
+RUST_SHORT_HASH=${BUNDLED_RUST_VER:0:10}-${BUNDLED_RUST_VER##*-}
+NODE_VER="24.12.0"
+ESBUILD_VER="0.25.1"
+ROLLUP_VER="4.57.1" # currently manual.
+VIRTUALX_REQUIRED="pgo"
+
+CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu he
+ hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr
+ sv sw ta te th tr uk ur vi zh-CN zh-TW"
+
+LLVM_COMPAT=( 21 )
+PYTHON_COMPAT=( python3_{11..13} )
+PYTHON_REQ_USE="xml(+)"
+RUST_MIN_VER=1.91.0
+RUST_NEEDS_LLVM="yes please"
+RUST_OPTIONAL="yes" # Not actually optional, but we don't need system Rust (or LLVM) with USE=bundled-toolchain
+RUST_REQ_USE="rustfmt" # Upstream run rustfmt on bindgen output, so we need it to be available.
+
+inherit check-reqs chromium-2 desktop flag-o-matic llvm-r1 multiprocessing ninja-utils pax-utils
+inherit python-any-r1 readme.gentoo-r1 rust systemd toolchain-funcs virtualx xdg-utils
+
+DESCRIPTION="Open-source version of Google Chrome web browser"
+HOMEPAGE="https://www.chromium.org/"
+PPC64_HASH="a85b64f07b489b8c6fdb13ecf79c16c56c560fc6"
+PATCH_V="${PV%%\.*}-3"
+COPIUM_COMMIT="fe1caafa06f27542c18a881348f78e984e2d9fe2"
+SRC_URI="https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/download/${PV}/chromium-${PV}-linux.tar.xz
+ https://deps.gentoo.zip/www-client/chromium/rollup-wasm-node-${ROLLUP_VER}.tgz
+ https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
+ !bundled-toolchain? (
+ https://codeberg.org/selfisekai/copium/archive/${COPIUM_COMMIT}.tar.gz
+ -> chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+ )
+ bundled-toolchain? (
+ https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-${BUNDLED_CLANG_VER}.tar.xz
+ -> chromium-clang-${BUNDLED_CLANG_VER}.tar.xz
+ https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/rust-toolchain-${BUNDLED_RUST_VER}-${BUNDLED_CLANG_VER%-*}.tar.xz
+ -> chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz
+ )
+ test? (
+ https://chromium-fonts.storage.googleapis.com/${TEST_FONT} -> chromium-testfonts-${TEST_FONT:0:10}.tar.gz
+ )
+ ppc64? (
+ https://gitlab.raptorengineering.com/raptor-engineering-public/chromium/openpower-patches/-/archive/${PPC64_HASH}/openpower-patches-${PPC64_HASH}.tar.bz2 -> chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+ )
+ pgo? ( https://github.com/elkablo/chromium-profiler/releases/download/v0.2/chromium-profiler-0.2.tar )"
+
+# https://gitweb.gentoo.org/proj/chromium-tools.git/tree/get-chromium-licences.py @ 145.0.7632.76
+LICENSE="Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD BSD-2 Base64 Boost-1.0 CC-BY-3.0 CC-BY-4.0 Clear-BSD FFT2D FTL"
+LICENSE+=" IJG ISC LGPL-2 LGPL-2.1 MIT MPL-1.1 MPL-2.0 Ms-PL PSF-2 SGI-B-2.0 SSLeay SunSoft Unicode-3.0"
+LICENSE+=" Unicode-DFS-2015 Unlicense UoI-NCSA ZLIB libtiff openssl"
+LICENSE+=" rar? ( unRAR )"
+
+SLOT="stable"
+# Unstable in gentoo exists mostly to give devs some breathing room for beta/stable releases.
+# It shouldn't be keyworded but adventurous users are encouraged to select it;
+# there's official dev channel Google Chrome after all.
+KEYWORDS="amd64 arm64"
+
+IUSE_SYSTEM_LIBS="+system-harfbuzz +system-icu +system-zstd"
+IUSE="+X ${IUSE_SYSTEM_LIBS} bindist bundled-toolchain cups debug ffmpeg-chromium gtk4 +hangouts headless kerberos +official pax-kernel pgo"
+IUSE+=" +proprietary-codecs pulseaudio qt6 +rar +screencast selinux test +vaapi +wayland +widevine cpu_flags_ppc_vsx3"
+RESTRICT="
+ !bindist? ( bindist )
+ !test? ( test )
+ arm64? ( test )" # Tests require CFI, which requires LTO, which is broken on arm64 with LLVM 21.
+
+REQUIRED_USE="
+ !headless? ( || ( X wayland ) )
+ pgo? ( X !wayland )
+ screencast? ( wayland )
+ ffmpeg-chromium? ( bindist proprietary-codecs )
+"
+
+COMMON_X_DEPEND="
+ x11-libs/libXcomposite:=
+ x11-libs/libXcursor:=
+ x11-libs/libXdamage:=
+ x11-libs/libXfixes:=
+ >=x11-libs/libXi-1.6.0:=
+ x11-libs/libXrandr:=
+ x11-libs/libXrender:=
+ x11-libs/libXtst:=
+ x11-libs/libxshmfence:=
+"
+
+# sys-libs/zlib: https://bugs.gentoo.org/930365; -ng is not compatible.
+# We _could_ use the bundled minizip, but that's against policy.
+COMMON_SNAPSHOT_DEPEND="
+ system-icu? ( >=dev-libs/icu-73.0:= )
+ >=dev-libs/libxml2-2.12.4:=[icu]
+ dev-libs/nspr:=
+ >=dev-libs/nss-3.26:=
+ dev-libs/libxslt:=
+ media-libs/fontconfig:=
+ >=media-libs/freetype-2.11.0-r1:=
+ system-harfbuzz? ( >=media-libs/harfbuzz-3:0=[icu(-)] )
+ media-libs/libjpeg-turbo:=
+ system-zstd? ( >=app-arch/zstd-1.5.5:= )
+ >=media-libs/libwebp-0.4.0:=
+ media-libs/mesa:=[gbm(+)]
+ >=media-libs/openh264-2.6.0:=
+ sys-libs/zlib:=
+ !headless? (
+ dev-libs/glib:2
+ >=media-libs/alsa-lib-1.0.19:=
+ pulseaudio? ( media-libs/libpulse:= )
+ sys-apps/pciutils:=
+ kerberos? ( virtual/krb5 )
+ vaapi? ( >=media-libs/libva-2.7:=[X?,wayland?] )
+ X? (
+ x11-base/xorg-proto:=
+ x11-libs/libX11:=
+ x11-libs/libxcb:=
+ x11-libs/libXext:=
+ )
+ x11-libs/libxkbcommon:=
+ wayland? (
+ dev-libs/libffi:=
+ dev-libs/wayland:=
+ screencast? ( media-video/pipewire:= )
+ )
+ )
+"
+
+COMMON_DEPEND="
+ ${COMMON_SNAPSHOT_DEPEND}
+ app-arch/bzip2:=
+ dev-libs/expat:=
+ net-misc/curl[ssl]
+ sys-apps/dbus:=
+ media-libs/flac:=
+ sys-libs/zlib:=[minizip]
+ !headless? (
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ media-libs/mesa:=[X?,wayland?]
+ virtual/udev
+ x11-libs/cairo:=
+ x11-libs/gdk-pixbuf:2
+ x11-libs/pango:=
+ cups? ( >=net-print/cups-1.3.11:= )
+ qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ X? ( ${COMMON_X_DEPEND} )
+ )
+"
+RDEPEND="${COMMON_DEPEND}
+ !www-client/chromium:0
+ >=www-client/chromium-common-2
+ !headless? (
+ || (
+ x11-libs/gtk+:3[X?,wayland?]
+ gui-libs/gtk:4[X?,wayland?]
+ )
+ qt6? ( dev-qt/qtbase:6[X?,wayland?] )
+ )
+ virtual/ttf-fonts
+ selinux? ( sec-policy/selinux-chromium )
+ bindist? (
+ !ffmpeg-chromium? ( >=media-video/ffmpeg-6.1-r1:0/58.60.60[chromium] )
+ ffmpeg-chromium? ( media-video/ffmpeg-chromium:${PV%%\.*} )
+ )
+"
+DEPEND="${COMMON_DEPEND}
+ !headless? (
+ gtk4? ( gui-libs/gtk:4[X?,wayland?] )
+ !gtk4? ( x11-libs/gtk+:3[X?,wayland?] )
+ )
+"
+
+BDEPEND="
+ ${COMMON_SNAPSHOT_DEPEND}
+ ${PYTHON_DEPS}
+ $(python_gen_any_dep '
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ ')
+ >=app-arch/gzip-1.7
+ !headless? (
+ qt6? ( dev-qt/qtbase:6 )
+ )
+ !bundled-toolchain? ( $(llvm_gen_dep '
+ llvm-core/clang:${LLVM_SLOT}
+ llvm-core/llvm:${LLVM_SLOT}
+ llvm-core/lld:${LLVM_SLOT}
+ official? (
+ !ppc64? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[cfi] )
+ ) ')
+ ${RUST_DEPEND}
+ )
+ pgo? (
+ >=dev-python/selenium-3.141.0
+ >=dev-util/web_page_replay_go-20220314
+ )
+ >=dev-util/bindgen-0.72.1
+ >=dev-build/gn-${GN_MIN_VER}
+ app-alternatives/ninja
+ dev-lang/perl
+ >=dev-util/gperf-3.2
+ dev-util/esbuild:${ESBUILD_VER}
+ dev-vcs/git
+ >=net-libs/nodejs-${NODE_VER}[inspector]
+ sys-apps/hwdata
+ >=sys-devel/bison-2.4.3
+ sys-devel/flex
+ virtual/pkgconfig
+ x11-misc/xdg-utils
+"
+
+if ! has chromium_pkg_die ${EBUILD_DEATH_HOOKS}; then
+ EBUILD_DEATH_HOOKS+=" chromium_pkg_die";
+fi
+
+DISABLE_AUTOFORMATTING="yes"
+DOC_CONTENTS="
+Some web pages may require additional fonts to display properly.
+Try installing some of the following packages if some characters
+are not displayed properly:
+- media-fonts/arphicfonts
+- media-fonts/droid
+- media-fonts/ipamonafont
+- media-fonts/noto
+- media-fonts/ja-ipafonts
+- media-fonts/takao-fonts
+- media-fonts/wqy-microhei
+- media-fonts/wqy-zenhei
+
+To fix broken icons on the Downloads page, you should install an icon
+theme that covers the appropriate MIME types, and configure this as your
+GTK+ icon theme.
+
+For native file dialogs in KDE, install kde-apps/kdialog.
+
+To make password storage work with your desktop environment you may
+have install one of the supported credentials management applications:
+- app-crypt/libsecret (GNOME)
+- kde-frameworks/kwallet (KDE)
+If you have one of above packages installed, but don't want to use
+them in Chromium, then add --password-store=basic to CHROMIUM_FLAGS
+in /etc/chromium/default.
+"
+
+python_check_deps() {
+ python_has_version "dev-python/setuptools[${PYTHON_USEDEP}]"
+}
+
+pre_build_checks() {
+ # Check build requirements: bugs #471810, #541816, #914220
+ # We're going to start doing maths here on the size of an unpacked source tarball,
+ # this should make updates easier as chromium continues to balloon in size.
+ # xz -l /var/cache/distfiles/chromium-${PV}*.tar.xz
+ local base_disk=9 # Round up
+ use test && base_disk=$((base_disk + 5))
+ local extra_disk=1 # Always include a little extra space
+ local memory=4
+ tc-is-cross-compiler && extra_disk=$((extra_disk * 2))
+ if tc-is-lto || use pgo; then
+ memory=$((memory * 2 + 1))
+ tc-is-cross-compiler && extra_disk=$((extra_disk * 2)) # Double the requirements
+ use pgo && extra_disk=$((extra_disk + 4))
+ fi
+ if is-flagq '-g?(gdb)?([1-9])'; then
+ if use custom-cflags; then
+ extra_disk=$((extra_disk + 5))
+ fi
+ memory=$((memory * 2))
+ fi
+ local CHECKREQS_MEMORY="${memory}G"
+ local CHECKREQS_DISK_BUILD="$((base_disk + extra_disk))G"
+ check-reqs_${EBUILD_PHASE_FUNC}
+}
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]]; then
+ # The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+ pre_build_checks
+ fi
+
+ if use headless; then
+ local headless_unused_flags=("cups" "kerberos" "pulseaudio" "qt6" "vaapi" "wayland")
+ for myiuse in ${headless_unused_flags[@]}; do
+ use ${myiuse} && ewarn "Ignoring USE=${myiuse}, USE=headless is set."
+ done
+ fi
+
+ if ! use bindist && use ffmpeg-chromium; then
+ ewarn "Ignoring USE=ffmpeg-chromium, USE=bindist is not set."
+ fi
+}
+
+pkg_setup() {
+ if [[ ${MERGE_TYPE} != binary ]]; then
+ # The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+ pre_build_checks
+
+ # We haven't massaged any CFLAGS yet, so we want to do this before we force CC/CXX to prevent warnings.
+ local want_lto="false"
+ tc-is-lto && want_lto="true"
+
+ # The linux:unbundle toolchain in GN grabs CC, CXX, CPP (etc) from the environment
+ # We'll set these to clang here then use llvm-utils functions to very explicitly set these
+ # to a sane value.
+ # This is effectively the 'force-clang' path if GCC support is re-added.
+ if use !bundled-toolchain; then
+ llvm-r1_pkg_setup
+ rust_pkg_setup
+
+ # Forcing clang; respect llvm_slot_x to enable selection of impl via LLVM_COMPAT
+ AR=llvm-ar
+ CPP="${CHOST}-clang++-${LLVM_SLOT} -E"
+ NM=llvm-nm
+ CC="${CHOST}-clang-${LLVM_SLOT}"
+ CXX="${CHOST}-clang++-${LLVM_SLOT}"
+ fi
+
+ use_lto="false"
+ local lto_usable="true"
+ if [[ "$want_lto" == "true" ]]; then
+ if use arm64 && [[ "${LLVM_SLOT}" -lt 22 ]]; then
+ einfo "LTO is broken with LLVM 21 on arm64, ignoring CFLAGS."
+ lto_usable="false"
+ else
+ use_lto="true"
+ fi
+ # We can rely on GN to do this for us; without this builds
+ # take significantly longer with LTO enabled.
+ filter-lto
+ fi
+
+ if [[ "$use_lto" == "false" ]] && use official && [[ "$lto_usable" == "true" ]]; then
+ einfo "USE=official selected and LTO not detected."
+ einfo "It is _highly_ recommended that LTO be enabled for performance reasons"
+ einfo "and to be consistent with the upstream \"official\" build optimisations."
+ fi
+
+ if [[ "$use_lto" == "false" ]] && use test; then
+ die "Tests require CFI which requires LTO"
+ fi
+
+ export use_lto
+
+ # 936858
+ if tc-ld-is-mold; then
+ eerror "Your toolchain is using the mold linker."
+ eerror "This is not supported by Chromium."
+ die "Please switch to a different linker."
+ fi
+
+ if tc-is-cross-compiler; then
+ use pgo && die "The pgo USE flag cannot be used when cross-compiling"
+ CPP="${CBUILD}-clang++-${LLVM_SLOT} -E"
+ fi
+
+ # I hate doing this but upstream Rust have yet to come up with a better solution for
+ # us poor packagers. Required for Split LTO units, which are required for CFI.
+ export RUSTC_BOOTSTRAP=1
+
+ # Sanity checks for development convenience
+ if ver_test $(gn --version || die) -lt ${GN_MIN_VER}; then
+ die "dev-build/gn >= ${GN_MIN_VER} is required to build this Chromium"
+ fi
+
+ # Sometimes, when adding a new LLVM slot, devs (me) forget to install an appropriate lld.
+ local lld_ver=$(ld.lld --version | awk '{split($2,a,"."); print a[1]}' || die "Failed to check lld version")
+ if [[ ${lld_ver} -lt ${LLVM_SLOT} ]]; then
+ die "Your lld version (${lld_ver}) is too old for the selected LLVM slot (${LLVM_SLOT}). Please install a newer lld or select an older LLVM slot."
+ fi
+ fi
+
+ chromium_suid_sandbox_check_kernel_config
+}
+
+src_unpack() {
+ unpack ${P}-linux.tar.xz
+ unpack chromium-patches-${PATCH_V}.tar.bz2
+ # These should only be required when we're not using the official toolchain
+ if use !bundled-toolchain; then
+ unpack chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+ fi
+
+ use pgo && unpack chromium-profiler-0.2.tar
+
+ if use test; then
+ # This just contains a bunch of font files that need to be unpacked (or moved) to the correct location.
+ local testfonts_dir="${WORKDIR}/${P}/third_party/test_fonts/test_fonts"
+ local testfonts_tar="${DISTDIR}/chromium-testfonts-${TEST_FONT:0:10}.tar.gz"
+ einfo "Unpacking test fonts ..."
+ tar xf "${testfonts_tar}" -C "${testfonts_dir}" || die "Failed to unpack testfonts"
+ fi
+
+ # We need to manually unpack this since M126 else we'd unpack one toolchain over the other.
+ # Since we're doing that anyway let's unpack to sensible locations to make symlink creation easier.
+ if use bundled-toolchain; then
+ einfo "Unpacking bundled Clang ..."
+ mkdir -p "${WORKDIR}"/clang || die "Failed to create clang directory"
+ tar xf "${DISTDIR}/chromium-clang-${BUNDLED_CLANG_VER}.tar.xz" -C "${WORKDIR}/clang" || die "Failed to unpack Clang"
+ einfo "Unpacking bundled Rust ..."
+ local rust_dir="${WORKDIR}/rust-toolchain"
+ mkdir -p "${rust_dir}" || die "Failed to create rust toolchain directory"
+ tar xf "${DISTDIR}/chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz" -C "${rust_dir}" ||
+ die "Failed to unpack Rust"
+ fi
+
+ if use ppc64; then
+ unpack chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+ fi
+
+ # This is a dirty hack, but we need rollup to build successfully and it's proving to be challenging
+ # to build locally due to deps
+ unpack rollup-wasm-node-${ROLLUP_VER}.tgz
+}
+
+remove_compiler_builtins() {
+ # We can't use the bundled compiler builtins with the system toolchain
+ # We used to `grep` then `sed`, but it was indirect. Combining the two into a single
+ # `awk` command is more efficient and lets us document the logic more clearly.
+
+ local pattern=' configs += [ "//build/config/clang:compiler_builtins" ]'
+ local target='build/config/compiler/BUILD.gn'
+
+ local tmpfile
+ tmpfile=$(mktemp) || die "Failed to create temporary file."
+
+ if awk -v pat="${pattern}" '
+ BEGIN {
+ match_found = 0
+ }
+
+ # If the delete countdown is active, decrement it and skip to the next line.
+ d > 0 { d--; next }
+
+ # If the current line matches the pattern...
+ $0 == pat {
+ match_found = 1 # ...set our flag to true.
+ d = 2 # Set delete counter for this line and the next two.
+ prev = "" # Clear the buffered previous line so it is not printed.
+ next
+ }
+
+ # For any other line, print the buffered previous line.
+ NR > 1 { print prev }
+
+ # Buffer the current line to be printed on the next cycle.
+ { prev = $0 }
+
+ END {
+ # Print the last line if it was not part of a deleted block.
+ if (d == 0) { print prev }
+
+ # If the pattern was never found, exit with a failure code.
+ if (match_found == 0) {
+ exit 1
+ }
+ }
+ ' "${target}" > "${tmpfile}"; then
+ # AWK SUCCEEDED (exit code 0): The pattern was found and edited.
+ # This is to avoid gawk's `-i inplace` option which users complain about.
+ mv "${tmpfile}" "${target}"
+ else
+ # AWK FAILED (exit code 1): The pattern was not found.
+ rm -f "${tmpfile}"
+ die "Awk patch failed: Pattern not found in ${target}."
+ fi
+}
+
+src_prepare() {
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # We'll fill this in as we go. Patches go in chromium-patches.
+ local PATCHES=()
+
+ PATCHES+=( "${WORKDIR}/chromium-patches-${PATCH_V}/common/" )
+
+ # https://issues.chromium.org/issues/442698344
+ # Unreleased fontconfig changed magic numbers and google have rolled to this version
+ if has_version "<=media-libs/fontconfig-2.17.1"; then
+ PATCHES+=( "${FILESDIR}/chromium-142-work-with-old-fontconfig.patch" )
+ fi
+
+ if use bundled-toolchain; then
+ # We need to symlink the toolchain into the expected location
+ einfo "Symlinking Clang toolchain to expected location ..."
+ mkdir -p third_party/llvm-build/ || die "Failed to create llvm-build directory"
+ # the 'Chromium Linux Tarballs' seem to already have 'Release+Asserts/{lib,bin}'; not sure if this is an
+ # upstream change - we're using the same scripts to build, theoretically. We'll still attempt to create
+ # llvm-build, but we'll rm Release+Asserts and symlink directly.
+ if [[ -d third_party/llvm-build/Release+Asserts ]]; then
+ rm -r third_party/llvm-build/Release+Asserts || die "Failed to remove third_party/llvm-build/Release+Asserts"
+ fi
+ ln -s "${WORKDIR}"/clang third_party/llvm-build/Release+Asserts || die "Failed to bundle Clang"
+ einfo "Symlinking Rust toolchain to expected location ..."
+ # As above, so below
+ if [[ -d third_party/rust-toolchain ]]; then
+ rm -r third_party/rust-toolchain || die "Failed to remove third_party/rust-toolchain"
+ fi
+ ln -s "${WORKDIR}"/rust-toolchain third_party/rust-toolchain || die "Failed to bundle rust"
+ cp "${WORKDIR}"/rust-toolchain/VERSION \
+ "${WORKDIR}"/rust-toolchain/INSTALLED_VERSION || die "Failed to set rust version"
+ else
+ # We don't need our toolchain patches if we're using the official toolchain
+
+ # Copium patches go here.
+ PATCHES+=(
+ "${WORKDIR}/copium/cr143-libsync-__BEGIN_DECLS.patch"
+ )
+
+ # Automate conditional application of chromium-patches
+ # The directory structure is expected to be something like:
+ # chromium-patches-145/
+ # ├── toolchain/
+ # │ ├── cr123-foo.patch
+ # │ └── cr135-bar.patch
+ # ├── llvm/
+ # │ ├── cr144-baz.patch
+ # │ └── lt-23/
+ # │ └── cr145-bleeding-edge-llvm-feature.patch
+ # Where `lt-23` means "apply this patch if the LLVM version is less than 23".
+ # Only categories in `slot_map` will be checked for version constraints.
+ shopt -s nullglob
+ local -A slot_map=( [llvm]="${LLVM_SLOT}" [rust]="${RUST_SLOT}" )
+
+ for category in "${WORKDIR}/chromium-patches-${PATCH_V}"/*/; do
+ local category_name="${category%/}"
+ category_name="${category_name##*/}"
+
+ # Skip arch-specific categories
+ if [[ "${category_name}" == "ppc64le" ]]; then
+ use ppc64 || continue
+ fi
+
+ # We applied common patches above, no need to apply them again here
+ [[ "${category_name}" == "common" ]] && continue
+
+ # Unconditional patches for this category
+ PATCHES+=( "${category}"*.patch )
+
+ # Version-constrained subdirectories (e.g., llvm/lt-23/)
+ for constraint_dir in "${category}"*/; do
+ local dir_name="${constraint_dir%/}"
+ dir_name="${dir_name##*/}"
+ if [[ "${dir_name}" =~ ^lt-(.*)$ && -v slot_map[${category_name}] ]]; then
+ ver_test "${slot_map[${category_name}]}" -lt "${BASH_REMATCH[1]}" &&
+ PATCHES+=( "${constraint_dir}"*.patch )
+ fi
+ done
+ done
+
+ shopt -u nullglob
+
+ # Strictly speaking this doesn't need to be gated (no bundled toolchain for ppc64); it keeps the logic together
+ if use ppc64; then
+ local patchset_dir="${WORKDIR}/openpower-patches-${PPC64_HASH}/patches"
+ # patch causes build errors on 4K page systems (https://bugs.gentoo.org/show_bug.cgi?id=940304)
+ local page_size_patch="ppc64le/third_party/use-sysconf-page-size-on-ppc64.patch"
+ local isa_3_patch="ppc64le/core/baseline-isa-3-0.patch"
+ # Apply the OpenPOWER patches (check for page size and isa 3.0)
+ openpower_patches=( $(grep -E "^ppc64le|^upstream" "${patchset_dir}/series" | grep -v "${page_size_patch}" |
+ grep -v "${isa_3_patch}" || die) )
+ for patch in "${openpower_patches[@]}"; do
+ PATCHES+=( "${patchset_dir}/${patch}" )
+ done
+ if [[ $(getconf PAGESIZE) == 65536 ]]; then
+ PATCHES+=( "${patchset_dir}/${page_size_patch}" )
+ fi
+ # We use vsx3 as a proxy for 'want isa3.0' (POWER9)
+ if use cpu_flags_ppc_vsx3 ; then
+ PATCHES+=( "${patchset_dir}/${isa_3_patch}" )
+ fi
+ fi
+
+ remove_compiler_builtins
+
+ # We can't rely on the eselect'd Rust to actually include rustfmt, so we'll point to the selected slot specifically.
+ local suffix=""
+ if [[ "${RUST_TYPE}" == "binary" ]]; then
+ suffix="-bin-${RUST_SLOT}"
+ else
+ suffix="-${RUST_SLOT}"
+ fi
+ sed -i "s|/bin/rustfmt|/bin/rustfmt${suffix}|g" build/rust/rust_bindgen_generator.gni ||
+ die "Failed to update rustfmt path"
+
+ fi
+
+ # Do this before we apply patches since (e.g.) ppc64 needs to patch rollup and it's easier in ${S}
+ einfo "Moving rollup wasm-node package into place ..."
+ mkdir -p third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+ die "Failed to create node_modules/@rollup/wasm-node"
+ mv "${WORKDIR}"/package/* third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+ die "Failed to move rollup package"
+
+ default
+
+ # Sanity check esbuild version before we start removing files.
+ # We _could_ patch the version check out - in theory esbuild upstream are being super conservative after
+ # arch(AUR) packaged an `esbuild` binary and set ESBUILD_BINARY_PATH=/usr/bin/esbuild, causing much breakage,
+ # but this is fine too and exactly matches what upstream are expecting.
+ # https://github.com/evanw/esbuild/issues/2894
+ local esbuild_js="${S}/third_party/devtools-frontend/src/node_modules/esbuild/lib/main.js"
+ local found
+ found=$(awk -F'"' '/if \(binaryVersion !==/ {print $2}' "${esbuild_js}")
+ if [[ "${found}" != "${ESBUILD_VER}" ]]; then
+ die "esbuild version mismatch: expected ${ESBUILD_VER}, found ${found}"
+ fi
+
+ elog "Removing bundled binaries from source tree ..."
+ # Purge bundled ELF files: These are non-portable and will cause issues if used instead of system versions.
+ # Use `--wasm` to also remove WebAssembly binaries, if desired - they're portable so shouldn't break builds.
+ ${EPYTHON} "${FILESDIR}/bin-finder.py" --elf "${S}" | awk '{print $1}' | xargs rm -f ||
+ die "Failed to remove bundled binaries"
+
+ # And now we restore any that we actually need, from the host system
+ local esbuild_path="${S}/third_party/devtools-frontend/src/third_party/esbuild"
+ local -A restore_list=(
+ ["/usr/bin/esbuild-${ESBUILD_VER}"]="${esbuild_path}/esbuild"
+ ["/usr/bin/gperf"]="${S}/third_party/gperf/cipd/bin/gperf"
+ ["/usr/bin/node"]="${S}/third_party/node/linux/node-linux-x64/bin/node"
+ )
+
+ for src in "${!restore_list[@]}"; do
+ dst="${restore_list[${src}]}"
+ if [[ -f "${src}" ]]; then
+ einfo "Symlinking ${src} ..."
+ # Make sure the parent dir exists; some tarballs don't include (e.g.) node's bindir
+ mkdir -p "$(dirname "${dst}")" || die "Failed to create directory for ${dst}"
+ ln -s "${src}" "${dst}" || die "Failed to symlink ${dst} from ${src}"
+ if [[ ! -L "${dst}" || "$(readlink -f "${dst}")" != "${src}" ]]; then
+ die "Symlink verification failed for ${dst} -> ${src}"
+ fi
+ else
+ die "Expected to find ${src} to restore ${dst}, but it does not exist."
+ fi
+ done
+
+ # adjust python interpreter version
+ sed -i -e "s|\(^script_executable = \).*|\1\"${EPYTHON}\"|g" .gn || die
+
+ # Use the system copy of hwdata's usb.ids; upstream is woefully out of date (2015!)
+ sed 's|//third_party/usb_ids/usb.ids|/usr/share/hwdata/usb.ids|g' \
+ -i services/device/public/cpp/usb/BUILD.gn || die "Failed to set system usb.ids path"
+
+ # remove_bundled_libraries.py walks the source tree and looks for paths containing the substring 'third_party'
+ # whitelist matches use the right-most matching path component, so we need to whitelist from that point down.
+ local keeplibs=(
+ base/third_party/cityhash
+ base/third_party/double_conversion
+ base/third_party/icu
+ base/third_party/nspr
+ base/third_party/superfasthash
+ base/third_party/symbolize
+ base/third_party/xdg_user_dirs
+ buildtools/third_party/libc++
+ buildtools/third_party/libc++abi
+ net/third_party/mozilla_security_manager
+ net/third_party/quic
+ net/third_party/uri_template
+ third_party/abseil-cpp
+ third_party/angle
+ third_party/angle/src/common/third_party/xxhash
+ third_party/angle/src/third_party/ceval
+ third_party/angle/src/third_party/libXNVCtrl
+ third_party/angle/src/third_party/volk
+ third_party/anonymous_tokens
+ third_party/apple_apsl
+ third_party/axe-core
+ third_party/bidimapper
+ third_party/blink
+ third_party/boringssl
+ third_party/boringssl/src/third_party/fiat
+ third_party/breakpad
+ third_party/breakpad/breakpad/src/third_party/curl
+ third_party/brotli
+ third_party/catapult
+ third_party/catapult/common/py_vulcanize/third_party/rcssmin
+ third_party/catapult/common/py_vulcanize/third_party/rjsmin
+ third_party/catapult/third_party/beautifulsoup4-4.9.3
+ third_party/catapult/third_party/html5lib-1.1
+ third_party/catapult/third_party/polymer
+ third_party/catapult/third_party/six
+ third_party/catapult/third_party/typ
+ third_party/catapult/tracing/third_party/d3
+ third_party/catapult/tracing/third_party/gl-matrix
+ third_party/catapult/tracing/third_party/jpeg-js
+ third_party/catapult/tracing/third_party/jszip
+ third_party/catapult/tracing/third_party/mannwhitneyu
+ third_party/catapult/tracing/third_party/oboe
+ third_party/catapult/tracing/third_party/pako
+ third_party/ced
+ third_party/cld_3
+ third_party/closure_compiler
+ third_party/compiler-rt # Since M137 atomic is required; we could probably unbundle this as a target of opportunity.
+ third_party/content_analysis_sdk
+ third_party/cpuinfo
+ third_party/crabbyavif
+ third_party/crashpad
+ third_party/crashpad/crashpad/third_party/lss
+ third_party/crashpad/crashpad/third_party/zlib
+ third_party/crc32c
+ third_party/cros_system_api
+ third_party/d3
+ third_party/dav1d
+ third_party/dawn
+ third_party/dawn/third_party/gn/webgpu-cts
+ third_party/dawn/third_party/OpenGL-Registry
+ third_party/dawn/third_party/renderdoc
+ third_party/dawn/third_party/webgpu-headers
+ third_party/depot_tools
+ third_party/devscripts
+ third_party/devtools-frontend
+ third_party/devtools-frontend/src/front_end/third_party/acorn
+ third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+ third_party/devtools-frontend/src/front_end/third_party/axe-core
+ third_party/devtools-frontend/src/front_end/third_party/chromium
+ third_party/devtools-frontend/src/front_end/third_party/codemirror
+ third_party/devtools-frontend/src/front_end/third_party/csp_evaluator
+ third_party/devtools-frontend/src/front_end/third_party/diff
+ third_party/devtools-frontend/src/front_end/third_party/i18n
+ third_party/devtools-frontend/src/front_end/third_party/intl-messageformat
+ third_party/devtools-frontend/src/front_end/third_party/json5
+ third_party/devtools-frontend/src/front_end/third_party/legacy-javascript
+ third_party/devtools-frontend/src/front_end/third_party/lighthouse
+ third_party/devtools-frontend/src/front_end/third_party/lit
+ third_party/devtools-frontend/src/front_end/third_party/marked
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/mitt
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/parsel-js
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/rxjs
+ third_party/devtools-frontend/src/front_end/third_party/source-map-scopes-codec
+ third_party/devtools-frontend/src/front_end/third_party/third-party-web
+ third_party/devtools-frontend/src/front_end/third_party/vscode.web-custom-data
+ third_party/devtools-frontend/src/front_end/third_party/wasmparser
+ third_party/devtools-frontend/src/front_end/third_party/web-vitals
+ third_party/devtools-frontend/src/third_party
+ third_party/dom_distiller_js
+ third_party/dragonbox
+ third_party/eigen3
+ third_party/emoji-segmenter
+ third_party/farmhash
+ third_party/fast_float
+ third_party/fdlibm
+ third_party/federated_compute/chromium/fcp/confidentialcompute
+ third_party/federated_compute/src/fcp/base
+ third_party/federated_compute/src/fcp/confidentialcompute
+ third_party/federated_compute/src/fcp/protos/confidentialcompute
+ third_party/federated_compute/src/fcp/protos/federatedcompute
+ third_party/ffmpeg
+ third_party/fft2d
+ third_party/flatbuffers
+ third_party/fp16
+ third_party/freetype
+ third_party/fusejs
+ third_party/fxdiv
+ third_party/gemmlowp
+ third_party/google_input_tools
+ third_party/google_input_tools/third_party/closure_library
+ third_party/google_input_tools/third_party/closure_library/third_party/closure
+ third_party/googletest
+ third_party/gperf # We symlink system gperf, but this will purge the symlink since we tidy up afterwards.
+ third_party/highway
+ third_party/hunspell
+ third_party/ink_stroke_modeler/src/ink_stroke_modeler
+ third_party/ink_stroke_modeler/src/ink_stroke_modeler/internal
+ third_party/ink/src/ink/brush
+ third_party/ink/src/ink/color
+ third_party/ink/src/ink/geometry
+ third_party/ink/src/ink/rendering
+ third_party/ink/src/ink/rendering/skia/common_internal
+ third_party/ink/src/ink/rendering/skia/native
+ third_party/ink/src/ink/rendering/skia/native/internal
+ third_party/ink/src/ink/strokes
+ third_party/ink/src/ink/types
+ third_party/inspector_protocol
+ third_party/ipcz
+ third_party/jinja2
+ third_party/jsoncpp
+ third_party/khronos
+ third_party/lens_server_proto
+ third_party/leveldatabase
+ third_party/libaddressinput
+ third_party/libaom
+ third_party/libaom/source/libaom/third_party/fastfeat
+ third_party/libaom/source/libaom/third_party/vector
+ third_party/libaom/source/libaom/third_party/x86inc
+ third_party/libc++
+ third_party/libdrm
+ third_party/libgav1
+ third_party/libjingle
+ third_party/libpfm4
+ third_party/libphonenumber
+ third_party/libpng
+ third_party/libsecret
+ third_party/libsrtp
+ third_party/libsync
+ third_party/libtess2/libtess2
+ third_party/libtess2/src/Include
+ third_party/libtess2/src/Source
+ third_party/liburlpattern
+ third_party/libva_protected_content
+ third_party/libvpx
+ third_party/libvpx/source/libvpx/third_party/x86inc
+ third_party/libwebm
+ third_party/libx11
+ third_party/libxcb-keysyms
+ third_party/libxml/chromium
+ third_party/libyuv
+ third_party/libzip
+ third_party/lit
+ third_party/llvm-libc
+ third_party/llvm-libc/src/shared/
+ third_party/lottie
+ third_party/lss
+ third_party/lzma_sdk
+ third_party/mako
+ third_party/markupsafe
+ third_party/material_color_utilities
+ third_party/metrics_proto
+ third_party/minigbm
+ third_party/ml_dtypes
+ third_party/modp_b64
+ third_party/nasm
+ third_party/nearby
+ third_party/neon_2_sse
+ third_party/node
+ third_party/oak/chromium/proto
+ third_party/oak/chromium/proto/attestation
+ third_party/omnibox_proto
+ third_party/one_euro_filter
+ third_party/openscreen
+ third_party/openscreen/src/third_party/
+ third_party/openscreen/src/third_party/tinycbor/src/src
+ third_party/opus
+ third_party/ots
+ third_party/pdfium
+ third_party/pdfium/third_party/agg23
+ third_party/pdfium/third_party/bigint
+ third_party/pdfium/third_party/freetype
+ third_party/pdfium/third_party/lcms
+ third_party/pdfium/third_party/libopenjpeg
+ third_party/pdfium/third_party/libtiff
+ third_party/perfetto
+ third_party/perfetto/protos/third_party/chromium
+ third_party/perfetto/protos/third_party/pprof
+ third_party/perfetto/protos/third_party/primes
+ third_party/perfetto/protos/third_party/simpleperf
+ third_party/pffft
+ third_party/ply
+ third_party/polymer
+ third_party/private_membership
+ third_party/private-join-and-compute
+ third_party/protobuf
+ third_party/protobuf/third_party/utf8_range
+ third_party/pthreadpool
+ third_party/puffin
+ third_party/pyjson5
+ third_party/pyyaml
+ third_party/rapidhash
+ third_party/re2
+ third_party/readability
+ third_party/rnnoise
+ third_party/rust
+ third_party/ruy
+ third_party/s2cellid
+ third_party/search_engines_data
+ third_party/securemessage
+ third_party/selenium-atoms
+ third_party/sentencepiece
+ third_party/sentencepiece/src/third_party/darts_clone
+ third_party/shell-encryption
+ third_party/simdutf
+ third_party/simplejson
+ third_party/six
+ third_party/skia
+ third_party/skia/include/third_party/vulkan
+ third_party/smhasher
+ third_party/snappy
+ third_party/spirv-headers
+ third_party/spirv-tools
+ third_party/sqlite
+ third_party/swiftshader
+ third_party/swiftshader/third_party/astc-encoder
+ third_party/swiftshader/third_party/llvm-subzero
+ third_party/swiftshader/third_party/marl
+ third_party/swiftshader/third_party/SPIRV-Headers/include/spirv
+ third_party/swiftshader/third_party/SPIRV-Tools
+ third_party/swiftshader/third_party/subzero
+ third_party/tensorflow_models
+ third_party/tensorflow-text
+ third_party/tflite
+ third_party/tflite/src/third_party/fft2d
+ third_party/tflite/src/third_party/xla/third_party/tsl
+ third_party/tflite/src/third_party/xla/xla/tsl/framework
+ third_party/tflite/src/third_party/xla/xla/tsl/lib/random
+ third_party/tflite/src/third_party/xla/xla/tsl/platform
+ third_party/tflite/src/third_party/xla/xla/tsl/protobuf
+ third_party/tflite/src/third_party/xla/xla/tsl/util
+ third_party/ukey2
+ third_party/utf
+ third_party/vulkan
+ third_party/wayland
+ third_party/webdriver
+ third_party/webgpu-cts
+ third_party/webrtc
+ third_party/webrtc/common_audio/third_party/ooura
+ third_party/webrtc/common_audio/third_party/spl_sqrt_floor
+ third_party/webrtc/modules/third_party/fft
+ third_party/webrtc/modules/third_party/g711
+ third_party/webrtc/modules/third_party/g722
+ third_party/widevine
+ third_party/woff2
+ third_party/wuffs
+ third_party/x11proto
+ third_party/xcbproto
+ third_party/xnnpack
+ third_party/zlib/google
+ third_party/zxcvbn-cpp
+ url/third_party/mozilla
+ v8/third_party/glibc
+ v8/third_party/inspector_protocol
+ v8/third_party/rapidhash-v8
+ v8/third_party/siphash
+ v8/third_party/utf8-decoder
+ v8/third_party/v8
+ v8/third_party/valgrind
+
+ # gyp -> gn leftovers
+ third_party/speech-dispatcher
+ third_party/usb_ids
+ )
+
+ if use rar; then
+ keeplibs+=( third_party/unrar )
+ fi
+
+ if use test; then
+ keeplibs+=(
+ third_party/breakpad/breakpad/src/processor
+ third_party/fuzztest
+ third_party/google_benchmark/src/include/benchmark
+ third_party/google_benchmark/src/src
+ third_party/test_fonts
+ third_party/test_fonts/fontconfig
+ third_party/test_fonts/test_fonts
+ )
+ fi
+
+ # USE=system-*
+ if ! use system-harfbuzz; then
+ keeplibs+=( third_party/harfbuzz )
+ fi
+
+ if ! use system-icu; then
+ keeplibs+=( third_party/icu )
+ fi
+
+ if ! use system-zstd; then
+ keeplibs+=( third_party/zstd )
+ fi
+
+ # Arch-specific
+ if use arm64 || use ppc64 ; then
+ keeplibs+=( third_party/swiftshader/third_party/llvm-10.0 )
+ fi
+ # we need to generate ppc64 stuff because upstream does not ship it yet
+ # it has to be done before unbundling.
+ if use ppc64; then
+ pushd third_party/libvpx >/dev/null || die
+ mkdir -p source/config/linux/ppc64 || die
+ # requires git and clang, bug #832803
+ # Revert https://chromium.googlesource.com/chromium/src/+/b463d0f40b08b4e896e7f458d89ae58ce2a27165%5E%21/third_party/libvpx/generate_gni.sh
+ # and https://chromium.googlesource.com/chromium/src/+/71ebcbce867dd31da5f8b405a28fcb0de0657d91%5E%21/third_party/libvpx/generate_gni.sh
+ # since we're not in a git repo
+ sed -i -e "s|^update_readme||g; s|clang-format|${EPREFIX}/bin/true|g; /^git -C/d; /git cl/d; /cd \$BASE_DIR\/\$LIBVPX_SRC_DIR/ign format --in-place \$BASE_DIR\/BUILD.gn\ngn format --in-place \$BASE_DIR\/libvpx_srcs.gni" \
+ generate_gni.sh || die
+ ./generate_gni.sh || die
+ popd >/dev/null || die
+
+ pushd third_party/ffmpeg >/dev/null || die
+ cp libavcodec/ppc/h264dsp.c libavcodec/ppc/h264dsp_ppc.c || die
+ cp libavcodec/ppc/h264qpel.c libavcodec/ppc/h264qpel_ppc.c || die
+ popd >/dev/null || die
+ fi
+
+ # Sanity check keeplibs, on major version bumps it is often necessary to update this list
+ # and this enables us to hit them all at once.
+ # There are some entries that need to be whitelisted (TODO: Why? The file is understandable, the rest seem odd)
+ whitelist_libs=(
+ net/third_party/quic
+ third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+ third_party/libjingle
+ third_party/mesa
+ third_party/skia/third_party/vulkan
+ third_party/vulkan
+ )
+ local not_found_libs=()
+ for lib in "${keeplibs[@]}"; do
+ if [[ ! -d "${lib}" ]] && ! has "${lib}" "${whitelist_libs[@]}"; then
+ not_found_libs+=( "${lib}" )
+ fi
+ done
+
+ if [[ ${#not_found_libs[@]} -gt 0 ]]; then
+ eerror "The following \`keeplibs\` directories were not found in the source tree:"
+ for lib in "${not_found_libs[@]}"; do
+ eerror " ${lib}"
+ done
+ die "Please update the ebuild."
+ fi
+
+ # Remove most bundled libraries. Some are still needed.
+ einfo "Unbundling third-party libraries ..."
+ build/linux/unbundle/remove_bundled_libraries.py "${keeplibs[@]}" --do-remove || die
+
+ # Interferes with our bundled clang path; we don't want stripped binaries anyway.
+ sed -i -e 's|${clang_base_path}/bin/llvm-strip|/bin/true|g' \
+ -e 's|${clang_base_path}/bin/llvm-objcopy|/bin/true|g' \
+ build/linux/strip_binary.gni || die
+}
+
+chromium_configure() {
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # 974899: sometimes people try to build with a non-Unicode locale and python gets very upset
+ python_export_utf8_locale || die "Chromium builds require a UTF-8 locale."
+
+ # Bug 491582.
+ export TMPDIR="${WORKDIR}/temp"
+ mkdir -p -m 755 "${TMPDIR}" || die
+
+ # https://bugs.gentoo.org/654216
+ addpredict /dev/dri/ #nowarn
+
+ # Use system-provided libraries.
+ # TODO: freetype -- remove sources (https://bugs.chromium.org/p/pdfium/issues/detail?id=733).
+ # TODO: use_system_hunspell (upstream changes needed).
+ # TODO: use_system_protobuf (bug #525560).
+ # TODO: use_system_sqlite (http://crbug.com/22208).
+
+ # libevent: https://bugs.gentoo.org/593458
+ local gn_system_libraries=(
+ flac
+ fontconfig
+ freetype
+ # Need harfbuzz_from_pkgconfig target
+ #harfbuzz-ng
+ libjpeg
+ libwebp
+ libxml
+ libxslt
+ openh264
+ zlib
+ )
+ if use system-icu; then
+ gn_system_libraries+=( icu )
+ fi
+
+ if use system-zstd; then
+ gn_system_libraries+=( zstd )
+ fi
+
+ build/linux/unbundle/replace_gn_files.py --system-libraries "${gn_system_libraries[@]}" ||
+ die "Failed to replace GN files for system libraries"
+
+ # TODO 131: The above call clobbers `enable_freetype = true` in the freetype gni file
+ # drop the last line, then append the freetype line and a new curly brace to end the block
+ local freetype_gni="build/config/freetype/freetype.gni"
+ sed -i -e '$d' ${freetype_gni} || die
+ echo " enable_freetype = true" >> ${freetype_gni} || die
+ echo "}" >> ${freetype_gni} || die
+
+ if use !custom-cflags; then
+ replace-flags "-Os" "-O2"
+ strip-flags
+ # Debug info section overflows without component build
+ # Prevent linker from running out of address space, bug #471810 .
+ filter-flags "-g*"
+ # 949123: Several multimedia components explicitly build with specific CFLAGS and
+ # use runtime detection to enable optimisations; unfortunately any of our CFLAGS are suffixed
+ # to the end of the command line, which causes build failures.
+ use arm64 && filter-flags "-march*" "-mtune*" "-mcpu*"
+ fi
+
+ # We don't use the same clang version as upstream, and with -Werror
+ # we need to make sure that we don't get superfluous warnings.
+ append-flags -Wno-unknown-warning-option
+ if tc-is-cross-compiler; then # can you cross-compile with the bundled toolchain?
+ export BUILD_CXXFLAGS+=" -Wno-unknown-warning-option"
+ export BUILD_CFLAGS+=" -Wno-unknown-warning-option"
+ fi
+
+ # Start building our GN options
+ local myconf_gn=() # Tip: strings must be quoted, bools or numbers are fine
+
+ if use !bundled-toolchain; then
+ # We already forced the "correct" clang via pkg_setup
+
+ if tc-is-cross-compiler; then
+ CC="${CC} -target ${CHOST} --sysroot ${ESYSROOT}"
+ CXX="${CXX} -target ${CHOST} --sysroot ${ESYSROOT}"
+ BUILD_AR=${AR}
+ BUILD_CC=${CC}
+ BUILD_CXX=${CXX}
+ BUILD_NM=${NM}
+ fi
+
+ # Make sure the build system will use the right tools, bug #340795.
+ tc-export AR CC CXX NM
+
+ strip-unsupported-flags
+ append-ldflags -Wl,--undefined-version # https://bugs.gentoo.org/918897#c32
+
+ myconf_gn+=(
+ "is_clang=true"
+ "clang_use_chrome_plugins=false"
+ "use_clang_modules=false" # M141 enables this for the linux platform by default.
+ "use_lld=true"
+ 'custom_toolchain="//build/toolchain/linux/unbundle:default"'
+ # From M127 we need to provide a location for libclang.
+ # We patch this in for gentoo - see chromium-*-bindgen-custom-toolchain.patch
+ # rust_bindgen_root = directory with `bin/bindgen` beneath it.
+ # We don't need to set 'clang_base_path' for anything in our build
+ # and it defaults to the google toolchain location. Instead provide a location
+ # to where system clang lives so that bindgen can find system headers (e.g. stddef.h)
+ "bindgen_libclang_path=\"$(get_llvm_prefix)/$(get_libdir)\""
+ "clang_base_path=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/\""
+ "rust_bindgen_root=\"${EPREFIX}/usr/\""
+ "rust_sysroot_absolute=\"$(get_rust_prefix)\""
+ "rustc_version=\"${RUST_SLOT}\""
+ )
+
+ if ! tc-is-cross-compiler; then
+ myconf_gn+=( 'host_toolchain="//build/toolchain/linux/unbundle:default"' )
+ else
+ tc-export BUILD_{AR,CC,CXX,NM}
+ myconf_gn+=(
+ 'host_toolchain="//build/toolchain/linux/unbundle:host"'
+ 'v8_snapshot_toolchain="//build/toolchain/linux/unbundle:host"'
+ "host_pkg_config=\"$(tc-getBUILD_PKG_CONFIG)\""
+ "pkg_config=\"$(tc-getPKG_CONFIG)\""
+ )
+
+ # setup cups-config, build system only uses --libs option
+ if use cups; then
+ mkdir "${T}/cups-config" || die
+ cp "${ESYSROOT}/usr/bin/${CHOST}-cups-config" "${T}/cups-config/cups-config" || die
+ export PATH="${PATH}:${T}/cups-config"
+ fi
+
+ # Don't inherit PKG_CONFIG_PATH from environment
+ local -x PKG_CONFIG_PATH=
+ fi
+
+ fi # !bundled-toolchain
+
+ local myarch
+ myarch="$(tc-arch)"
+ case ${myarch} in
+ amd64)
+ # Bug 530248, 544702, 546984, 853646.
+ use !custom-cflags && filter-flags -mno-mmx -mno-sse2 -mno-ssse3 -mno-sse4.1 \
+ -mno-avx -mno-avx2 -mno-fma -mno-fma4 -mno-xop -mno-sse4a
+ myconf_gn+=( 'target_cpu="x64"' )
+ ;;
+ arm64)
+ myconf_gn+=( 'target_cpu="arm64"' )
+ ;;
+ ppc64)
+ myconf_gn+=( 'target_cpu="ppc64"' )
+ ;;
+ *)
+ die "Failed to determine target arch, got '${myarch}'."
+ ;;
+ esac
+
+ # Common options
+
+ myconf_gn+=(
+ # Disable code formating of generated files
+ "blink_enable_generated_code_formatting=false"
+ # enable DCHECK with USE=debug only, increases chrome binary size by 30%, bug #811138.
+ # DCHECK is fatal by default, make it configurable at runtime, #bug 807881.
+ "dcheck_always_on=$(usex debug true false)"
+ "dcheck_is_configurable=$(usex debug true false)"
+ # Chromium builds provided by Linux distros should disable the testing config
+ "disable_fieldtrial_testing_config=true"
+ # Custom patch: Enable building Chromium as individual channels (e.g. stable, beta, dev) that
+ # use different profile directories, desktop entries, etc. This enables slotting the ebuild.
+ "enable_channel_branding=true"
+ # 131 began laying the groundwork for replacing freetype with
+ # "Rust-based Fontations set of libraries plus Skia path rendering"
+ # We now need to opt-in
+ "enable_freetype=true"
+ "enable_hangout_services_extension=$(usex hangouts true false)"
+ # Don't need nocompile checks and GN crashes with our config (verify with modern GN)
+ "enable_nocompile_tests=false"
+ # pseudolocales are only used for testing
+ "enable_pseudolocales=false"
+ "enable_widevine=$(usex widevine true false)"
+ # Disable fatal linker warnings, bug 506268.
+ "fatal_linker_warnings=false"
+ # Set up Google API keys, see http://www.chromium.org/developers/how-tos/api-keys
+ # Note: these are for Gentoo use ONLY. For your own distribution,
+ # please get your own set of keys. Feel free to contact chromium@gentoo.org for more info.
+ # note: OAuth2 is patched in; check patchset for details.
+ 'google_api_key="AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc"'
+ # Component build isn't generally intended for use by end users. It's mostly useful
+ # for development and debugging.
+ "is_component_build=false"
+ # GN needs explicit config for Debug/Release as opposed to inferring it from build directory.
+ "is_debug=false"
+ "is_official_build=$(usex official true false)"
+ # Enable ozone wayland and/or headless support
+ "ozone_auto_platforms=false"
+ "ozone_platform_headless=true"
+ # Enables building without non-free unRAR licence
+ "safe_browsing_use_unrar=$(usex rar true false)"
+ "thin_lto_enable_optimizations=${use_lto}"
+ "treat_warnings_as_errors=false"
+ # Use in-tree libc++ (buildtools/third_party/libc++ and buildtools/third_party/libc++abi)
+ # instead of the system C++ library for C++ standard library support.
+ # default: true, but let's be explicit (forced since 120 ; USE removed 127).
+ "use_custom_libcxx=true"
+ # Enable ozone wayland and/or headless support
+ "use_ozone=true"
+ # The sysroot is the oldest debian image that chromium supports, we don't need it
+ "use_sysroot=false"
+ # See dependency logic in third_party/BUILD.gn
+ "use_system_harfbuzz=$(usex system-harfbuzz true false)"
+ "use_thin_lto=${use_lto}"
+ # Only enabled for clang, but gcc has endian macros too
+ "v8_use_libm_trig_functions=true"
+ )
+
+ if use bindist ; then
+ myconf_gn+=(
+ # If this is set to false Chromium won't be able to load any proprietary codecs
+ # even if provided with an ffmpeg capable of h264/aac decoding
+ "proprietary_codecs=true"
+ 'ffmpeg_branding="Chrome"'
+ # build ffmpeg as an external component (libffmpeg.so) that we can remove / substitute
+ "is_component_ffmpeg=true"
+ )
+ else
+ myconf_gn+=(
+ "proprietary_codecs=$(usex proprietary-codecs true false)"
+ "ffmpeg_branding=\"$(usex proprietary-codecs Chrome Chromium)\""
+ )
+ fi
+
+ if use headless; then
+ myconf_gn+=(
+ "enable_print_preview=false"
+ "enable_remoting=false"
+ 'ozone_platform="headless"'
+ "rtc_use_pipewire=false"
+ "use_alsa=false"
+ "use_cups=false"
+ "use_gio=false"
+ "use_glib=false"
+ "use_gtk=false"
+ "use_kerberos=false"
+ "use_libpci=false"
+ "use_pangocairo=false"
+ "use_pulseaudio=false"
+ "use_qt5=false"
+ "use_qt6=false"
+ "use_udev=false"
+ "use_vaapi=false"
+ "use_xkbcommon=false"
+ )
+ else
+ myconf_gn+=(
+ "gtk_version=$(usex gtk4 4 3)"
+ # link pulseaudio directly (DT_NEEDED) instead of using dlopen.
+ # helps with automated detection of ABI mismatches and prevents silent errors.
+ "link_pulseaudio=$(usex pulseaudio true false)"
+ "ozone_platform_wayland=$(usex wayland true false)"
+ "ozone_platform_x11=$(usex X true false)"
+ "ozone_platform=\"$(usex wayland wayland x11)\""
+ "rtc_use_pipewire=$(usex screencast true false)"
+ "use_cups=$(usex cups true false)"
+ "use_kerberos=$(usex kerberos true false)"
+ "use_pulseaudio=$(usex pulseaudio true false)"
+ "use_qt5=false"
+ "use_system_libffi=$(usex wayland true false)"
+ "use_system_minigbm=true"
+ "use_vaapi=$(usex vaapi true false)"
+ "use_xkbcommon=true"
+ )
+ if use qt6; then
+ local cbuild_libdir
+ cbuild_libdir="$(get_libdir)"
+ if tc-is-cross-compiler; then
+ # Hack to workaround get_libdir not being able to handle CBUILD, bug #794181
+ cbuild_libdir="$($(tc-getBUILD_PKG_CONFIG) --keep-system-libs --libs-only-L libxslt)"
+ cbuild_libdir="${cbuild_libdir:2}"
+ cbuild_libdir="${cbuild_libdir/% }"
+ fi
+ myconf_gn+=(
+ "use_qt6=true"
+ "moc_qt6_path=\"${EPREFIX}/usr/${cbuild_libdir}/qt6/libexec\""
+ )
+ else
+ myconf_gn+=( "use_qt6=false" )
+ fi
+ fi
+
+ # Explicitly disable ICU data file support for system-icu/headless builds.
+ if use system-icu || use headless; then
+ myconf_gn+=( "icu_use_data_file=false" )
+ fi
+
+ if use official; then
+ # Allow building against system libraries in official builds
+ sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \
+ tools/generate_shim_headers/generate_shim_headers.py || die
+ if use !ppc64; then
+ myconf_gn+=( "is_cfi=${use_lto}" )
+ else
+ myconf_gn+=( "is_cfi=false" ) # requires llvm-runtimes/compiler-rt-sanitizers[cfi]
+ fi
+ # Don't add symbols to build
+ myconf_gn+=( "symbol_level=0" )
+ fi
+
+ if use pgo; then
+ myconf_gn+=( "chrome_pgo_phase=${1}" )
+ if [[ "$1" == "2" ]]; then
+ myconf_gn+=( "pgo_data_path=${2}" )
+ fi
+ else
+ myconf_gn+=( "chrome_pgo_phase=0" )
+ fi
+
+ # Odds and ends
+
+ # skipping typecheck is only supported on amd64, bug #876157
+ if ! use amd64; then
+ myconf_gn+=( "devtools_skip_typecheck=false" )
+ fi
+
+ # Disable external code space for V8 for ppc64. It is disabled for ppc64
+ # by default, but cross-compiling on amd64 enables it again.
+ if tc-is-cross-compiler && use ppc64; then
+ myconf_gn+=( "v8_enable_external_code_space=false" )
+ fi
+
+ # Since we build from tarballs, we need to set the channel here so that it can be used in the build.
+ export CHROME_VERSION_EXTRA="${SLOT}"
+
+ einfo "Configuring Chromium ..."
+ set -- gn gen --args="${myconf_gn[*]}${EXTRA_GN:+ ${EXTRA_GN}}" out/Release
+ echo "$@"
+ "$@" || die "Failed to configure Chromium"
+}
+
+src_configure() {
+ chromium_configure $(usex pgo 1 0)
+}
+
+chromium_compile() {
+
+ # Final link uses lots of file descriptors.
+ ulimit -n 2048
+
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # Don't inherit PYTHONPATH from environment, bug #789021, #812689
+ local -x PYTHONPATH=
+
+ # Build mksnapshot and pax-mark it.
+ if use pax-kernel; then
+ local x
+ for x in mksnapshot v8_context_snapshot_generator code_cache_generator; do
+ if tc-is-cross-compiler; then
+ eninja -C out/Release "host/${x}"
+ pax-mark m "out/Release/host/${x}"
+ else
+ eninja -C out/Release "${x}"
+ pax-mark m "out/Release/${x}"
+ fi
+ done
+ fi
+
+ # Even though ninja autodetects number of CPUs, we respect
+ # user's options, for debugging with -j 1 or any other reason.
+ eninja -C out/Release chrome chromedriver chrome_sandbox $(use test && echo "base_unittests")
+
+ pax-mark m out/Release/chrome
+
+ # This codepath does minimal patching, so we're at the mercy of upstream
+ # CFLAGS. This is fine - we're not intending to force this on users
+ # and we do a lot of flag 'management' anyway.
+ if use bundled-toolchain; then
+ QA_FLAGS_IGNORED="
+ usr/lib64/chromium-browser/chrome
+ usr/lib64/chromium-browser/chrome-sandbox
+ usr/lib64/chromium-browser/chromedriver
+ usr/lib64/chromium-browser/chrome_crashpad_handler
+ usr/lib64/chromium-browser/libEGL.so
+ usr/lib64/chromium-browser/libGLESv2.so
+ usr/lib64/chromium-browser/libVkICD_mock_icd.so
+ usr/lib64/chromium-browser/libVkLayer_khronos_validation.so
+ usr/lib64/chromium-browser/libqt6_shim.so
+ usr/lib64/chromium-browser/libvk_swiftshader.so
+ usr/lib64/chromium-browser/libvulkan.so.1
+ "
+ fi
+}
+
+# This function is called from virtx, and must always return so that Xvfb
+# session isn't left running. If we return 1, virtx will call die().
+chromium_profile() {
+ einfo "Profiling for PGO"
+
+ pushd "${WORKDIR}/chromium-profiler-"* >/dev/null || return 1
+
+ # Remove old profdata in case profiling was interrupted.
+ rm -rf "${1}" || return 1
+
+ if ! "${EPYTHON}" ./chromium_profiler.py \
+ --chrome-executable "${S}/out/Release/chrome" \
+ --chromedriver-executable "${S}/out/Release/chromedriver.unstripped" \
+ --add-arg no-sandbox --add-arg disable-dev-shm-usage \
+ --profile-output "${1}"; then
+ eerror "Profiling failed"
+ return 1
+ fi
+
+ popd >/dev/null || return 1
+}
+
+src_compile() {
+ if use pgo; then
+ local profdata
+
+ profdata="${WORKDIR}/chromium.profdata"
+
+ if [[ ! -e "${WORKDIR}/.pgo-profiled" ]]; then
+ chromium_compile
+ virtx chromium_profile "$profdata"
+
+ touch "${WORKDIR}/.pgo-profiled" || die
+ fi
+
+ if [[ ! -e "${WORKDIR}/.pgo-phase-2-configured" ]]; then
+ # Remove phase 1 output
+ rm -r out/Release || die
+
+ chromium_configure 2 "$profdata"
+
+ touch "${WORKDIR}/.pgo-phase-2-configured" || die
+ fi
+
+ if [[ ! -e "${WORKDIR}/.pgo-phase-2-compiled" ]]; then
+ chromium_compile
+ touch "${WORKDIR}/.pgo-phase-2-compiled" || die
+ fi
+ else
+ chromium_compile
+ fi
+
+ mv out/Release/chromedriver{.unstripped,} || die
+
+ rm -f out/Release/locales/*.pak.info || die
+
+ # Generate support files (desktop file, manpage, etc.) See: #684550 #706786 #968958
+ ${EPYTHON} "${FILESDIR}/generate-support-files.py" \
+ --installdir "/usr/$(get_libdir)/chromium-browser" \
+ --channel "${SLOT}" ||
+ die "Failed to generate support files"
+}
+
+src_test() {
+ # Tests may be flaky with usersandbox, and the test runner executes significantly faster without.
+ # If you seem to be excluding too many tests for a particular milestone: comment them out, reboot, and
+ # run the tests again. If that doesn't help, try FEATURES="-usersandbox" and send it because obviously the
+ # chromium gods are not smiling upon you today. Do some runtime testing, obvs.
+ local skip_tests=(
+ # Wildcard exclusions (if all tests in a test suite are broken)
+ 'AlternateTestParams/PartitionAllocDeathTest.RepeatedAllocReturnNullDirect/*'
+ 'AlternateTestParams/PartitionAllocDeathTest.RepeatedReallocReturnNullDirect/*'
+ 'AlternateTestParams/PartitionAllocTest.*' # 200+ tests, >= 1 crashes entire test runner with usersandbox.
+ 'CheckExitCodeAfterSignalHandlerDeathTest.*'
+ 'CriticalProcessAndThreadSpotChecks/HangWatcherAnyCriticalThreadTests.*'
+ 'LazyThreadPoolTaskRunnerEnvironmentTest.*' # M142
+ 'ToolsSanityTest.BadVirtualCall*'
+ # requires en-us locale
+ SysStrings.SysNativeMBAndWide
+ SysStrings.SysNativeMBToWide
+ SysStrings.SysWideToNativeMB
+ # Specific test cases
+ CancelableEventTest.BothCancelFailureAndSucceedOccurUnderContention
+ FilePathTest.FromUTF8Unsafe_And_AsUTF8Unsafe
+ HistogramTesterTest.PumaTestUniqueSample
+ PathServiceTest.CheckedGetFailure
+ PlatformThreadTest.CanChangeThreadType
+ RawPtrTest.SetLookupUsesGetForComparison # M146 ; also broken for alpine in M144.
+ RustLogIntegrationTest.CheckAllSeverity
+ StackCanary.ChangingStackCanaryCrashesOnReturn
+ StackTraceDeathTest.StackDumpSignalHandlerIsMallocFree
+ TestLauncherTools.TruncateSnippetFocusedMatchesFatalMessagesTest
+ ThreadPoolEnvironmentConfig.CanUseBackgroundPriorityForWorker
+ # M148 Beta
+ RunUntilTestWithMockTime.ConditionOnlyObservedIfWorkIsDone
+ )
+ local test_filter="-$(IFS=:; printf '%s' "${skip_tests[*]}")"
+ # test-launcher-bot-mode enables parallelism and plain output
+ # Check individual tests with --gtest_filter=<test you want> --single-process-tests
+ ./out/Release/base_unittests --test-launcher-bot-mode \
+ --test-launcher-jobs="$(get_makeopts_jobs)" \
+ --gtest_filter="${test_filter}" || die "Tests failed!"
+}
+
+src_install() {
+ local browser_suffix
+ if [[ "${SLOT}" != "stable" ]]; then
+ browser_suffix="-${SLOT}"
+ else
+ browser_suffix=""
+ fi
+ local CHROMIUM_HOME="/usr/$(get_libdir)/chromium-browser${browser_suffix}"
+ exeinto "${CHROMIUM_HOME}"
+ doexe out/Release/chrome
+
+ newexe out/Release/chrome_sandbox chrome-sandbox
+ fperms 4755 "${CHROMIUM_HOME}/chrome-sandbox"
+
+ doexe out/Release/chromedriver
+ doexe out/Release/chrome_crashpad_handler
+
+ ozone_auto_session () {
+ use X && use wayland && ! use headless && echo true || echo false
+ }
+
+ cat <<- EOF > "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+ #!/bin/bash
+ # Wrapper to launch slotted Chromium via the chromium-common launcher script.
+ export CHROME_DESKTOP="chromium-browser${browser_suffix}.desktop"
+ export CHROME_EXEC_NAME="chromium-browser${browser_suffix}"
+ export CHROME_VERSION_EXTRA="${SLOT}"
+ export CHROME_WRAPPER="\$(readlink -f "\$0")"
+ export OZONE_AUTO_SESSION=$(ozone_auto_session)
+
+ exec /usr/libexec/chromium/chromium-launcher.sh "\$@"
+ EOF
+
+ chmod 755 "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+
+ # It is important that we name the target "chromium-browser",
+ # xdg-utils expect it; bug #355517.
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-browser${browser_suffix}
+ # keep the old symlink around for consistency
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium${browser_suffix}
+
+ dosym "${CHROMIUM_HOME}/chromedriver" /usr/bin/chromedriver${browser_suffix}
+
+ pushd out/Release/locales > /dev/null || die
+ chromium_remove_language_paks
+ popd > /dev/null || die
+
+ insinto "${CHROMIUM_HOME}"
+ doins out/Release/*.bin
+ doins out/Release/*.pak
+
+ if use bindist; then
+ # We built libffmpeg as a component library, but we can't distribute it
+ # with proprietary codec support. Remove it and make a symlink to the requested
+ # system library.
+ rm -f out/Release/libffmpeg.so \
+ || die "Failed to remove bundled libffmpeg.so (with proprietary codecs)"
+ # symlink the libffmpeg.so from either ffmpeg-chromium or ffmpeg[chromium].
+ einfo "Creating symlink to libffmpeg.so from $(usex ffmpeg-chromium ffmpeg-chromium ffmpeg[chromium])..."
+ dosym ../chromium/libffmpeg.so$(usex ffmpeg-chromium .${PV%%\.*} "") \
+ /usr/$(get_libdir)/chromium-browser/libffmpeg.so
+ fi
+
+ (
+ shopt -s nullglob
+ local files=(out/Release/*.so out/Release/*.so.[0-9])
+ [[ ${#files[@]} -gt 0 ]] && doins "${files[@]}"
+ )
+
+ if ! use system-icu && ! use headless; then
+ doins out/Release/icudtl.dat
+ fi
+
+ doins -r out/Release/locales
+ doins -r out/Release/MEIPreload
+
+ # Install vk_swiftshader_icd.json; bug #827861
+ doins out/Release/vk_swiftshader_icd.json
+
+ if [[ -d out/Release/swiftshader ]]; then
+ insinto "${CHROMIUM_HOME}/swiftshader"
+ doins out/Release/swiftshader/*.so
+ fi
+
+ # Install icons
+ local branding size
+ for size in 16 24 32 48 64 128 256 ; do
+ case ${size} in
+ 16|32) branding="chrome/app/theme/default_100_percent/chromium" ;;
+ *) branding="chrome/app/theme/chromium" ;;
+ esac
+ newicon -s ${size} "${branding}/product_logo_${size}.png" \
+ chromium-browser${browser_suffix}.png
+ done
+
+ # Install desktop entry
+ domenu out/Release/chromium-browser${browser_suffix}.desktop
+
+ # Install GNOME default application entry (bug #303100).
+ insinto /usr/share/gnome-control-center/default-apps
+ doins out/Release/chromium-browser${browser_suffix}.xml
+
+ # Install AppStream metadata
+ insinto /usr/share/appdata
+ doins out/Release/chromium-browser${browser_suffix}.appdata.xml
+
+ # Install manpage; bug #684550
+ doman out/Release/chromium-browser${browser_suffix}.1
+ dosym chromium-browser${browser_suffix}.1 /usr/share/man/man1/chromium${browser_suffix}.1
+
+ readme.gentoo_create_doc
+}
+
+pkg_postrm() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+}
+
+pkg_postinst() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+ readme.gentoo_print_elog
+
+ if use !headless && [[ -z "${REPLACING_VERSIONS}" ]]; then
+ if use vaapi; then
+ elog "Hardware-accelerated video decoding configuration:"
+ elog
+ elog "Chromium supports multiple backends for hardware acceleration. To enable one,"
+ elog " Add to CHROMIUM_FLAGS in /etc/chromium/default:"
+ elog
+ elog "1. VA-API with OpenGL (recommended for most users):"
+ elog " --enable-features=AcceleratedVideoDecodeLinuxGL"
+ elog " VaapiVideoDecoder may need to be added as well, but try without first."
+ elog
+ if use wayland; then
+ elog "2. Enhanced Wayland/EGL performance:"
+ elog " --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL"
+ elog
+ fi
+ if use X; then
+ elog "$(usex wayland "3" "2"). VA-API with Vulkan:"
+ elog " --enable-features=VaapiVideoDecoder,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE"
+ elog
+ if use wayland; then
+ elog " NOTE: Vulkan acceleration requires X11 and will not work under Wayland sessions."
+ elog " Use OpenGL-based acceleration instead when running under Wayland."
+ elog
+ fi
+ fi
+ elog "Additional options:"
+ elog " To enable hardware-accelerated encoding (if supported)"
+ elog " add 'AcceleratedVideoEncoder' to your feature list"
+ elog " VaapiIgnoreDriverChecks bypasses driver compatibility checks"
+ elog " (may be needed for newer/unsupported hardware)"
+ elog
+ else
+ elog "This Chromium build was compiled without VA-API support, which provides"
+ elog "hardware-accelerated video decoding."
+ fi
+ if use screencast; then
+ elog "Screencast is disabled by default at runtime. Either enable it"
+ elog "by navigating to chrome://flags/#enable-webrtc-pipewire-capturer"
+ elog "inside Chromium or add --enable-features=WebRTCPipeWireCapturer"
+ elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+ fi
+ if use gtk4; then
+ elog "Chromium prefers GTK3 over GTK4 at runtime. To override this"
+ elog "behavior you need to pass --gtk-version=4, e.g. by adding it"
+ elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+ fi
+ fi
+
+ if systemd_is_booted && ! [[ -f "/etc/machine-id" ]]; then
+ ewarn "The lack of an '/etc/machine-id' file on this system booted with systemd"
+ ewarn "indicates that the Gentoo handbook was not followed to completion."
+ ewarn ""
+ ewarn "Chromium is known to behave unpredictably with this system configuration;"
+ ewarn "please complete the configuration of this system before logging any bugs."
+ fi
+
+ # Stable slot doesn't change profile directory, and it's vanishingly unlikely that users will downgrade from dev.
+ if [[ -n "${REPLACING_VERSIONS}" ]]; then
+ local replacing_non_slotted=false
+ # there could be more than one PVR
+ for version in ${REPLACING_VERSIONS}; do
+ if ver_test "${version}" -le "145.0.7632.116"; then
+ replacing_non_slotted=true
+ break
+ fi
+ done
+ if ${replacing_non_slotted}; then
+ ewarn "This version of Chromium has replaced a non-slotted ebuild."
+ if [[ ${SLOT} != "stable" ]]; then
+ ewarn "This channel has its own profile directory, so your existing profile will not be used."
+ ewarn "To use your existing profile, either copy or move it to the new location."
+ ewarn "See https://wiki.gentoo.org/wiki/Chromium#Profile_Directories for more information."
+ ewarn ""
+ fi
+ ewarn "Any existing Progressive Web Apps (PWAs) will need to be reinstalled,"
+ ewarn "or have the path in the desktop files updated to point to the new wrapper script."
+ fi
+ fi
+}
diff --git a/www-client/chromium/chromium-148.0.7778.215.ebuild b/www-client/chromium/chromium-148.0.7778.215.ebuild
new file mode 100644
index 000000000000..f27d5299becc
--- /dev/null
+++ b/www-client/chromium/chromium-148.0.7778.215.ebuild
@@ -0,0 +1,1747 @@
+# Copyright 2009-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+# PACKAGING NOTES
+
+# Upstream roll their bundled Clang every two weeks, and the bundled Rust
+# is rolled regularly and depends on that. While we do our best to build
+# with system Clang, we may eventually hit the point where we need to use
+# the bundled Clang due to the use of prerelease features.
+
+# USE=bundled-toolchain is intended for users who want to use the same toolchain
+# as the upstream releases. It's also a good fallback in case we fall behind
+# and need to get a release out quickly (less likely with `dev` in-tree).
+# We can't rely on it as a default since the toolchain is only shipped for x86-64;
+# other architectures will need to use system toolchain.
+
+# Since m133 we are using CI-generated tarballs from
+# https://github.com/chromium-linux-tarballs/chromium-tarballs/
+
+# These are bit-for-bit identical to the official releases, but are built
+# using an external CI system that we have some control over, in case
+# issues pop up again with official tarball generation.
+
+GN_MIN_VER=0.2354
+# chromium-tools/get-chromium-toolchain-strings.py (or just use Chromicler)
+TEST_FONT="a28b222b79851716f8358d2800157d9ffe117b3545031ae51f69b7e1e1b9a969"
+BUNDLED_CLANG_VER="llvmorg-23-init-5669-g8a0be0bc-4"
+BUNDLED_RUST_VER="6f54d591c3116ee7f8ce9321ddeca286810cc142-7"
+RUST_SHORT_HASH=${BUNDLED_RUST_VER:0:10}-${BUNDLED_RUST_VER##*-}
+NODE_VER="24.12.0"
+ESBUILD_VER="0.25.1"
+ROLLUP_VER="4.57.1" # currently manual.
+VIRTUALX_REQUIRED="pgo"
+
+CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu he
+ hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr
+ sv sw ta te th tr uk ur vi zh-CN zh-TW"
+
+LLVM_COMPAT=( 21 )
+PYTHON_COMPAT=( python3_{11..13} )
+PYTHON_REQ_USE="xml(+)"
+RUST_MIN_VER=1.91.0
+RUST_NEEDS_LLVM="yes please"
+RUST_OPTIONAL="yes" # Not actually optional, but we don't need system Rust (or LLVM) with USE=bundled-toolchain
+RUST_REQ_USE="rustfmt" # Upstream run rustfmt on bindgen output, so we need it to be available.
+
+inherit check-reqs chromium-2 desktop flag-o-matic llvm-r1 multiprocessing ninja-utils pax-utils
+inherit python-any-r1 readme.gentoo-r1 rust systemd toolchain-funcs virtualx xdg-utils
+
+DESCRIPTION="Open-source version of Google Chrome web browser"
+HOMEPAGE="https://www.chromium.org/"
+PPC64_HASH="a85b64f07b489b8c6fdb13ecf79c16c56c560fc6"
+PATCH_V="${PV%%\.*}-3"
+COPIUM_COMMIT="fe1caafa06f27542c18a881348f78e984e2d9fe2"
+SRC_URI="https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/download/${PV}/chromium-${PV}-linux.tar.xz
+ https://deps.gentoo.zip/www-client/chromium/rollup-wasm-node-${ROLLUP_VER}.tgz
+ https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
+ !bundled-toolchain? (
+ https://codeberg.org/selfisekai/copium/archive/${COPIUM_COMMIT}.tar.gz
+ -> chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+ )
+ bundled-toolchain? (
+ https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-${BUNDLED_CLANG_VER}.tar.xz
+ -> chromium-clang-${BUNDLED_CLANG_VER}.tar.xz
+ https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/rust-toolchain-${BUNDLED_RUST_VER}-${BUNDLED_CLANG_VER%-*}.tar.xz
+ -> chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz
+ )
+ test? (
+ https://chromium-fonts.storage.googleapis.com/${TEST_FONT} -> chromium-testfonts-${TEST_FONT:0:10}.tar.gz
+ )
+ ppc64? (
+ https://gitlab.raptorengineering.com/raptor-engineering-public/chromium/openpower-patches/-/archive/${PPC64_HASH}/openpower-patches-${PPC64_HASH}.tar.bz2 -> chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+ )
+ pgo? ( https://github.com/elkablo/chromium-profiler/releases/download/v0.2/chromium-profiler-0.2.tar )"
+
+# https://gitweb.gentoo.org/proj/chromium-tools.git/tree/get-chromium-licences.py @ 145.0.7632.76
+LICENSE="Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD BSD-2 Base64 Boost-1.0 CC-BY-3.0 CC-BY-4.0 Clear-BSD FFT2D FTL"
+LICENSE+=" IJG ISC LGPL-2 LGPL-2.1 MIT MPL-1.1 MPL-2.0 Ms-PL PSF-2 SGI-B-2.0 SSLeay SunSoft Unicode-3.0"
+LICENSE+=" Unicode-DFS-2015 Unlicense UoI-NCSA ZLIB libtiff openssl"
+LICENSE+=" rar? ( unRAR )"
+
+SLOT="stable"
+# Unstable in gentoo exists mostly to give devs some breathing room for beta/stable releases.
+# It shouldn't be keyworded but adventurous users are encouraged to select it;
+# there's official dev channel Google Chrome after all.
+KEYWORDS="amd64 arm64"
+
+IUSE_SYSTEM_LIBS="+system-harfbuzz +system-icu +system-zstd"
+IUSE="+X ${IUSE_SYSTEM_LIBS} bindist bundled-toolchain cups debug ffmpeg-chromium gtk4 +hangouts headless kerberos +official pax-kernel pgo"
+IUSE+=" +proprietary-codecs pulseaudio qt6 +rar +screencast selinux test +vaapi +wayland +widevine cpu_flags_ppc_vsx3"
+RESTRICT="
+ !bindist? ( bindist )
+ !test? ( test )
+ arm64? ( test )" # Tests require CFI, which requires LTO, which is broken on arm64 with LLVM 21.
+
+REQUIRED_USE="
+ !headless? ( || ( X wayland ) )
+ pgo? ( X !wayland )
+ screencast? ( wayland )
+ ffmpeg-chromium? ( bindist proprietary-codecs )
+"
+
+COMMON_X_DEPEND="
+ x11-libs/libXcomposite:=
+ x11-libs/libXcursor:=
+ x11-libs/libXdamage:=
+ x11-libs/libXfixes:=
+ >=x11-libs/libXi-1.6.0:=
+ x11-libs/libXrandr:=
+ x11-libs/libXrender:=
+ x11-libs/libXtst:=
+ x11-libs/libxshmfence:=
+"
+
+# sys-libs/zlib: https://bugs.gentoo.org/930365; -ng is not compatible.
+# We _could_ use the bundled minizip, but that's against policy.
+COMMON_SNAPSHOT_DEPEND="
+ system-icu? ( >=dev-libs/icu-73.0:= )
+ >=dev-libs/libxml2-2.12.4:=[icu]
+ dev-libs/nspr:=
+ >=dev-libs/nss-3.26:=
+ dev-libs/libxslt:=
+ media-libs/fontconfig:=
+ >=media-libs/freetype-2.11.0-r1:=
+ system-harfbuzz? ( >=media-libs/harfbuzz-3:0=[icu(-)] )
+ media-libs/libjpeg-turbo:=
+ system-zstd? ( >=app-arch/zstd-1.5.5:= )
+ >=media-libs/libwebp-0.4.0:=
+ media-libs/mesa:=[gbm(+)]
+ >=media-libs/openh264-2.6.0:=
+ sys-libs/zlib:=
+ !headless? (
+ dev-libs/glib:2
+ >=media-libs/alsa-lib-1.0.19:=
+ pulseaudio? ( media-libs/libpulse:= )
+ sys-apps/pciutils:=
+ kerberos? ( virtual/krb5 )
+ vaapi? ( >=media-libs/libva-2.7:=[X?,wayland?] )
+ X? (
+ x11-base/xorg-proto:=
+ x11-libs/libX11:=
+ x11-libs/libxcb:=
+ x11-libs/libXext:=
+ )
+ x11-libs/libxkbcommon:=
+ wayland? (
+ dev-libs/libffi:=
+ dev-libs/wayland:=
+ screencast? ( media-video/pipewire:= )
+ )
+ )
+"
+
+COMMON_DEPEND="
+ ${COMMON_SNAPSHOT_DEPEND}
+ app-arch/bzip2:=
+ dev-libs/expat:=
+ net-misc/curl[ssl]
+ sys-apps/dbus:=
+ media-libs/flac:=
+ sys-libs/zlib:=[minizip]
+ !headless? (
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ media-libs/mesa:=[X?,wayland?]
+ virtual/udev
+ x11-libs/cairo:=
+ x11-libs/gdk-pixbuf:2
+ x11-libs/pango:=
+ cups? ( >=net-print/cups-1.3.11:= )
+ qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ X? ( ${COMMON_X_DEPEND} )
+ )
+"
+RDEPEND="${COMMON_DEPEND}
+ !www-client/chromium:0
+ >=www-client/chromium-common-2
+ !headless? (
+ || (
+ x11-libs/gtk+:3[X?,wayland?]
+ gui-libs/gtk:4[X?,wayland?]
+ )
+ qt6? ( dev-qt/qtbase:6[X?,wayland?] )
+ )
+ virtual/ttf-fonts
+ selinux? ( sec-policy/selinux-chromium )
+ bindist? (
+ !ffmpeg-chromium? ( >=media-video/ffmpeg-6.1-r1:0/58.60.60[chromium] )
+ ffmpeg-chromium? ( media-video/ffmpeg-chromium:${PV%%\.*} )
+ )
+"
+DEPEND="${COMMON_DEPEND}
+ !headless? (
+ gtk4? ( gui-libs/gtk:4[X?,wayland?] )
+ !gtk4? ( x11-libs/gtk+:3[X?,wayland?] )
+ )
+"
+
+BDEPEND="
+ ${COMMON_SNAPSHOT_DEPEND}
+ ${PYTHON_DEPS}
+ $(python_gen_any_dep '
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ ')
+ >=app-arch/gzip-1.7
+ !headless? (
+ qt6? ( dev-qt/qtbase:6 )
+ )
+ !bundled-toolchain? ( $(llvm_gen_dep '
+ llvm-core/clang:${LLVM_SLOT}
+ llvm-core/llvm:${LLVM_SLOT}
+ llvm-core/lld:${LLVM_SLOT}
+ official? (
+ !ppc64? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[cfi] )
+ ) ')
+ ${RUST_DEPEND}
+ )
+ pgo? (
+ >=dev-python/selenium-3.141.0
+ >=dev-util/web_page_replay_go-20220314
+ )
+ >=dev-util/bindgen-0.72.1
+ >=dev-build/gn-${GN_MIN_VER}
+ app-alternatives/ninja
+ dev-lang/perl
+ >=dev-util/gperf-3.2
+ dev-util/esbuild:${ESBUILD_VER}
+ dev-vcs/git
+ >=net-libs/nodejs-${NODE_VER}[inspector]
+ sys-apps/hwdata
+ >=sys-devel/bison-2.4.3
+ sys-devel/flex
+ virtual/pkgconfig
+ x11-misc/xdg-utils
+"
+
+if ! has chromium_pkg_die ${EBUILD_DEATH_HOOKS}; then
+ EBUILD_DEATH_HOOKS+=" chromium_pkg_die";
+fi
+
+DISABLE_AUTOFORMATTING="yes"
+DOC_CONTENTS="
+Some web pages may require additional fonts to display properly.
+Try installing some of the following packages if some characters
+are not displayed properly:
+- media-fonts/arphicfonts
+- media-fonts/droid
+- media-fonts/ipamonafont
+- media-fonts/noto
+- media-fonts/ja-ipafonts
+- media-fonts/takao-fonts
+- media-fonts/wqy-microhei
+- media-fonts/wqy-zenhei
+
+To fix broken icons on the Downloads page, you should install an icon
+theme that covers the appropriate MIME types, and configure this as your
+GTK+ icon theme.
+
+For native file dialogs in KDE, install kde-apps/kdialog.
+
+To make password storage work with your desktop environment you may
+have install one of the supported credentials management applications:
+- app-crypt/libsecret (GNOME)
+- kde-frameworks/kwallet (KDE)
+If you have one of above packages installed, but don't want to use
+them in Chromium, then add --password-store=basic to CHROMIUM_FLAGS
+in /etc/chromium/default.
+"
+
+python_check_deps() {
+ python_has_version "dev-python/setuptools[${PYTHON_USEDEP}]"
+}
+
+pre_build_checks() {
+ # Check build requirements: bugs #471810, #541816, #914220
+ # We're going to start doing maths here on the size of an unpacked source tarball,
+ # this should make updates easier as chromium continues to balloon in size.
+ # xz -l /var/cache/distfiles/chromium-${PV}*.tar.xz
+ local base_disk=9 # Round up
+ use test && base_disk=$((base_disk + 5))
+ local extra_disk=1 # Always include a little extra space
+ local memory=4
+ tc-is-cross-compiler && extra_disk=$((extra_disk * 2))
+ if tc-is-lto || use pgo; then
+ memory=$((memory * 2 + 1))
+ tc-is-cross-compiler && extra_disk=$((extra_disk * 2)) # Double the requirements
+ use pgo && extra_disk=$((extra_disk + 4))
+ fi
+ if is-flagq '-g?(gdb)?([1-9])'; then
+ if use custom-cflags; then
+ extra_disk=$((extra_disk + 5))
+ fi
+ memory=$((memory * 2))
+ fi
+ local CHECKREQS_MEMORY="${memory}G"
+ local CHECKREQS_DISK_BUILD="$((base_disk + extra_disk))G"
+ check-reqs_${EBUILD_PHASE_FUNC}
+}
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]]; then
+ # The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+ pre_build_checks
+ fi
+
+ if use headless; then
+ local headless_unused_flags=("cups" "kerberos" "pulseaudio" "qt6" "vaapi" "wayland")
+ for myiuse in ${headless_unused_flags[@]}; do
+ use ${myiuse} && ewarn "Ignoring USE=${myiuse}, USE=headless is set."
+ done
+ fi
+
+ if ! use bindist && use ffmpeg-chromium; then
+ ewarn "Ignoring USE=ffmpeg-chromium, USE=bindist is not set."
+ fi
+}
+
+pkg_setup() {
+ if [[ ${MERGE_TYPE} != binary ]]; then
+ # The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+ pre_build_checks
+
+ # We haven't massaged any CFLAGS yet, so we want to do this before we force CC/CXX to prevent warnings.
+ local want_lto="false"
+ tc-is-lto && want_lto="true"
+
+ # The linux:unbundle toolchain in GN grabs CC, CXX, CPP (etc) from the environment
+ # We'll set these to clang here then use llvm-utils functions to very explicitly set these
+ # to a sane value.
+ # This is effectively the 'force-clang' path if GCC support is re-added.
+ if use !bundled-toolchain; then
+ llvm-r1_pkg_setup
+ rust_pkg_setup
+
+ # Forcing clang; respect llvm_slot_x to enable selection of impl via LLVM_COMPAT
+ AR=llvm-ar
+ CPP="${CHOST}-clang++-${LLVM_SLOT} -E"
+ NM=llvm-nm
+ CC="${CHOST}-clang-${LLVM_SLOT}"
+ CXX="${CHOST}-clang++-${LLVM_SLOT}"
+ fi
+
+ use_lto="false"
+ local lto_usable="true"
+ if [[ "$want_lto" == "true" ]]; then
+ if use arm64 && [[ "${LLVM_SLOT}" -lt 22 ]]; then
+ einfo "LTO is broken with LLVM 21 on arm64, ignoring CFLAGS."
+ lto_usable="false"
+ else
+ use_lto="true"
+ fi
+ # We can rely on GN to do this for us; without this builds
+ # take significantly longer with LTO enabled.
+ filter-lto
+ fi
+
+ if [[ "$use_lto" == "false" ]] && use official && [[ "$lto_usable" == "true" ]]; then
+ einfo "USE=official selected and LTO not detected."
+ einfo "It is _highly_ recommended that LTO be enabled for performance reasons"
+ einfo "and to be consistent with the upstream \"official\" build optimisations."
+ fi
+
+ if [[ "$use_lto" == "false" ]] && use test; then
+ die "Tests require CFI which requires LTO"
+ fi
+
+ export use_lto
+
+ # 936858
+ if tc-ld-is-mold; then
+ eerror "Your toolchain is using the mold linker."
+ eerror "This is not supported by Chromium."
+ die "Please switch to a different linker."
+ fi
+
+ if tc-is-cross-compiler; then
+ use pgo && die "The pgo USE flag cannot be used when cross-compiling"
+ CPP="${CBUILD}-clang++-${LLVM_SLOT} -E"
+ fi
+
+ # I hate doing this but upstream Rust have yet to come up with a better solution for
+ # us poor packagers. Required for Split LTO units, which are required for CFI.
+ export RUSTC_BOOTSTRAP=1
+
+ # Sanity checks for development convenience
+ if ver_test $(gn --version || die) -lt ${GN_MIN_VER}; then
+ die "dev-build/gn >= ${GN_MIN_VER} is required to build this Chromium"
+ fi
+
+ # Sometimes, when adding a new LLVM slot, devs (me) forget to install an appropriate lld.
+ local lld_ver=$(ld.lld --version | awk '{split($2,a,"."); print a[1]}' || die "Failed to check lld version")
+ if [[ ${lld_ver} -lt ${LLVM_SLOT} ]]; then
+ die "Your lld version (${lld_ver}) is too old for the selected LLVM slot (${LLVM_SLOT}). Please install a newer lld or select an older LLVM slot."
+ fi
+ fi
+
+ chromium_suid_sandbox_check_kernel_config
+}
+
+src_unpack() {
+ unpack ${P}-linux.tar.xz
+ unpack chromium-patches-${PATCH_V}.tar.bz2
+ # These should only be required when we're not using the official toolchain
+ if use !bundled-toolchain; then
+ unpack chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+ fi
+
+ use pgo && unpack chromium-profiler-0.2.tar
+
+ if use test; then
+ # This just contains a bunch of font files that need to be unpacked (or moved) to the correct location.
+ local testfonts_dir="${WORKDIR}/${P}/third_party/test_fonts/test_fonts"
+ local testfonts_tar="${DISTDIR}/chromium-testfonts-${TEST_FONT:0:10}.tar.gz"
+ einfo "Unpacking test fonts ..."
+ tar xf "${testfonts_tar}" -C "${testfonts_dir}" || die "Failed to unpack testfonts"
+ fi
+
+ # We need to manually unpack this since M126 else we'd unpack one toolchain over the other.
+ # Since we're doing that anyway let's unpack to sensible locations to make symlink creation easier.
+ if use bundled-toolchain; then
+ einfo "Unpacking bundled Clang ..."
+ mkdir -p "${WORKDIR}"/clang || die "Failed to create clang directory"
+ tar xf "${DISTDIR}/chromium-clang-${BUNDLED_CLANG_VER}.tar.xz" -C "${WORKDIR}/clang" || die "Failed to unpack Clang"
+ einfo "Unpacking bundled Rust ..."
+ local rust_dir="${WORKDIR}/rust-toolchain"
+ mkdir -p "${rust_dir}" || die "Failed to create rust toolchain directory"
+ tar xf "${DISTDIR}/chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz" -C "${rust_dir}" ||
+ die "Failed to unpack Rust"
+ fi
+
+ if use ppc64; then
+ unpack chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+ fi
+
+ # This is a dirty hack, but we need rollup to build successfully and it's proving to be challenging
+ # to build locally due to deps
+ unpack rollup-wasm-node-${ROLLUP_VER}.tgz
+}
+
+remove_compiler_builtins() {
+ # We can't use the bundled compiler builtins with the system toolchain
+ # We used to `grep` then `sed`, but it was indirect. Combining the two into a single
+ # `awk` command is more efficient and lets us document the logic more clearly.
+
+ local pattern=' configs += [ "//build/config/clang:compiler_builtins" ]'
+ local target='build/config/compiler/BUILD.gn'
+
+ local tmpfile
+ tmpfile=$(mktemp) || die "Failed to create temporary file."
+
+ if awk -v pat="${pattern}" '
+ BEGIN {
+ match_found = 0
+ }
+
+ # If the delete countdown is active, decrement it and skip to the next line.
+ d > 0 { d--; next }
+
+ # If the current line matches the pattern...
+ $0 == pat {
+ match_found = 1 # ...set our flag to true.
+ d = 2 # Set delete counter for this line and the next two.
+ prev = "" # Clear the buffered previous line so it is not printed.
+ next
+ }
+
+ # For any other line, print the buffered previous line.
+ NR > 1 { print prev }
+
+ # Buffer the current line to be printed on the next cycle.
+ { prev = $0 }
+
+ END {
+ # Print the last line if it was not part of a deleted block.
+ if (d == 0) { print prev }
+
+ # If the pattern was never found, exit with a failure code.
+ if (match_found == 0) {
+ exit 1
+ }
+ }
+ ' "${target}" > "${tmpfile}"; then
+ # AWK SUCCEEDED (exit code 0): The pattern was found and edited.
+ # This is to avoid gawk's `-i inplace` option which users complain about.
+ mv "${tmpfile}" "${target}"
+ else
+ # AWK FAILED (exit code 1): The pattern was not found.
+ rm -f "${tmpfile}"
+ die "Awk patch failed: Pattern not found in ${target}."
+ fi
+}
+
+src_prepare() {
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # We'll fill this in as we go. Patches go in chromium-patches.
+ local PATCHES=()
+
+ PATCHES+=( "${WORKDIR}/chromium-patches-${PATCH_V}/common/" )
+
+ # https://issues.chromium.org/issues/442698344
+ # Unreleased fontconfig changed magic numbers and google have rolled to this version
+ if has_version "<=media-libs/fontconfig-2.17.1"; then
+ PATCHES+=( "${FILESDIR}/chromium-142-work-with-old-fontconfig.patch" )
+ fi
+
+ if use bundled-toolchain; then
+ # We need to symlink the toolchain into the expected location
+ einfo "Symlinking Clang toolchain to expected location ..."
+ mkdir -p third_party/llvm-build/ || die "Failed to create llvm-build directory"
+ # the 'Chromium Linux Tarballs' seem to already have 'Release+Asserts/{lib,bin}'; not sure if this is an
+ # upstream change - we're using the same scripts to build, theoretically. We'll still attempt to create
+ # llvm-build, but we'll rm Release+Asserts and symlink directly.
+ if [[ -d third_party/llvm-build/Release+Asserts ]]; then
+ rm -r third_party/llvm-build/Release+Asserts || die "Failed to remove third_party/llvm-build/Release+Asserts"
+ fi
+ ln -s "${WORKDIR}"/clang third_party/llvm-build/Release+Asserts || die "Failed to bundle Clang"
+ einfo "Symlinking Rust toolchain to expected location ..."
+ # As above, so below
+ if [[ -d third_party/rust-toolchain ]]; then
+ rm -r third_party/rust-toolchain || die "Failed to remove third_party/rust-toolchain"
+ fi
+ ln -s "${WORKDIR}"/rust-toolchain third_party/rust-toolchain || die "Failed to bundle rust"
+ cp "${WORKDIR}"/rust-toolchain/VERSION \
+ "${WORKDIR}"/rust-toolchain/INSTALLED_VERSION || die "Failed to set rust version"
+ else
+ # We don't need our toolchain patches if we're using the official toolchain
+
+ # Copium patches go here.
+ PATCHES+=(
+ "${WORKDIR}/copium/cr143-libsync-__BEGIN_DECLS.patch"
+ )
+
+ # Automate conditional application of chromium-patches
+ # The directory structure is expected to be something like:
+ # chromium-patches-145/
+ # ├── toolchain/
+ # │ ├── cr123-foo.patch
+ # │ └── cr135-bar.patch
+ # ├── llvm/
+ # │ ├── cr144-baz.patch
+ # │ └── lt-23/
+ # │ └── cr145-bleeding-edge-llvm-feature.patch
+ # Where `lt-23` means "apply this patch if the LLVM version is less than 23".
+ # Only categories in `slot_map` will be checked for version constraints.
+ shopt -s nullglob
+ local -A slot_map=( [llvm]="${LLVM_SLOT}" [rust]="${RUST_SLOT}" )
+
+ for category in "${WORKDIR}/chromium-patches-${PATCH_V}"/*/; do
+ local category_name="${category%/}"
+ category_name="${category_name##*/}"
+
+ # Skip arch-specific categories
+ if [[ "${category_name}" == "ppc64le" ]]; then
+ use ppc64 || continue
+ fi
+
+ # We applied common patches above, no need to apply them again here
+ [[ "${category_name}" == "common" ]] && continue
+
+ # Unconditional patches for this category
+ PATCHES+=( "${category}"*.patch )
+
+ # Version-constrained subdirectories (e.g., llvm/lt-23/)
+ for constraint_dir in "${category}"*/; do
+ local dir_name="${constraint_dir%/}"
+ dir_name="${dir_name##*/}"
+ if [[ "${dir_name}" =~ ^lt-(.*)$ && -v slot_map[${category_name}] ]]; then
+ ver_test "${slot_map[${category_name}]}" -lt "${BASH_REMATCH[1]}" &&
+ PATCHES+=( "${constraint_dir}"*.patch )
+ fi
+ done
+ done
+
+ shopt -u nullglob
+
+ # Strictly speaking this doesn't need to be gated (no bundled toolchain for ppc64); it keeps the logic together
+ if use ppc64; then
+ local patchset_dir="${WORKDIR}/openpower-patches-${PPC64_HASH}/patches"
+ # patch causes build errors on 4K page systems (https://bugs.gentoo.org/show_bug.cgi?id=940304)
+ local page_size_patch="ppc64le/third_party/use-sysconf-page-size-on-ppc64.patch"
+ local isa_3_patch="ppc64le/core/baseline-isa-3-0.patch"
+ # Apply the OpenPOWER patches (check for page size and isa 3.0)
+ openpower_patches=( $(grep -E "^ppc64le|^upstream" "${patchset_dir}/series" | grep -v "${page_size_patch}" |
+ grep -v "${isa_3_patch}" || die) )
+ for patch in "${openpower_patches[@]}"; do
+ PATCHES+=( "${patchset_dir}/${patch}" )
+ done
+ if [[ $(getconf PAGESIZE) == 65536 ]]; then
+ PATCHES+=( "${patchset_dir}/${page_size_patch}" )
+ fi
+ # We use vsx3 as a proxy for 'want isa3.0' (POWER9)
+ if use cpu_flags_ppc_vsx3 ; then
+ PATCHES+=( "${patchset_dir}/${isa_3_patch}" )
+ fi
+ fi
+
+ remove_compiler_builtins
+
+ # We can't rely on the eselect'd Rust to actually include rustfmt, so we'll point to the selected slot specifically.
+ local suffix=""
+ if [[ "${RUST_TYPE}" == "binary" ]]; then
+ suffix="-bin-${RUST_SLOT}"
+ else
+ suffix="-${RUST_SLOT}"
+ fi
+ sed -i "s|/bin/rustfmt|/bin/rustfmt${suffix}|g" build/rust/rust_bindgen_generator.gni ||
+ die "Failed to update rustfmt path"
+
+ fi
+
+ # Do this before we apply patches since (e.g.) ppc64 needs to patch rollup and it's easier in ${S}
+ einfo "Moving rollup wasm-node package into place ..."
+ mkdir -p third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+ die "Failed to create node_modules/@rollup/wasm-node"
+ mv "${WORKDIR}"/package/* third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+ die "Failed to move rollup package"
+
+ default
+
+ # Sanity check esbuild version before we start removing files.
+ # We _could_ patch the version check out - in theory esbuild upstream are being super conservative after
+ # arch(AUR) packaged an `esbuild` binary and set ESBUILD_BINARY_PATH=/usr/bin/esbuild, causing much breakage,
+ # but this is fine too and exactly matches what upstream are expecting.
+ # https://github.com/evanw/esbuild/issues/2894
+ local esbuild_js="${S}/third_party/devtools-frontend/src/node_modules/esbuild/lib/main.js"
+ local found
+ found=$(awk -F'"' '/if \(binaryVersion !==/ {print $2}' "${esbuild_js}")
+ if [[ "${found}" != "${ESBUILD_VER}" ]]; then
+ die "esbuild version mismatch: expected ${ESBUILD_VER}, found ${found}"
+ fi
+
+ elog "Removing bundled binaries from source tree ..."
+ # Purge bundled ELF files: These are non-portable and will cause issues if used instead of system versions.
+ # Use `--wasm` to also remove WebAssembly binaries, if desired - they're portable so shouldn't break builds.
+ ${EPYTHON} "${FILESDIR}/bin-finder.py" --elf "${S}" | awk '{print $1}' | xargs rm -f ||
+ die "Failed to remove bundled binaries"
+
+ # And now we restore any that we actually need, from the host system
+ local esbuild_path="${S}/third_party/devtools-frontend/src/third_party/esbuild"
+ local -A restore_list=(
+ ["/usr/bin/esbuild-${ESBUILD_VER}"]="${esbuild_path}/esbuild"
+ ["/usr/bin/gperf"]="${S}/third_party/gperf/cipd/bin/gperf"
+ ["/usr/bin/node"]="${S}/third_party/node/linux/node-linux-x64/bin/node"
+ )
+
+ for src in "${!restore_list[@]}"; do
+ dst="${restore_list[${src}]}"
+ if [[ -f "${src}" ]]; then
+ einfo "Symlinking ${src} ..."
+ # Make sure the parent dir exists; some tarballs don't include (e.g.) node's bindir
+ mkdir -p "$(dirname "${dst}")" || die "Failed to create directory for ${dst}"
+ ln -s "${src}" "${dst}" || die "Failed to symlink ${dst} from ${src}"
+ if [[ ! -L "${dst}" || "$(readlink -f "${dst}")" != "${src}" ]]; then
+ die "Symlink verification failed for ${dst} -> ${src}"
+ fi
+ else
+ die "Expected to find ${src} to restore ${dst}, but it does not exist."
+ fi
+ done
+
+ # adjust python interpreter version
+ sed -i -e "s|\(^script_executable = \).*|\1\"${EPYTHON}\"|g" .gn || die
+
+ # Use the system copy of hwdata's usb.ids; upstream is woefully out of date (2015!)
+ sed 's|//third_party/usb_ids/usb.ids|/usr/share/hwdata/usb.ids|g' \
+ -i services/device/public/cpp/usb/BUILD.gn || die "Failed to set system usb.ids path"
+
+ # remove_bundled_libraries.py walks the source tree and looks for paths containing the substring 'third_party'
+ # whitelist matches use the right-most matching path component, so we need to whitelist from that point down.
+ local keeplibs=(
+ base/third_party/cityhash
+ base/third_party/double_conversion
+ base/third_party/icu
+ base/third_party/nspr
+ base/third_party/superfasthash
+ base/third_party/symbolize
+ base/third_party/xdg_user_dirs
+ buildtools/third_party/libc++
+ buildtools/third_party/libc++abi
+ net/third_party/mozilla_security_manager
+ net/third_party/quic
+ net/third_party/uri_template
+ third_party/abseil-cpp
+ third_party/angle
+ third_party/angle/src/common/third_party/xxhash
+ third_party/angle/src/third_party/ceval
+ third_party/angle/src/third_party/libXNVCtrl
+ third_party/angle/src/third_party/volk
+ third_party/anonymous_tokens
+ third_party/apple_apsl
+ third_party/axe-core
+ third_party/bidimapper
+ third_party/blink
+ third_party/boringssl
+ third_party/boringssl/src/third_party/fiat
+ third_party/breakpad
+ third_party/breakpad/breakpad/src/third_party/curl
+ third_party/brotli
+ third_party/catapult
+ third_party/catapult/common/py_vulcanize/third_party/rcssmin
+ third_party/catapult/common/py_vulcanize/third_party/rjsmin
+ third_party/catapult/third_party/beautifulsoup4-4.9.3
+ third_party/catapult/third_party/html5lib-1.1
+ third_party/catapult/third_party/polymer
+ third_party/catapult/third_party/six
+ third_party/catapult/third_party/typ
+ third_party/catapult/tracing/third_party/d3
+ third_party/catapult/tracing/third_party/gl-matrix
+ third_party/catapult/tracing/third_party/jpeg-js
+ third_party/catapult/tracing/third_party/jszip
+ third_party/catapult/tracing/third_party/mannwhitneyu
+ third_party/catapult/tracing/third_party/oboe
+ third_party/catapult/tracing/third_party/pako
+ third_party/ced
+ third_party/cld_3
+ third_party/closure_compiler
+ third_party/compiler-rt # Since M137 atomic is required; we could probably unbundle this as a target of opportunity.
+ third_party/content_analysis_sdk
+ third_party/cpuinfo
+ third_party/crabbyavif
+ third_party/crashpad
+ third_party/crashpad/crashpad/third_party/lss
+ third_party/crashpad/crashpad/third_party/zlib
+ third_party/crc32c
+ third_party/cros_system_api
+ third_party/d3
+ third_party/dav1d
+ third_party/dawn
+ third_party/dawn/third_party/gn/webgpu-cts
+ third_party/dawn/third_party/OpenGL-Registry
+ third_party/dawn/third_party/renderdoc
+ third_party/dawn/third_party/webgpu-headers
+ third_party/depot_tools
+ third_party/devscripts
+ third_party/devtools-frontend
+ third_party/devtools-frontend/src/front_end/third_party/acorn
+ third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+ third_party/devtools-frontend/src/front_end/third_party/axe-core
+ third_party/devtools-frontend/src/front_end/third_party/chromium
+ third_party/devtools-frontend/src/front_end/third_party/codemirror
+ third_party/devtools-frontend/src/front_end/third_party/csp_evaluator
+ third_party/devtools-frontend/src/front_end/third_party/diff
+ third_party/devtools-frontend/src/front_end/third_party/i18n
+ third_party/devtools-frontend/src/front_end/third_party/intl-messageformat
+ third_party/devtools-frontend/src/front_end/third_party/json5
+ third_party/devtools-frontend/src/front_end/third_party/legacy-javascript
+ third_party/devtools-frontend/src/front_end/third_party/lighthouse
+ third_party/devtools-frontend/src/front_end/third_party/lit
+ third_party/devtools-frontend/src/front_end/third_party/marked
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/mitt
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/parsel-js
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/rxjs
+ third_party/devtools-frontend/src/front_end/third_party/source-map-scopes-codec
+ third_party/devtools-frontend/src/front_end/third_party/third-party-web
+ third_party/devtools-frontend/src/front_end/third_party/vscode.web-custom-data
+ third_party/devtools-frontend/src/front_end/third_party/wasmparser
+ third_party/devtools-frontend/src/front_end/third_party/web-vitals
+ third_party/devtools-frontend/src/third_party
+ third_party/dom_distiller_js
+ third_party/dragonbox
+ third_party/eigen3
+ third_party/emoji-segmenter
+ third_party/farmhash
+ third_party/fast_float
+ third_party/fdlibm
+ third_party/federated_compute/chromium/fcp/confidentialcompute
+ third_party/federated_compute/src/fcp/base
+ third_party/federated_compute/src/fcp/confidentialcompute
+ third_party/federated_compute/src/fcp/protos/confidentialcompute
+ third_party/federated_compute/src/fcp/protos/federatedcompute
+ third_party/ffmpeg
+ third_party/fft2d
+ third_party/flatbuffers
+ third_party/fp16
+ third_party/freetype
+ third_party/fusejs
+ third_party/fxdiv
+ third_party/gemmlowp
+ third_party/google_input_tools
+ third_party/google_input_tools/third_party/closure_library
+ third_party/google_input_tools/third_party/closure_library/third_party/closure
+ third_party/googletest
+ third_party/gperf # We symlink system gperf, but this will purge the symlink since we tidy up afterwards.
+ third_party/highway
+ third_party/hunspell
+ third_party/ink_stroke_modeler/src/ink_stroke_modeler
+ third_party/ink_stroke_modeler/src/ink_stroke_modeler/internal
+ third_party/ink/src/ink/brush
+ third_party/ink/src/ink/color
+ third_party/ink/src/ink/geometry
+ third_party/ink/src/ink/rendering
+ third_party/ink/src/ink/rendering/skia/common_internal
+ third_party/ink/src/ink/rendering/skia/native
+ third_party/ink/src/ink/rendering/skia/native/internal
+ third_party/ink/src/ink/strokes
+ third_party/ink/src/ink/types
+ third_party/inspector_protocol
+ third_party/ipcz
+ third_party/jinja2
+ third_party/jsoncpp
+ third_party/khronos
+ third_party/lens_server_proto
+ third_party/leveldatabase
+ third_party/libaddressinput
+ third_party/libaom
+ third_party/libaom/source/libaom/third_party/fastfeat
+ third_party/libaom/source/libaom/third_party/vector
+ third_party/libaom/source/libaom/third_party/x86inc
+ third_party/libc++
+ third_party/libdrm
+ third_party/libgav1
+ third_party/libjingle
+ third_party/libpfm4
+ third_party/libphonenumber
+ third_party/libpng
+ third_party/libsecret
+ third_party/libsrtp
+ third_party/libsync
+ third_party/libtess2/libtess2
+ third_party/libtess2/src/Include
+ third_party/libtess2/src/Source
+ third_party/liburlpattern
+ third_party/libva_protected_content
+ third_party/libvpx
+ third_party/libvpx/source/libvpx/third_party/x86inc
+ third_party/libwebm
+ third_party/libx11
+ third_party/libxcb-keysyms
+ third_party/libxml/chromium
+ third_party/libyuv
+ third_party/libzip
+ third_party/lit
+ third_party/llvm-libc
+ third_party/llvm-libc/src/shared/
+ third_party/lottie
+ third_party/lss
+ third_party/lzma_sdk
+ third_party/mako
+ third_party/markupsafe
+ third_party/material_color_utilities
+ third_party/metrics_proto
+ third_party/minigbm
+ third_party/ml_dtypes
+ third_party/modp_b64
+ third_party/nasm
+ third_party/nearby
+ third_party/neon_2_sse
+ third_party/node
+ third_party/oak/chromium/proto
+ third_party/oak/chromium/proto/attestation
+ third_party/omnibox_proto
+ third_party/one_euro_filter
+ third_party/openscreen
+ third_party/openscreen/src/third_party/
+ third_party/openscreen/src/third_party/tinycbor/src/src
+ third_party/opus
+ third_party/ots
+ third_party/pdfium
+ third_party/pdfium/third_party/agg23
+ third_party/pdfium/third_party/bigint
+ third_party/pdfium/third_party/freetype
+ third_party/pdfium/third_party/lcms
+ third_party/pdfium/third_party/libopenjpeg
+ third_party/pdfium/third_party/libtiff
+ third_party/perfetto
+ third_party/perfetto/protos/third_party/chromium
+ third_party/perfetto/protos/third_party/pprof
+ third_party/perfetto/protos/third_party/primes
+ third_party/perfetto/protos/third_party/simpleperf
+ third_party/pffft
+ third_party/ply
+ third_party/polymer
+ third_party/private_membership
+ third_party/private-join-and-compute
+ third_party/protobuf
+ third_party/protobuf/third_party/utf8_range
+ third_party/pthreadpool
+ third_party/puffin
+ third_party/pyjson5
+ third_party/pyyaml
+ third_party/rapidhash
+ third_party/re2
+ third_party/readability
+ third_party/rnnoise
+ third_party/rust
+ third_party/ruy
+ third_party/s2cellid
+ third_party/search_engines_data
+ third_party/securemessage
+ third_party/selenium-atoms
+ third_party/sentencepiece
+ third_party/sentencepiece/src/third_party/darts_clone
+ third_party/shell-encryption
+ third_party/simdutf
+ third_party/simplejson
+ third_party/six
+ third_party/skia
+ third_party/skia/include/third_party/vulkan
+ third_party/smhasher
+ third_party/snappy
+ third_party/spirv-headers
+ third_party/spirv-tools
+ third_party/sqlite
+ third_party/swiftshader
+ third_party/swiftshader/third_party/astc-encoder
+ third_party/swiftshader/third_party/llvm-subzero
+ third_party/swiftshader/third_party/marl
+ third_party/swiftshader/third_party/SPIRV-Headers/include/spirv
+ third_party/swiftshader/third_party/SPIRV-Tools
+ third_party/swiftshader/third_party/subzero
+ third_party/tensorflow_models
+ third_party/tensorflow-text
+ third_party/tflite
+ third_party/tflite/src/third_party/fft2d
+ third_party/tflite/src/third_party/xla/third_party/tsl
+ third_party/tflite/src/third_party/xla/xla/tsl/framework
+ third_party/tflite/src/third_party/xla/xla/tsl/lib/random
+ third_party/tflite/src/third_party/xla/xla/tsl/platform
+ third_party/tflite/src/third_party/xla/xla/tsl/protobuf
+ third_party/tflite/src/third_party/xla/xla/tsl/util
+ third_party/ukey2
+ third_party/utf
+ third_party/vulkan
+ third_party/wayland
+ third_party/webdriver
+ third_party/webgpu-cts
+ third_party/webrtc
+ third_party/webrtc/common_audio/third_party/ooura
+ third_party/webrtc/common_audio/third_party/spl_sqrt_floor
+ third_party/webrtc/modules/third_party/fft
+ third_party/webrtc/modules/third_party/g711
+ third_party/webrtc/modules/third_party/g722
+ third_party/widevine
+ third_party/woff2
+ third_party/wuffs
+ third_party/x11proto
+ third_party/xcbproto
+ third_party/xnnpack
+ third_party/zlib/google
+ third_party/zxcvbn-cpp
+ url/third_party/mozilla
+ v8/third_party/glibc
+ v8/third_party/inspector_protocol
+ v8/third_party/rapidhash-v8
+ v8/third_party/siphash
+ v8/third_party/utf8-decoder
+ v8/third_party/v8
+ v8/third_party/valgrind
+
+ # gyp -> gn leftovers
+ third_party/speech-dispatcher
+ third_party/usb_ids
+ )
+
+ if use rar; then
+ keeplibs+=( third_party/unrar )
+ fi
+
+ if use test; then
+ keeplibs+=(
+ third_party/breakpad/breakpad/src/processor
+ third_party/fuzztest
+ third_party/google_benchmark/src/include/benchmark
+ third_party/google_benchmark/src/src
+ third_party/test_fonts
+ third_party/test_fonts/fontconfig
+ third_party/test_fonts/test_fonts
+ )
+ fi
+
+ # USE=system-*
+ if ! use system-harfbuzz; then
+ keeplibs+=( third_party/harfbuzz )
+ fi
+
+ if ! use system-icu; then
+ keeplibs+=( third_party/icu )
+ fi
+
+ if ! use system-zstd; then
+ keeplibs+=( third_party/zstd )
+ fi
+
+ # Arch-specific
+ if use arm64 || use ppc64 ; then
+ keeplibs+=( third_party/swiftshader/third_party/llvm-10.0 )
+ fi
+ # we need to generate ppc64 stuff because upstream does not ship it yet
+ # it has to be done before unbundling.
+ if use ppc64; then
+ pushd third_party/libvpx >/dev/null || die
+ mkdir -p source/config/linux/ppc64 || die
+ # requires git and clang, bug #832803
+ # Revert https://chromium.googlesource.com/chromium/src/+/b463d0f40b08b4e896e7f458d89ae58ce2a27165%5E%21/third_party/libvpx/generate_gni.sh
+ # and https://chromium.googlesource.com/chromium/src/+/71ebcbce867dd31da5f8b405a28fcb0de0657d91%5E%21/third_party/libvpx/generate_gni.sh
+ # since we're not in a git repo
+ sed -i -e "s|^update_readme||g; s|clang-format|${EPREFIX}/bin/true|g; /^git -C/d; /git cl/d; /cd \$BASE_DIR\/\$LIBVPX_SRC_DIR/ign format --in-place \$BASE_DIR\/BUILD.gn\ngn format --in-place \$BASE_DIR\/libvpx_srcs.gni" \
+ generate_gni.sh || die
+ ./generate_gni.sh || die
+ popd >/dev/null || die
+
+ pushd third_party/ffmpeg >/dev/null || die
+ cp libavcodec/ppc/h264dsp.c libavcodec/ppc/h264dsp_ppc.c || die
+ cp libavcodec/ppc/h264qpel.c libavcodec/ppc/h264qpel_ppc.c || die
+ popd >/dev/null || die
+ fi
+
+ # Sanity check keeplibs, on major version bumps it is often necessary to update this list
+ # and this enables us to hit them all at once.
+ # There are some entries that need to be whitelisted (TODO: Why? The file is understandable, the rest seem odd)
+ whitelist_libs=(
+ net/third_party/quic
+ third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+ third_party/libjingle
+ third_party/mesa
+ third_party/skia/third_party/vulkan
+ third_party/vulkan
+ )
+ local not_found_libs=()
+ for lib in "${keeplibs[@]}"; do
+ if [[ ! -d "${lib}" ]] && ! has "${lib}" "${whitelist_libs[@]}"; then
+ not_found_libs+=( "${lib}" )
+ fi
+ done
+
+ if [[ ${#not_found_libs[@]} -gt 0 ]]; then
+ eerror "The following \`keeplibs\` directories were not found in the source tree:"
+ for lib in "${not_found_libs[@]}"; do
+ eerror " ${lib}"
+ done
+ die "Please update the ebuild."
+ fi
+
+ # Remove most bundled libraries. Some are still needed.
+ einfo "Unbundling third-party libraries ..."
+ build/linux/unbundle/remove_bundled_libraries.py "${keeplibs[@]}" --do-remove || die
+
+ # Interferes with our bundled clang path; we don't want stripped binaries anyway.
+ sed -i -e 's|${clang_base_path}/bin/llvm-strip|/bin/true|g' \
+ -e 's|${clang_base_path}/bin/llvm-objcopy|/bin/true|g' \
+ build/linux/strip_binary.gni || die
+}
+
+chromium_configure() {
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # 974899: sometimes people try to build with a non-Unicode locale and python gets very upset
+ python_export_utf8_locale || die "Chromium builds require a UTF-8 locale."
+
+ # Bug 491582.
+ export TMPDIR="${WORKDIR}/temp"
+ mkdir -p -m 755 "${TMPDIR}" || die
+
+ # https://bugs.gentoo.org/654216
+ addpredict /dev/dri/ #nowarn
+
+ # Use system-provided libraries.
+ # TODO: freetype -- remove sources (https://bugs.chromium.org/p/pdfium/issues/detail?id=733).
+ # TODO: use_system_hunspell (upstream changes needed).
+ # TODO: use_system_protobuf (bug #525560).
+ # TODO: use_system_sqlite (http://crbug.com/22208).
+
+ # libevent: https://bugs.gentoo.org/593458
+ local gn_system_libraries=(
+ flac
+ fontconfig
+ freetype
+ # Need harfbuzz_from_pkgconfig target
+ #harfbuzz-ng
+ libjpeg
+ libwebp
+ libxml
+ libxslt
+ openh264
+ zlib
+ )
+ if use system-icu; then
+ gn_system_libraries+=( icu )
+ fi
+
+ if use system-zstd; then
+ gn_system_libraries+=( zstd )
+ fi
+
+ build/linux/unbundle/replace_gn_files.py --system-libraries "${gn_system_libraries[@]}" ||
+ die "Failed to replace GN files for system libraries"
+
+ # TODO 131: The above call clobbers `enable_freetype = true` in the freetype gni file
+ # drop the last line, then append the freetype line and a new curly brace to end the block
+ local freetype_gni="build/config/freetype/freetype.gni"
+ sed -i -e '$d' ${freetype_gni} || die
+ echo " enable_freetype = true" >> ${freetype_gni} || die
+ echo "}" >> ${freetype_gni} || die
+
+ if use !custom-cflags; then
+ replace-flags "-Os" "-O2"
+ strip-flags
+ # Debug info section overflows without component build
+ # Prevent linker from running out of address space, bug #471810 .
+ filter-flags "-g*"
+ # 949123: Several multimedia components explicitly build with specific CFLAGS and
+ # use runtime detection to enable optimisations; unfortunately any of our CFLAGS are suffixed
+ # to the end of the command line, which causes build failures.
+ use arm64 && filter-flags "-march*" "-mtune*" "-mcpu*"
+ fi
+
+ # We don't use the same clang version as upstream, and with -Werror
+ # we need to make sure that we don't get superfluous warnings.
+ append-flags -Wno-unknown-warning-option
+ if tc-is-cross-compiler; then # can you cross-compile with the bundled toolchain?
+ export BUILD_CXXFLAGS+=" -Wno-unknown-warning-option"
+ export BUILD_CFLAGS+=" -Wno-unknown-warning-option"
+ fi
+
+ # Start building our GN options
+ local myconf_gn=() # Tip: strings must be quoted, bools or numbers are fine
+
+ if use !bundled-toolchain; then
+ # We already forced the "correct" clang via pkg_setup
+
+ if tc-is-cross-compiler; then
+ CC="${CC} -target ${CHOST} --sysroot ${ESYSROOT}"
+ CXX="${CXX} -target ${CHOST} --sysroot ${ESYSROOT}"
+ BUILD_AR=${AR}
+ BUILD_CC=${CC}
+ BUILD_CXX=${CXX}
+ BUILD_NM=${NM}
+ fi
+
+ # Make sure the build system will use the right tools, bug #340795.
+ tc-export AR CC CXX NM
+
+ strip-unsupported-flags
+ append-ldflags -Wl,--undefined-version # https://bugs.gentoo.org/918897#c32
+
+ myconf_gn+=(
+ "is_clang=true"
+ "clang_use_chrome_plugins=false"
+ "use_clang_modules=false" # M141 enables this for the linux platform by default.
+ "use_lld=true"
+ 'custom_toolchain="//build/toolchain/linux/unbundle:default"'
+ # From M127 we need to provide a location for libclang.
+ # We patch this in for gentoo - see chromium-*-bindgen-custom-toolchain.patch
+ # rust_bindgen_root = directory with `bin/bindgen` beneath it.
+ # We don't need to set 'clang_base_path' for anything in our build
+ # and it defaults to the google toolchain location. Instead provide a location
+ # to where system clang lives so that bindgen can find system headers (e.g. stddef.h)
+ "bindgen_libclang_path=\"$(get_llvm_prefix)/$(get_libdir)\""
+ "clang_base_path=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/\""
+ "rust_bindgen_root=\"${EPREFIX}/usr/\""
+ "rust_sysroot_absolute=\"$(get_rust_prefix)\""
+ "rustc_version=\"${RUST_SLOT}\""
+ )
+
+ if ! tc-is-cross-compiler; then
+ myconf_gn+=( 'host_toolchain="//build/toolchain/linux/unbundle:default"' )
+ else
+ tc-export BUILD_{AR,CC,CXX,NM}
+ myconf_gn+=(
+ 'host_toolchain="//build/toolchain/linux/unbundle:host"'
+ 'v8_snapshot_toolchain="//build/toolchain/linux/unbundle:host"'
+ "host_pkg_config=\"$(tc-getBUILD_PKG_CONFIG)\""
+ "pkg_config=\"$(tc-getPKG_CONFIG)\""
+ )
+
+ # setup cups-config, build system only uses --libs option
+ if use cups; then
+ mkdir "${T}/cups-config" || die
+ cp "${ESYSROOT}/usr/bin/${CHOST}-cups-config" "${T}/cups-config/cups-config" || die
+ export PATH="${PATH}:${T}/cups-config"
+ fi
+
+ # Don't inherit PKG_CONFIG_PATH from environment
+ local -x PKG_CONFIG_PATH=
+ fi
+
+ fi # !bundled-toolchain
+
+ local myarch
+ myarch="$(tc-arch)"
+ case ${myarch} in
+ amd64)
+ # Bug 530248, 544702, 546984, 853646.
+ use !custom-cflags && filter-flags -mno-mmx -mno-sse2 -mno-ssse3 -mno-sse4.1 \
+ -mno-avx -mno-avx2 -mno-fma -mno-fma4 -mno-xop -mno-sse4a
+ myconf_gn+=( 'target_cpu="x64"' )
+ ;;
+ arm64)
+ myconf_gn+=( 'target_cpu="arm64"' )
+ ;;
+ ppc64)
+ myconf_gn+=( 'target_cpu="ppc64"' )
+ ;;
+ *)
+ die "Failed to determine target arch, got '${myarch}'."
+ ;;
+ esac
+
+ # Common options
+
+ myconf_gn+=(
+ # Disable code formating of generated files
+ "blink_enable_generated_code_formatting=false"
+ # enable DCHECK with USE=debug only, increases chrome binary size by 30%, bug #811138.
+ # DCHECK is fatal by default, make it configurable at runtime, #bug 807881.
+ "dcheck_always_on=$(usex debug true false)"
+ "dcheck_is_configurable=$(usex debug true false)"
+ # Chromium builds provided by Linux distros should disable the testing config
+ "disable_fieldtrial_testing_config=true"
+ # Custom patch: Enable building Chromium as individual channels (e.g. stable, beta, dev) that
+ # use different profile directories, desktop entries, etc. This enables slotting the ebuild.
+ "enable_channel_branding=true"
+ # 131 began laying the groundwork for replacing freetype with
+ # "Rust-based Fontations set of libraries plus Skia path rendering"
+ # We now need to opt-in
+ "enable_freetype=true"
+ "enable_hangout_services_extension=$(usex hangouts true false)"
+ # Don't need nocompile checks and GN crashes with our config (verify with modern GN)
+ "enable_nocompile_tests=false"
+ # pseudolocales are only used for testing
+ "enable_pseudolocales=false"
+ "enable_widevine=$(usex widevine true false)"
+ # Disable fatal linker warnings, bug 506268.
+ "fatal_linker_warnings=false"
+ # Set up Google API keys, see http://www.chromium.org/developers/how-tos/api-keys
+ # Note: these are for Gentoo use ONLY. For your own distribution,
+ # please get your own set of keys. Feel free to contact chromium@gentoo.org for more info.
+ # note: OAuth2 is patched in; check patchset for details.
+ 'google_api_key="AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc"'
+ # Component build isn't generally intended for use by end users. It's mostly useful
+ # for development and debugging.
+ "is_component_build=false"
+ # GN needs explicit config for Debug/Release as opposed to inferring it from build directory.
+ "is_debug=false"
+ "is_official_build=$(usex official true false)"
+ # Enable ozone wayland and/or headless support
+ "ozone_auto_platforms=false"
+ "ozone_platform_headless=true"
+ # Enables building without non-free unRAR licence
+ "safe_browsing_use_unrar=$(usex rar true false)"
+ "thin_lto_enable_optimizations=${use_lto}"
+ "treat_warnings_as_errors=false"
+ # Use in-tree libc++ (buildtools/third_party/libc++ and buildtools/third_party/libc++abi)
+ # instead of the system C++ library for C++ standard library support.
+ # default: true, but let's be explicit (forced since 120 ; USE removed 127).
+ "use_custom_libcxx=true"
+ # Enable ozone wayland and/or headless support
+ "use_ozone=true"
+ # The sysroot is the oldest debian image that chromium supports, we don't need it
+ "use_sysroot=false"
+ # See dependency logic in third_party/BUILD.gn
+ "use_system_harfbuzz=$(usex system-harfbuzz true false)"
+ "use_thin_lto=${use_lto}"
+ # Only enabled for clang, but gcc has endian macros too
+ "v8_use_libm_trig_functions=true"
+ )
+
+ if use bindist ; then
+ myconf_gn+=(
+ # If this is set to false Chromium won't be able to load any proprietary codecs
+ # even if provided with an ffmpeg capable of h264/aac decoding
+ "proprietary_codecs=true"
+ 'ffmpeg_branding="Chrome"'
+ # build ffmpeg as an external component (libffmpeg.so) that we can remove / substitute
+ "is_component_ffmpeg=true"
+ )
+ else
+ myconf_gn+=(
+ "proprietary_codecs=$(usex proprietary-codecs true false)"
+ "ffmpeg_branding=\"$(usex proprietary-codecs Chrome Chromium)\""
+ )
+ fi
+
+ if use headless; then
+ myconf_gn+=(
+ "enable_print_preview=false"
+ "enable_remoting=false"
+ 'ozone_platform="headless"'
+ "rtc_use_pipewire=false"
+ "use_alsa=false"
+ "use_cups=false"
+ "use_gio=false"
+ "use_glib=false"
+ "use_gtk=false"
+ "use_kerberos=false"
+ "use_libpci=false"
+ "use_pangocairo=false"
+ "use_pulseaudio=false"
+ "use_qt5=false"
+ "use_qt6=false"
+ "use_udev=false"
+ "use_vaapi=false"
+ "use_xkbcommon=false"
+ )
+ else
+ myconf_gn+=(
+ "gtk_version=$(usex gtk4 4 3)"
+ # link pulseaudio directly (DT_NEEDED) instead of using dlopen.
+ # helps with automated detection of ABI mismatches and prevents silent errors.
+ "link_pulseaudio=$(usex pulseaudio true false)"
+ "ozone_platform_wayland=$(usex wayland true false)"
+ "ozone_platform_x11=$(usex X true false)"
+ "ozone_platform=\"$(usex wayland wayland x11)\""
+ "rtc_use_pipewire=$(usex screencast true false)"
+ "use_cups=$(usex cups true false)"
+ "use_kerberos=$(usex kerberos true false)"
+ "use_pulseaudio=$(usex pulseaudio true false)"
+ "use_qt5=false"
+ "use_system_libffi=$(usex wayland true false)"
+ "use_system_minigbm=true"
+ "use_vaapi=$(usex vaapi true false)"
+ "use_xkbcommon=true"
+ )
+ if use qt6; then
+ local cbuild_libdir
+ cbuild_libdir="$(get_libdir)"
+ if tc-is-cross-compiler; then
+ # Hack to workaround get_libdir not being able to handle CBUILD, bug #794181
+ cbuild_libdir="$($(tc-getBUILD_PKG_CONFIG) --keep-system-libs --libs-only-L libxslt)"
+ cbuild_libdir="${cbuild_libdir:2}"
+ cbuild_libdir="${cbuild_libdir/% }"
+ fi
+ myconf_gn+=(
+ "use_qt6=true"
+ "moc_qt6_path=\"${EPREFIX}/usr/${cbuild_libdir}/qt6/libexec\""
+ )
+ else
+ myconf_gn+=( "use_qt6=false" )
+ fi
+ fi
+
+ # Explicitly disable ICU data file support for system-icu/headless builds.
+ if use system-icu || use headless; then
+ myconf_gn+=( "icu_use_data_file=false" )
+ fi
+
+ if use official; then
+ # Allow building against system libraries in official builds
+ sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \
+ tools/generate_shim_headers/generate_shim_headers.py || die
+ if use !ppc64; then
+ myconf_gn+=( "is_cfi=${use_lto}" )
+ else
+ myconf_gn+=( "is_cfi=false" ) # requires llvm-runtimes/compiler-rt-sanitizers[cfi]
+ fi
+ # Don't add symbols to build
+ myconf_gn+=( "symbol_level=0" )
+ fi
+
+ if use pgo; then
+ myconf_gn+=( "chrome_pgo_phase=${1}" )
+ if [[ "$1" == "2" ]]; then
+ myconf_gn+=( "pgo_data_path=${2}" )
+ fi
+ else
+ myconf_gn+=( "chrome_pgo_phase=0" )
+ fi
+
+ # Odds and ends
+
+ # skipping typecheck is only supported on amd64, bug #876157
+ if ! use amd64; then
+ myconf_gn+=( "devtools_skip_typecheck=false" )
+ fi
+
+ # Disable external code space for V8 for ppc64. It is disabled for ppc64
+ # by default, but cross-compiling on amd64 enables it again.
+ if tc-is-cross-compiler && use ppc64; then
+ myconf_gn+=( "v8_enable_external_code_space=false" )
+ fi
+
+ # Since we build from tarballs, we need to set the channel here so that it can be used in the build.
+ export CHROME_VERSION_EXTRA="${SLOT}"
+
+ einfo "Configuring Chromium ..."
+ set -- gn gen --args="${myconf_gn[*]}${EXTRA_GN:+ ${EXTRA_GN}}" out/Release
+ echo "$@"
+ "$@" || die "Failed to configure Chromium"
+}
+
+src_configure() {
+ chromium_configure $(usex pgo 1 0)
+}
+
+chromium_compile() {
+
+ # Final link uses lots of file descriptors.
+ ulimit -n 2048
+
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # Don't inherit PYTHONPATH from environment, bug #789021, #812689
+ local -x PYTHONPATH=
+
+ # Build mksnapshot and pax-mark it.
+ if use pax-kernel; then
+ local x
+ for x in mksnapshot v8_context_snapshot_generator code_cache_generator; do
+ if tc-is-cross-compiler; then
+ eninja -C out/Release "host/${x}"
+ pax-mark m "out/Release/host/${x}"
+ else
+ eninja -C out/Release "${x}"
+ pax-mark m "out/Release/${x}"
+ fi
+ done
+ fi
+
+ # Even though ninja autodetects number of CPUs, we respect
+ # user's options, for debugging with -j 1 or any other reason.
+ eninja -C out/Release chrome chromedriver chrome_sandbox $(use test && echo "base_unittests")
+
+ pax-mark m out/Release/chrome
+
+ # This codepath does minimal patching, so we're at the mercy of upstream
+ # CFLAGS. This is fine - we're not intending to force this on users
+ # and we do a lot of flag 'management' anyway.
+ if use bundled-toolchain; then
+ QA_FLAGS_IGNORED="
+ usr/lib64/chromium-browser/chrome
+ usr/lib64/chromium-browser/chrome-sandbox
+ usr/lib64/chromium-browser/chromedriver
+ usr/lib64/chromium-browser/chrome_crashpad_handler
+ usr/lib64/chromium-browser/libEGL.so
+ usr/lib64/chromium-browser/libGLESv2.so
+ usr/lib64/chromium-browser/libVkICD_mock_icd.so
+ usr/lib64/chromium-browser/libVkLayer_khronos_validation.so
+ usr/lib64/chromium-browser/libqt6_shim.so
+ usr/lib64/chromium-browser/libvk_swiftshader.so
+ usr/lib64/chromium-browser/libvulkan.so.1
+ "
+ fi
+}
+
+# This function is called from virtx, and must always return so that Xvfb
+# session isn't left running. If we return 1, virtx will call die().
+chromium_profile() {
+ einfo "Profiling for PGO"
+
+ pushd "${WORKDIR}/chromium-profiler-"* >/dev/null || return 1
+
+ # Remove old profdata in case profiling was interrupted.
+ rm -rf "${1}" || return 1
+
+ if ! "${EPYTHON}" ./chromium_profiler.py \
+ --chrome-executable "${S}/out/Release/chrome" \
+ --chromedriver-executable "${S}/out/Release/chromedriver.unstripped" \
+ --add-arg no-sandbox --add-arg disable-dev-shm-usage \
+ --profile-output "${1}"; then
+ eerror "Profiling failed"
+ return 1
+ fi
+
+ popd >/dev/null || return 1
+}
+
+src_compile() {
+ if use pgo; then
+ local profdata
+
+ profdata="${WORKDIR}/chromium.profdata"
+
+ if [[ ! -e "${WORKDIR}/.pgo-profiled" ]]; then
+ chromium_compile
+ virtx chromium_profile "$profdata"
+
+ touch "${WORKDIR}/.pgo-profiled" || die
+ fi
+
+ if [[ ! -e "${WORKDIR}/.pgo-phase-2-configured" ]]; then
+ # Remove phase 1 output
+ rm -r out/Release || die
+
+ chromium_configure 2 "$profdata"
+
+ touch "${WORKDIR}/.pgo-phase-2-configured" || die
+ fi
+
+ if [[ ! -e "${WORKDIR}/.pgo-phase-2-compiled" ]]; then
+ chromium_compile
+ touch "${WORKDIR}/.pgo-phase-2-compiled" || die
+ fi
+ else
+ chromium_compile
+ fi
+
+ mv out/Release/chromedriver{.unstripped,} || die
+
+ rm -f out/Release/locales/*.pak.info || die
+
+ # Generate support files (desktop file, manpage, etc.) See: #684550 #706786 #968958
+ ${EPYTHON} "${FILESDIR}/generate-support-files.py" \
+ --installdir "/usr/$(get_libdir)/chromium-browser" \
+ --channel "${SLOT}" ||
+ die "Failed to generate support files"
+}
+
+src_test() {
+ # Tests may be flaky with usersandbox, and the test runner executes significantly faster without.
+ # If you seem to be excluding too many tests for a particular milestone: comment them out, reboot, and
+ # run the tests again. If that doesn't help, try FEATURES="-usersandbox" and send it because obviously the
+ # chromium gods are not smiling upon you today. Do some runtime testing, obvs.
+ local skip_tests=(
+ # Wildcard exclusions (if all tests in a test suite are broken)
+ 'AlternateTestParams/PartitionAllocDeathTest.RepeatedAllocReturnNullDirect/*'
+ 'AlternateTestParams/PartitionAllocDeathTest.RepeatedReallocReturnNullDirect/*'
+ 'AlternateTestParams/PartitionAllocTest.*' # 200+ tests, >= 1 crashes entire test runner with usersandbox.
+ 'CheckExitCodeAfterSignalHandlerDeathTest.*'
+ 'CriticalProcessAndThreadSpotChecks/HangWatcherAnyCriticalThreadTests.*'
+ 'LazyThreadPoolTaskRunnerEnvironmentTest.*' # M142
+ 'ToolsSanityTest.BadVirtualCall*'
+ # requires en-us locale
+ SysStrings.SysNativeMBAndWide
+ SysStrings.SysNativeMBToWide
+ SysStrings.SysWideToNativeMB
+ # Specific test cases
+ CancelableEventTest.BothCancelFailureAndSucceedOccurUnderContention
+ FilePathTest.FromUTF8Unsafe_And_AsUTF8Unsafe
+ HistogramTesterTest.PumaTestUniqueSample
+ PathServiceTest.CheckedGetFailure
+ PlatformThreadTest.CanChangeThreadType
+ RawPtrTest.SetLookupUsesGetForComparison # M146 ; also broken for alpine in M144.
+ RustLogIntegrationTest.CheckAllSeverity
+ StackCanary.ChangingStackCanaryCrashesOnReturn
+ StackTraceDeathTest.StackDumpSignalHandlerIsMallocFree
+ TestLauncherTools.TruncateSnippetFocusedMatchesFatalMessagesTest
+ ThreadPoolEnvironmentConfig.CanUseBackgroundPriorityForWorker
+ # M148 Beta
+ RunUntilTestWithMockTime.ConditionOnlyObservedIfWorkIsDone
+ )
+ local test_filter="-$(IFS=:; printf '%s' "${skip_tests[*]}")"
+ # test-launcher-bot-mode enables parallelism and plain output
+ # Check individual tests with --gtest_filter=<test you want> --single-process-tests
+ ./out/Release/base_unittests --test-launcher-bot-mode \
+ --test-launcher-jobs="$(get_makeopts_jobs)" \
+ --gtest_filter="${test_filter}" || die "Tests failed!"
+}
+
+src_install() {
+ local browser_suffix
+ if [[ "${SLOT}" != "stable" ]]; then
+ browser_suffix="-${SLOT}"
+ else
+ browser_suffix=""
+ fi
+ local CHROMIUM_HOME="/usr/$(get_libdir)/chromium-browser${browser_suffix}"
+ exeinto "${CHROMIUM_HOME}"
+ doexe out/Release/chrome
+
+ newexe out/Release/chrome_sandbox chrome-sandbox
+ fperms 4755 "${CHROMIUM_HOME}/chrome-sandbox"
+
+ doexe out/Release/chromedriver
+ doexe out/Release/chrome_crashpad_handler
+
+ ozone_auto_session () {
+ use X && use wayland && ! use headless && echo true || echo false
+ }
+
+ cat <<- EOF > "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+ #!/bin/bash
+ # Wrapper to launch slotted Chromium via the chromium-common launcher script.
+ export CHROME_DESKTOP="chromium-browser${browser_suffix}.desktop"
+ export CHROME_EXEC_NAME="chromium-browser${browser_suffix}"
+ export CHROME_VERSION_EXTRA="${SLOT}"
+ export CHROME_WRAPPER="\$(readlink -f "\$0")"
+ export OZONE_AUTO_SESSION=$(ozone_auto_session)
+
+ exec /usr/libexec/chromium/chromium-launcher.sh "\$@"
+ EOF
+
+ chmod 755 "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+
+ # It is important that we name the target "chromium-browser",
+ # xdg-utils expect it; bug #355517.
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-browser${browser_suffix}
+ # keep the old symlink around for consistency
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium${browser_suffix}
+
+ dosym "${CHROMIUM_HOME}/chromedriver" /usr/bin/chromedriver${browser_suffix}
+
+ pushd out/Release/locales > /dev/null || die
+ chromium_remove_language_paks
+ popd > /dev/null || die
+
+ insinto "${CHROMIUM_HOME}"
+ doins out/Release/*.bin
+ doins out/Release/*.pak
+
+ if use bindist; then
+ # We built libffmpeg as a component library, but we can't distribute it
+ # with proprietary codec support. Remove it and make a symlink to the requested
+ # system library.
+ rm -f out/Release/libffmpeg.so \
+ || die "Failed to remove bundled libffmpeg.so (with proprietary codecs)"
+ # symlink the libffmpeg.so from either ffmpeg-chromium or ffmpeg[chromium].
+ einfo "Creating symlink to libffmpeg.so from $(usex ffmpeg-chromium ffmpeg-chromium ffmpeg[chromium])..."
+ dosym ../chromium/libffmpeg.so$(usex ffmpeg-chromium .${PV%%\.*} "") \
+ /usr/$(get_libdir)/chromium-browser/libffmpeg.so
+ fi
+
+ (
+ shopt -s nullglob
+ local files=(out/Release/*.so out/Release/*.so.[0-9])
+ [[ ${#files[@]} -gt 0 ]] && doins "${files[@]}"
+ )
+
+ if ! use system-icu && ! use headless; then
+ doins out/Release/icudtl.dat
+ fi
+
+ doins -r out/Release/locales
+ doins -r out/Release/MEIPreload
+
+ # Install vk_swiftshader_icd.json; bug #827861
+ doins out/Release/vk_swiftshader_icd.json
+
+ if [[ -d out/Release/swiftshader ]]; then
+ insinto "${CHROMIUM_HOME}/swiftshader"
+ doins out/Release/swiftshader/*.so
+ fi
+
+ # Install icons
+ local branding size
+ for size in 16 24 32 48 64 128 256 ; do
+ case ${size} in
+ 16|32) branding="chrome/app/theme/default_100_percent/chromium" ;;
+ *) branding="chrome/app/theme/chromium" ;;
+ esac
+ newicon -s ${size} "${branding}/product_logo_${size}.png" \
+ chromium-browser${browser_suffix}.png
+ done
+
+ # Install desktop entry
+ domenu out/Release/chromium-browser${browser_suffix}.desktop
+
+ # Install GNOME default application entry (bug #303100).
+ insinto /usr/share/gnome-control-center/default-apps
+ doins out/Release/chromium-browser${browser_suffix}.xml
+
+ # Install AppStream metadata
+ insinto /usr/share/appdata
+ doins out/Release/chromium-browser${browser_suffix}.appdata.xml
+
+ # Install manpage; bug #684550
+ doman out/Release/chromium-browser${browser_suffix}.1
+ dosym chromium-browser${browser_suffix}.1 /usr/share/man/man1/chromium${browser_suffix}.1
+
+ readme.gentoo_create_doc
+}
+
+pkg_postrm() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+}
+
+pkg_postinst() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+ readme.gentoo_print_elog
+
+ if use !headless && [[ -z "${REPLACING_VERSIONS}" ]]; then
+ if use vaapi; then
+ elog "Hardware-accelerated video decoding configuration:"
+ elog
+ elog "Chromium supports multiple backends for hardware acceleration. To enable one,"
+ elog " Add to CHROMIUM_FLAGS in /etc/chromium/default:"
+ elog
+ elog "1. VA-API with OpenGL (recommended for most users):"
+ elog " --enable-features=AcceleratedVideoDecodeLinuxGL"
+ elog " VaapiVideoDecoder may need to be added as well, but try without first."
+ elog
+ if use wayland; then
+ elog "2. Enhanced Wayland/EGL performance:"
+ elog " --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL"
+ elog
+ fi
+ if use X; then
+ elog "$(usex wayland "3" "2"). VA-API with Vulkan:"
+ elog " --enable-features=VaapiVideoDecoder,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE"
+ elog
+ if use wayland; then
+ elog " NOTE: Vulkan acceleration requires X11 and will not work under Wayland sessions."
+ elog " Use OpenGL-based acceleration instead when running under Wayland."
+ elog
+ fi
+ fi
+ elog "Additional options:"
+ elog " To enable hardware-accelerated encoding (if supported)"
+ elog " add 'AcceleratedVideoEncoder' to your feature list"
+ elog " VaapiIgnoreDriverChecks bypasses driver compatibility checks"
+ elog " (may be needed for newer/unsupported hardware)"
+ elog
+ else
+ elog "This Chromium build was compiled without VA-API support, which provides"
+ elog "hardware-accelerated video decoding."
+ fi
+ if use screencast; then
+ elog "Screencast is disabled by default at runtime. Either enable it"
+ elog "by navigating to chrome://flags/#enable-webrtc-pipewire-capturer"
+ elog "inside Chromium or add --enable-features=WebRTCPipeWireCapturer"
+ elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+ fi
+ if use gtk4; then
+ elog "Chromium prefers GTK3 over GTK4 at runtime. To override this"
+ elog "behavior you need to pass --gtk-version=4, e.g. by adding it"
+ elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+ fi
+ fi
+
+ if systemd_is_booted && ! [[ -f "/etc/machine-id" ]]; then
+ ewarn "The lack of an '/etc/machine-id' file on this system booted with systemd"
+ ewarn "indicates that the Gentoo handbook was not followed to completion."
+ ewarn ""
+ ewarn "Chromium is known to behave unpredictably with this system configuration;"
+ ewarn "please complete the configuration of this system before logging any bugs."
+ fi
+
+ # Stable slot doesn't change profile directory, and it's vanishingly unlikely that users will downgrade from dev.
+ if [[ -n "${REPLACING_VERSIONS}" ]]; then
+ local replacing_non_slotted=false
+ # there could be more than one PVR
+ for version in ${REPLACING_VERSIONS}; do
+ if ver_test "${version}" -le "145.0.7632.116"; then
+ replacing_non_slotted=true
+ break
+ fi
+ done
+ if ${replacing_non_slotted}; then
+ ewarn "This version of Chromium has replaced a non-slotted ebuild."
+ if [[ ${SLOT} != "stable" ]]; then
+ ewarn "This channel has its own profile directory, so your existing profile will not be used."
+ ewarn "To use your existing profile, either copy or move it to the new location."
+ ewarn "See https://wiki.gentoo.org/wiki/Chromium#Profile_Directories for more information."
+ ewarn ""
+ fi
+ ewarn "Any existing Progressive Web Apps (PWAs) will need to be reinstalled,"
+ ewarn "or have the path in the desktop files updated to point to the new wrapper script."
+ fi
+ fi
+}
diff --git a/www-client/chromium/chromium-149.0.7827.14.ebuild b/www-client/chromium/chromium-149.0.7827.14.ebuild
index 19eb42208e69..78cd5ea0c48a 100644
--- a/www-client/chromium/chromium-149.0.7827.14.ebuild
+++ b/www-client/chromium/chromium-149.0.7827.14.ebuild
@@ -40,7 +40,7 @@ CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu
sv sw ta te th tr uk ur vi zh-CN zh-TW"
LLVM_COMPAT=( 21 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
PYTHON_REQ_USE="xml(+)"
RUST_MIN_VER=1.91.0
RUST_NEEDS_LLVM="yes please"
diff --git a/www-client/chromium/chromium-149.0.7815.2.ebuild b/www-client/chromium/chromium-149.0.7827.22.ebuild
index e3ed73a95a20..78cd5ea0c48a 100644
--- a/www-client/chromium/chromium-149.0.7815.2.ebuild
+++ b/www-client/chromium/chromium-149.0.7827.22.ebuild
@@ -27,7 +27,7 @@ GN_MIN_VER=0.2374
# chromium-tools/get-chromium-toolchain-strings.py (or just use Chromicler)
# Node for M145+ should be 24.12.0 but that's not packaged in Gentoo yet. See #969145
TEST_FONT="9c07d19d9c5ee1ff94f717e6fb17e0c8c354e6f9"
-BUNDLED_CLANG_VER="llvmorg-23-init-10931-g20b6ec66-2"
+BUNDLED_CLANG_VER="llvmorg-23-init-10931-g20b6ec66-8"
BUNDLED_RUST_VER="4c4205163abcbd08948b3efab796c543ba1ea687-2"
RUST_SHORT_HASH=${BUNDLED_RUST_VER:0:10}-${BUNDLED_RUST_VER##*-}
NODE_VER="24.12.0"
@@ -40,7 +40,7 @@ CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu
sv sw ta te th tr uk ur vi zh-CN zh-TW"
LLVM_COMPAT=( 21 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
PYTHON_REQ_USE="xml(+)"
RUST_MIN_VER=1.91.0
RUST_NEEDS_LLVM="yes please"
@@ -54,7 +54,7 @@ DESCRIPTION="Open-source version of Google Chrome web browser"
HOMEPAGE="https://www.chromium.org/"
PPC64_HASH="a85b64f07b489b8c6fdb13ecf79c16c56c560fc6"
PATCH_V="${PV%%\.*}-2"
-COPIUM_COMMIT="fe1caafa06f27542c18a881348f78e984e2d9fe2"
+COPIUM_COMMIT="b00f26bb5e0781020da5f830981472a142c6baf1"
SRC_URI="https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/download/${PV}/chromium-${PV}-linux.tar.xz
https://deps.gentoo.zip/www-client/chromium/rollup-wasm-node-${ROLLUP_VER}.tgz
https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
@@ -82,11 +82,11 @@ LICENSE+=" IJG ISC LGPL-2 LGPL-2.1 MIT MPL-1.1 MPL-2.0 Ms-PL PSF-2 SGI-B-2.0 SSL
LICENSE+=" Unicode-DFS-2015 Unlicense UoI-NCSA ZLIB libtiff openssl"
LICENSE+=" rar? ( unRAR )"
-SLOT="unstable"
+SLOT="beta"
# Unstable in gentoo exists mostly to give devs some breathing room for beta/stable releases.
# It shouldn't be keyworded but adventurous users are encouraged to select it;
# there's official dev channel Google Chrome after all.
-# KEYWORDS="~amd64 ~arm64"
+KEYWORDS="~amd64 ~arm64"
IUSE_SYSTEM_LIBS="+system-harfbuzz +system-icu +system-zstd"
IUSE="+X ${IUSE_SYSTEM_LIBS} bindist bundled-toolchain cups debug ffmpeg-chromium gtk4 +hangouts headless kerberos +official pax-kernel pgo"
@@ -532,6 +532,7 @@ src_prepare() {
# Copium patches go here.
PATCHES+=(
"${WORKDIR}/copium/cr143-libsync-__BEGIN_DECLS.patch"
+ "${WORKDIR}/copium/cr149-unbundle-minizip-undo-unicode.patch"
)
# Automate conditional application of chromium-patches
@@ -975,7 +976,7 @@ src_prepare() {
# USE=system-*
if ! use system-harfbuzz; then
- keeplibs+=( third_party/harfbuzz-ng )
+ keeplibs+=( third_party/harfbuzz )
fi
if ! use system-icu; then
@@ -1050,6 +1051,9 @@ chromium_configure() {
# Calling this here supports resumption via FEATURES=keepwork
python_setup
+ # 974899: sometimes people try to build with a non-Unicode locale and python gets very upset
+ python_export_utf8_locale || die "Chromium builds require a UTF-8 locale."
+
# Bug 491582.
export TMPDIR="${WORKDIR}/temp"
mkdir -p -m 755 "${TMPDIR}" || die
diff --git a/www-client/chromium/chromium-149.0.7827.53.ebuild b/www-client/chromium/chromium-149.0.7827.53.ebuild
new file mode 100644
index 000000000000..78cd5ea0c48a
--- /dev/null
+++ b/www-client/chromium/chromium-149.0.7827.53.ebuild
@@ -0,0 +1,1749 @@
+# Copyright 2009-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+# PACKAGING NOTES
+
+# Upstream roll their bundled Clang every two weeks, and the bundled Rust
+# is rolled regularly and depends on that. While we do our best to build
+# with system Clang, we may eventually hit the point where we need to use
+# the bundled Clang due to the use of prerelease features.
+
+# USE=bundled-toolchain is intended for users who want to use the same toolchain
+# as the upstream releases. It's also a good fallback in case we fall behind
+# and need to get a release out quickly (less likely with `dev` in-tree).
+# We can't rely on it as a default since the toolchain is only shipped for x86-64;
+# other architectures will need to use system toolchain.
+
+# Since m133 we are using CI-generated tarballs from
+# https://github.com/chromium-linux-tarballs/chromium-tarballs/
+
+# These are bit-for-bit identical to the official releases, but are built
+# using an external CI system that we have some control over, in case
+# issues pop up again with official tarball generation.
+
+GN_MIN_VER=0.2374
+# chromium-tools/get-chromium-toolchain-strings.py (or just use Chromicler)
+# Node for M145+ should be 24.12.0 but that's not packaged in Gentoo yet. See #969145
+TEST_FONT="9c07d19d9c5ee1ff94f717e6fb17e0c8c354e6f9"
+BUNDLED_CLANG_VER="llvmorg-23-init-10931-g20b6ec66-8"
+BUNDLED_RUST_VER="4c4205163abcbd08948b3efab796c543ba1ea687-2"
+RUST_SHORT_HASH=${BUNDLED_RUST_VER:0:10}-${BUNDLED_RUST_VER##*-}
+NODE_VER="24.12.0"
+ESBUILD_VER="0.25.1"
+ROLLUP_VER="4.57.1" # currently manual.
+VIRTUALX_REQUIRED="pgo"
+
+CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu he
+ hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr
+ sv sw ta te th tr uk ur vi zh-CN zh-TW"
+
+LLVM_COMPAT=( 21 )
+PYTHON_COMPAT=( python3_{11..14} )
+PYTHON_REQ_USE="xml(+)"
+RUST_MIN_VER=1.91.0
+RUST_NEEDS_LLVM="yes please"
+RUST_OPTIONAL="yes" # Not actually optional, but we don't need system Rust (or LLVM) with USE=bundled-toolchain
+RUST_REQ_USE="rustfmt" # Upstream run rustfmt on bindgen output, so we need it to be available.
+
+inherit check-reqs chromium-2 desktop flag-o-matic llvm-r1 multiprocessing ninja-utils pax-utils
+inherit python-any-r1 readme.gentoo-r1 rust systemd toolchain-funcs virtualx xdg-utils
+
+DESCRIPTION="Open-source version of Google Chrome web browser"
+HOMEPAGE="https://www.chromium.org/"
+PPC64_HASH="a85b64f07b489b8c6fdb13ecf79c16c56c560fc6"
+PATCH_V="${PV%%\.*}-2"
+COPIUM_COMMIT="b00f26bb5e0781020da5f830981472a142c6baf1"
+SRC_URI="https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/download/${PV}/chromium-${PV}-linux.tar.xz
+ https://deps.gentoo.zip/www-client/chromium/rollup-wasm-node-${ROLLUP_VER}.tgz
+ https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
+ !bundled-toolchain? (
+ https://codeberg.org/selfisekai/copium/archive/${COPIUM_COMMIT}.tar.gz
+ -> chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+ )
+ bundled-toolchain? (
+ https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-${BUNDLED_CLANG_VER}.tar.xz
+ -> chromium-clang-${BUNDLED_CLANG_VER}.tar.xz
+ https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/rust-toolchain-${BUNDLED_RUST_VER}-${BUNDLED_CLANG_VER%-*}.tar.xz
+ -> chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz
+ )
+ test? (
+ https://chromium-fonts.storage.googleapis.com/${TEST_FONT} -> chromium-testfonts-${TEST_FONT:0:10}.tar.gz
+ )
+ ppc64? (
+ https://gitlab.raptorengineering.com/raptor-engineering-public/chromium/openpower-patches/-/archive/${PPC64_HASH}/openpower-patches-${PPC64_HASH}.tar.bz2 -> chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+ )
+ pgo? ( https://github.com/elkablo/chromium-profiler/releases/download/v0.2/chromium-profiler-0.2.tar )"
+
+# https://gitweb.gentoo.org/proj/chromium-tools.git/tree/get-chromium-licences.py @ 145.0.7632.76
+LICENSE="Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD BSD-2 Base64 Boost-1.0 CC-BY-3.0 CC-BY-4.0 Clear-BSD FFT2D FTL"
+LICENSE+=" IJG ISC LGPL-2 LGPL-2.1 MIT MPL-1.1 MPL-2.0 Ms-PL PSF-2 SGI-B-2.0 SSLeay SunSoft Unicode-3.0"
+LICENSE+=" Unicode-DFS-2015 Unlicense UoI-NCSA ZLIB libtiff openssl"
+LICENSE+=" rar? ( unRAR )"
+
+SLOT="beta"
+# Unstable in gentoo exists mostly to give devs some breathing room for beta/stable releases.
+# It shouldn't be keyworded but adventurous users are encouraged to select it;
+# there's official dev channel Google Chrome after all.
+KEYWORDS="~amd64 ~arm64"
+
+IUSE_SYSTEM_LIBS="+system-harfbuzz +system-icu +system-zstd"
+IUSE="+X ${IUSE_SYSTEM_LIBS} bindist bundled-toolchain cups debug ffmpeg-chromium gtk4 +hangouts headless kerberos +official pax-kernel pgo"
+IUSE+=" +proprietary-codecs pulseaudio qt6 +rar +screencast selinux test +vaapi +wayland +widevine cpu_flags_ppc_vsx3"
+RESTRICT="
+ !bindist? ( bindist )
+ !test? ( test )
+ arm64? ( test )" # Tests require CFI, which requires LTO, which is broken on arm64 with LLVM 21.
+
+REQUIRED_USE="
+ !headless? ( || ( X wayland ) )
+ pgo? ( X !wayland )
+ screencast? ( wayland )
+ ffmpeg-chromium? ( bindist proprietary-codecs )
+"
+
+COMMON_X_DEPEND="
+ x11-libs/libXcomposite:=
+ x11-libs/libXcursor:=
+ x11-libs/libXdamage:=
+ x11-libs/libXfixes:=
+ >=x11-libs/libXi-1.6.0:=
+ x11-libs/libXrandr:=
+ x11-libs/libXrender:=
+ x11-libs/libXtst:=
+ x11-libs/libxshmfence:=
+"
+
+# sys-libs/zlib: https://bugs.gentoo.org/930365; -ng is not compatible.
+# We _could_ use the bundled minizip, but that's against policy.
+COMMON_SNAPSHOT_DEPEND="
+ system-icu? ( >=dev-libs/icu-73.0:= )
+ >=dev-libs/libxml2-2.12.4:=[icu]
+ dev-libs/nspr:=
+ >=dev-libs/nss-3.26:=
+ dev-libs/libxslt:=
+ media-libs/fontconfig:=
+ >=media-libs/freetype-2.11.0-r1:=
+ system-harfbuzz? ( >=media-libs/harfbuzz-3:0=[icu(-)] )
+ media-libs/libjpeg-turbo:=
+ system-zstd? ( >=app-arch/zstd-1.5.5:= )
+ >=media-libs/libwebp-0.4.0:=
+ media-libs/mesa:=[gbm(+)]
+ >=media-libs/openh264-2.6.0:=
+ sys-libs/zlib:=
+ !headless? (
+ dev-libs/glib:2
+ >=media-libs/alsa-lib-1.0.19:=
+ pulseaudio? ( media-libs/libpulse:= )
+ sys-apps/pciutils:=
+ kerberos? ( virtual/krb5 )
+ vaapi? ( >=media-libs/libva-2.7:=[X?,wayland?] )
+ X? (
+ x11-base/xorg-proto:=
+ x11-libs/libX11:=
+ x11-libs/libxcb:=
+ x11-libs/libXext:=
+ )
+ x11-libs/libxkbcommon:=
+ wayland? (
+ dev-libs/libffi:=
+ dev-libs/wayland:=
+ screencast? ( media-video/pipewire:= )
+ )
+ )
+"
+
+COMMON_DEPEND="
+ ${COMMON_SNAPSHOT_DEPEND}
+ app-arch/bzip2:=
+ dev-libs/expat:=
+ net-misc/curl[ssl]
+ sys-apps/dbus:=
+ media-libs/flac:=
+ sys-libs/zlib:=[minizip]
+ !headless? (
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ media-libs/mesa:=[X?,wayland?]
+ virtual/udev
+ x11-libs/cairo:=
+ x11-libs/gdk-pixbuf:2
+ x11-libs/pango:=
+ cups? ( >=net-print/cups-1.3.11:= )
+ qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ X? ( ${COMMON_X_DEPEND} )
+ )
+"
+RDEPEND="${COMMON_DEPEND}
+ !www-client/chromium:0
+ >=www-client/chromium-common-2
+ !headless? (
+ || (
+ x11-libs/gtk+:3[X?,wayland?]
+ gui-libs/gtk:4[X?,wayland?]
+ )
+ qt6? ( dev-qt/qtbase:6[X?,wayland?] )
+ )
+ virtual/ttf-fonts
+ selinux? ( sec-policy/selinux-chromium )
+ bindist? (
+ !ffmpeg-chromium? ( >=media-video/ffmpeg-6.1-r1:0/58.60.60[chromium] )
+ ffmpeg-chromium? ( media-video/ffmpeg-chromium:${PV%%\.*} )
+ )
+"
+DEPEND="${COMMON_DEPEND}
+ !headless? (
+ gtk4? ( gui-libs/gtk:4[X?,wayland?] )
+ !gtk4? ( x11-libs/gtk+:3[X?,wayland?] )
+ )
+"
+
+BDEPEND="
+ ${COMMON_SNAPSHOT_DEPEND}
+ ${PYTHON_DEPS}
+ $(python_gen_any_dep '
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ ')
+ >=app-arch/gzip-1.7
+ !headless? (
+ qt6? ( dev-qt/qtbase:6 )
+ )
+ !bundled-toolchain? ( $(llvm_gen_dep '
+ llvm-core/clang:${LLVM_SLOT}
+ llvm-core/llvm:${LLVM_SLOT}
+ llvm-core/lld:${LLVM_SLOT}
+ official? (
+ !ppc64? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[cfi] )
+ ) ')
+ ${RUST_DEPEND}
+ )
+ pgo? (
+ >=dev-python/selenium-3.141.0
+ >=dev-util/web_page_replay_go-20220314
+ )
+ >=dev-util/bindgen-0.72.1
+ >=dev-build/gn-${GN_MIN_VER}
+ app-alternatives/ninja
+ dev-lang/perl
+ >=dev-util/gperf-3.2
+ dev-util/esbuild:${ESBUILD_VER}
+ dev-vcs/git
+ >=net-libs/nodejs-${NODE_VER}[inspector]
+ sys-apps/hwdata
+ >=sys-devel/bison-2.4.3
+ sys-devel/flex
+ virtual/pkgconfig
+ x11-misc/xdg-utils
+"
+
+if ! has chromium_pkg_die ${EBUILD_DEATH_HOOKS}; then
+ EBUILD_DEATH_HOOKS+=" chromium_pkg_die";
+fi
+
+DISABLE_AUTOFORMATTING="yes"
+DOC_CONTENTS="
+Some web pages may require additional fonts to display properly.
+Try installing some of the following packages if some characters
+are not displayed properly:
+- media-fonts/arphicfonts
+- media-fonts/droid
+- media-fonts/ipamonafont
+- media-fonts/noto
+- media-fonts/ja-ipafonts
+- media-fonts/takao-fonts
+- media-fonts/wqy-microhei
+- media-fonts/wqy-zenhei
+
+To fix broken icons on the Downloads page, you should install an icon
+theme that covers the appropriate MIME types, and configure this as your
+GTK+ icon theme.
+
+For native file dialogs in KDE, install kde-apps/kdialog.
+
+To make password storage work with your desktop environment you may
+have install one of the supported credentials management applications:
+- app-crypt/libsecret (GNOME)
+- kde-frameworks/kwallet (KDE)
+If you have one of above packages installed, but don't want to use
+them in Chromium, then add --password-store=basic to CHROMIUM_FLAGS
+in /etc/chromium/default.
+"
+
+python_check_deps() {
+ python_has_version "dev-python/setuptools[${PYTHON_USEDEP}]"
+}
+
+pre_build_checks() {
+ # Check build requirements: bugs #471810, #541816, #914220
+ # We're going to start doing maths here on the size of an unpacked source tarball,
+ # this should make updates easier as chromium continues to balloon in size.
+ # xz -l /var/cache/distfiles/chromium-${PV}*.tar.xz
+ local base_disk=9 # Round up
+ use test && base_disk=$((base_disk + 5))
+ local extra_disk=1 # Always include a little extra space
+ local memory=4
+ tc-is-cross-compiler && extra_disk=$((extra_disk * 2))
+ if tc-is-lto || use pgo; then
+ memory=$((memory * 2 + 1))
+ tc-is-cross-compiler && extra_disk=$((extra_disk * 2)) # Double the requirements
+ use pgo && extra_disk=$((extra_disk + 4))
+ fi
+ if is-flagq '-g?(gdb)?([1-9])'; then
+ if use custom-cflags; then
+ extra_disk=$((extra_disk + 5))
+ fi
+ memory=$((memory * 2))
+ fi
+ local CHECKREQS_MEMORY="${memory}G"
+ local CHECKREQS_DISK_BUILD="$((base_disk + extra_disk))G"
+ check-reqs_${EBUILD_PHASE_FUNC}
+}
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]]; then
+ # The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+ pre_build_checks
+ fi
+
+ if use headless; then
+ local headless_unused_flags=("cups" "kerberos" "pulseaudio" "qt6" "vaapi" "wayland")
+ for myiuse in ${headless_unused_flags[@]}; do
+ use ${myiuse} && ewarn "Ignoring USE=${myiuse}, USE=headless is set."
+ done
+ fi
+
+ if ! use bindist && use ffmpeg-chromium; then
+ ewarn "Ignoring USE=ffmpeg-chromium, USE=bindist is not set."
+ fi
+}
+
+pkg_setup() {
+ if [[ ${MERGE_TYPE} != binary ]]; then
+ # The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+ pre_build_checks
+
+ # We haven't massaged any CFLAGS yet, so we want to do this before we force CC/CXX to prevent warnings.
+ local want_lto="false"
+ tc-is-lto && want_lto="true"
+
+ # The linux:unbundle toolchain in GN grabs CC, CXX, CPP (etc) from the environment
+ # We'll set these to clang here then use llvm-utils functions to very explicitly set these
+ # to a sane value.
+ # This is effectively the 'force-clang' path if GCC support is re-added.
+ if use !bundled-toolchain; then
+ llvm-r1_pkg_setup
+ rust_pkg_setup
+
+ # Forcing clang; respect llvm_slot_x to enable selection of impl via LLVM_COMPAT
+ AR=llvm-ar
+ CPP="${CHOST}-clang++-${LLVM_SLOT} -E"
+ NM=llvm-nm
+ CC="${CHOST}-clang-${LLVM_SLOT}"
+ CXX="${CHOST}-clang++-${LLVM_SLOT}"
+ fi
+
+ use_lto="false"
+ local lto_usable="true"
+ if [[ "$want_lto" == "true" ]]; then
+ if use arm64 && [[ "${LLVM_SLOT}" -lt 22 ]]; then
+ einfo "LTO is broken with LLVM 21 on arm64, ignoring CFLAGS."
+ lto_usable="false"
+ else
+ use_lto="true"
+ fi
+ # We can rely on GN to do this for us; without this builds
+ # take significantly longer with LTO enabled.
+ filter-lto
+ fi
+
+ if [[ "$use_lto" == "false" ]] && use official && [[ "$lto_usable" == "true" ]]; then
+ einfo "USE=official selected and LTO not detected."
+ einfo "It is _highly_ recommended that LTO be enabled for performance reasons"
+ einfo "and to be consistent with the upstream \"official\" build optimisations."
+ fi
+
+ if [[ "$use_lto" == "false" ]] && use test; then
+ die "Tests require CFI which requires LTO"
+ fi
+
+ export use_lto
+
+ # 936858
+ if tc-ld-is-mold; then
+ eerror "Your toolchain is using the mold linker."
+ eerror "This is not supported by Chromium."
+ die "Please switch to a different linker."
+ fi
+
+ if tc-is-cross-compiler; then
+ use pgo && die "The pgo USE flag cannot be used when cross-compiling"
+ CPP="${CBUILD}-clang++-${LLVM_SLOT} -E"
+ fi
+
+ # I hate doing this but upstream Rust have yet to come up with a better solution for
+ # us poor packagers. Required for Split LTO units, which are required for CFI.
+ export RUSTC_BOOTSTRAP=1
+
+ # Sanity checks for development convenience
+ if ver_test $(gn --version || die) -lt ${GN_MIN_VER}; then
+ die "dev-build/gn >= ${GN_MIN_VER} is required to build this Chromium"
+ fi
+
+ # Sometimes, when adding a new LLVM slot, devs (me) forget to install an appropriate lld.
+ local lld_ver=$(ld.lld --version | awk '{split($2,a,"."); print a[1]}' || die "Failed to check lld version")
+ if [[ ${lld_ver} -lt ${LLVM_SLOT} ]]; then
+ die "Your lld version (${lld_ver}) is too old for the selected LLVM slot (${LLVM_SLOT}). Please install a newer lld or select an older LLVM slot."
+ fi
+ fi
+
+ chromium_suid_sandbox_check_kernel_config
+}
+
+src_unpack() {
+ unpack ${P}-linux.tar.xz
+ unpack chromium-patches-${PATCH_V}.tar.bz2
+ # These should only be required when we're not using the official toolchain
+ if use !bundled-toolchain; then
+ unpack chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+ fi
+
+ use pgo && unpack chromium-profiler-0.2.tar
+
+ if use test; then
+ # This just contains a bunch of font files that need to be unpacked (or moved) to the correct location.
+ local testfonts_dir="${WORKDIR}/${P}/third_party/test_fonts/test_fonts"
+ local testfonts_tar="${DISTDIR}/chromium-testfonts-${TEST_FONT:0:10}.tar.gz"
+ einfo "Unpacking test fonts ..."
+ tar xf "${testfonts_tar}" -C "${testfonts_dir}" || die "Failed to unpack testfonts"
+ fi
+
+ # We need to manually unpack this since M126 else we'd unpack one toolchain over the other.
+ # Since we're doing that anyway let's unpack to sensible locations to make symlink creation easier.
+ if use bundled-toolchain; then
+ einfo "Unpacking bundled Clang ..."
+ mkdir -p "${WORKDIR}"/clang || die "Failed to create clang directory"
+ tar xf "${DISTDIR}/chromium-clang-${BUNDLED_CLANG_VER}.tar.xz" -C "${WORKDIR}/clang" || die "Failed to unpack Clang"
+ einfo "Unpacking bundled Rust ..."
+ local rust_dir="${WORKDIR}/rust-toolchain"
+ mkdir -p "${rust_dir}" || die "Failed to create rust toolchain directory"
+ tar xf "${DISTDIR}/chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz" -C "${rust_dir}" ||
+ die "Failed to unpack Rust"
+ fi
+
+ if use ppc64; then
+ unpack chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+ fi
+
+ # This is a dirty hack, but we need rollup to build successfully and it's proving to be challenging
+ # to build locally due to deps
+ unpack rollup-wasm-node-${ROLLUP_VER}.tgz
+}
+
+remove_compiler_builtins() {
+ # We can't use the bundled compiler builtins with the system toolchain
+ # We used to `grep` then `sed`, but it was indirect. Combining the two into a single
+ # `awk` command is more efficient and lets us document the logic more clearly.
+
+ local pattern=' configs += [ "//build/config/clang:compiler_builtins" ]'
+ local target='build/config/compiler/BUILD.gn'
+
+ local tmpfile
+ tmpfile=$(mktemp) || die "Failed to create temporary file."
+
+ if awk -v pat="${pattern}" '
+ BEGIN {
+ match_found = 0
+ }
+
+ # If the delete countdown is active, decrement it and skip to the next line.
+ d > 0 { d--; next }
+
+ # If the current line matches the pattern...
+ $0 == pat {
+ match_found = 1 # ...set our flag to true.
+ d = 2 # Set delete counter for this line and the next two.
+ prev = "" # Clear the buffered previous line so it is not printed.
+ next
+ }
+
+ # For any other line, print the buffered previous line.
+ NR > 1 { print prev }
+
+ # Buffer the current line to be printed on the next cycle.
+ { prev = $0 }
+
+ END {
+ # Print the last line if it was not part of a deleted block.
+ if (d == 0) { print prev }
+
+ # If the pattern was never found, exit with a failure code.
+ if (match_found == 0) {
+ exit 1
+ }
+ }
+ ' "${target}" > "${tmpfile}"; then
+ # AWK SUCCEEDED (exit code 0): The pattern was found and edited.
+ # This is to avoid gawk's `-i inplace` option which users complain about.
+ mv "${tmpfile}" "${target}"
+ else
+ # AWK FAILED (exit code 1): The pattern was not found.
+ rm -f "${tmpfile}"
+ die "Awk patch failed: Pattern not found in ${target}."
+ fi
+}
+
+src_prepare() {
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # We'll fill this in as we go. Patches go in chromium-patches.
+ local PATCHES=()
+
+ PATCHES+=( "${WORKDIR}/chromium-patches-${PATCH_V}/common/" )
+
+ # https://issues.chromium.org/issues/442698344
+ # Unreleased fontconfig changed magic numbers and google have rolled to this version
+ if has_version "<=media-libs/fontconfig-2.17.1"; then
+ PATCHES+=( "${FILESDIR}/chromium-142-work-with-old-fontconfig.patch" )
+ fi
+
+ if use bundled-toolchain; then
+ # We need to symlink the toolchain into the expected location
+ einfo "Symlinking Clang toolchain to expected location ..."
+ mkdir -p third_party/llvm-build/ || die "Failed to create llvm-build directory"
+ # the 'Chromium Linux Tarballs' seem to already have 'Release+Asserts/{lib,bin}'; not sure if this is an
+ # upstream change - we're using the same scripts to build, theoretically. We'll still attempt to create
+ # llvm-build, but we'll rm Release+Asserts and symlink directly.
+ if [[ -d third_party/llvm-build/Release+Asserts ]]; then
+ rm -r third_party/llvm-build/Release+Asserts || die "Failed to remove third_party/llvm-build/Release+Asserts"
+ fi
+ ln -s "${WORKDIR}"/clang third_party/llvm-build/Release+Asserts || die "Failed to bundle Clang"
+ einfo "Symlinking Rust toolchain to expected location ..."
+ # As above, so below
+ if [[ -d third_party/rust-toolchain ]]; then
+ rm -r third_party/rust-toolchain || die "Failed to remove third_party/rust-toolchain"
+ fi
+ ln -s "${WORKDIR}"/rust-toolchain third_party/rust-toolchain || die "Failed to bundle rust"
+ cp "${WORKDIR}"/rust-toolchain/VERSION \
+ "${WORKDIR}"/rust-toolchain/INSTALLED_VERSION || die "Failed to set rust version"
+ else
+ # We don't need our toolchain patches if we're using the official toolchain
+
+ # Copium patches go here.
+ PATCHES+=(
+ "${WORKDIR}/copium/cr143-libsync-__BEGIN_DECLS.patch"
+ "${WORKDIR}/copium/cr149-unbundle-minizip-undo-unicode.patch"
+ )
+
+ # Automate conditional application of chromium-patches
+ # The directory structure is expected to be something like:
+ # chromium-patches-145/
+ # ├── toolchain/
+ # │ ├── cr123-foo.patch
+ # │ └── cr135-bar.patch
+ # ├── llvm/
+ # │ ├── cr144-baz.patch
+ # │ └── lt-23/
+ # │ └── cr145-bleeding-edge-llvm-feature.patch
+ # Where `lt-23` means "apply this patch if the LLVM version is less than 23".
+ # Only categories in `slot_map` will be checked for version constraints.
+ shopt -s nullglob
+ local -A slot_map=( [llvm]="${LLVM_SLOT}" [rust]="${RUST_SLOT}" )
+
+ for category in "${WORKDIR}/chromium-patches-${PATCH_V}"/*/; do
+ local category_name="${category%/}"
+ category_name="${category_name##*/}"
+
+ # Skip arch-specific categories
+ if [[ "${category_name}" == "ppc64le" ]]; then
+ use ppc64 || continue
+ fi
+
+ # We applied common patches above, no need to apply them again here
+ [[ "${category_name}" == "common" ]] && continue
+
+ # Unconditional patches for this category
+ local category_patches=( "${category}"*.patch )
+ [[ ${#category_patches[@]} -gt 0 ]] && PATCHES+=( "${category}" )
+
+ # Version-constrained subdirectories (e.g., llvm/lt-23/)
+ for constraint_dir in "${category}"*/; do
+ local dir_name="${constraint_dir%/}"
+ dir_name="${dir_name##*/}"
+ if [[ "${dir_name}" =~ ^lt-(.*)$ && -v slot_map[${category_name}] ]]; then
+ ver_test "${slot_map[${category_name}]}" -lt "${BASH_REMATCH[1]}" &&
+ PATCHES+=( "${constraint_dir}" )
+ fi
+ done
+ done
+
+ shopt -u nullglob
+
+ # Strictly speaking this doesn't need to be gated (no bundled toolchain for ppc64); it keeps the logic together
+ if use ppc64; then
+ local patchset_dir="${WORKDIR}/openpower-patches-${PPC64_HASH}/patches"
+ # patch causes build errors on 4K page systems (https://bugs.gentoo.org/show_bug.cgi?id=940304)
+ local page_size_patch="ppc64le/third_party/use-sysconf-page-size-on-ppc64.patch"
+ local isa_3_patch="ppc64le/core/baseline-isa-3-0.patch"
+ # Apply the OpenPOWER patches (check for page size and isa 3.0)
+ openpower_patches=( $(grep -E "^ppc64le|^upstream" "${patchset_dir}/series" | grep -v "${page_size_patch}" |
+ grep -v "${isa_3_patch}" || die) )
+ for patch in "${openpower_patches[@]}"; do
+ PATCHES+=( "${patchset_dir}/${patch}" )
+ done
+ if [[ $(getconf PAGESIZE) == 65536 ]]; then
+ PATCHES+=( "${patchset_dir}/${page_size_patch}" )
+ fi
+ # We use vsx3 as a proxy for 'want isa3.0' (POWER9)
+ if use cpu_flags_ppc_vsx3 ; then
+ PATCHES+=( "${patchset_dir}/${isa_3_patch}" )
+ fi
+ fi
+
+ remove_compiler_builtins
+
+ # We can't rely on the eselect'd Rust to actually include rustfmt, so we'll point to the selected slot specifically.
+ local suffix=""
+ if [[ "${RUST_TYPE}" == "binary" ]]; then
+ suffix="-bin-${RUST_SLOT}"
+ else
+ suffix="-${RUST_SLOT}"
+ fi
+ sed -i "s|/bin/rustfmt|/bin/rustfmt${suffix}|g" build/rust/rust_bindgen_generator.gni ||
+ die "Failed to update rustfmt path"
+
+ fi
+
+ # Do this before we apply patches since (e.g.) ppc64 needs to patch rollup and it's easier in ${S}
+ einfo "Moving rollup wasm-node package into place ..."
+ mkdir -p third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+ die "Failed to create node_modules/@rollup/wasm-node"
+ mv "${WORKDIR}"/package/* third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+ die "Failed to move rollup package"
+
+ default
+
+ # Sanity check esbuild version before we start removing files.
+ # We _could_ patch the version check out - in theory esbuild upstream are being super conservative after
+ # arch(AUR) packaged an `esbuild` binary and set ESBUILD_BINARY_PATH=/usr/bin/esbuild, causing much breakage,
+ # but this is fine too and exactly matches what upstream are expecting.
+ # https://github.com/evanw/esbuild/issues/2894
+ local esbuild_js="${S}/third_party/devtools-frontend/src/node_modules/esbuild/lib/main.js"
+ local found
+ found=$(awk -F'"' '/if \(binaryVersion !==/ {print $2}' "${esbuild_js}")
+ if [[ "${found}" != "${ESBUILD_VER}" ]]; then
+ die "esbuild version mismatch: expected ${ESBUILD_VER}, found ${found}"
+ fi
+
+ elog "Removing bundled binaries from source tree ..."
+ # Purge bundled ELF files: These are non-portable and will cause issues if used instead of system versions.
+ # Use `--wasm` to also remove WebAssembly binaries, if desired - they're portable so shouldn't break builds.
+ ${EPYTHON} "${FILESDIR}/bin-finder.py" --elf "${S}" | awk '{print $1}' | xargs rm -f ||
+ die "Failed to remove bundled binaries"
+
+ # And now we restore any that we actually need, from the host system
+ local esbuild_path="${S}/third_party/devtools-frontend/src/third_party/esbuild"
+ local -A restore_list=(
+ ["/usr/bin/esbuild-${ESBUILD_VER}"]="${esbuild_path}/esbuild"
+ ["/usr/bin/gperf"]="${S}/third_party/gperf/cipd/bin/gperf"
+ ["/usr/bin/node"]="${S}/third_party/node/linux/node-linux-x64/bin/node"
+ )
+
+ for src in "${!restore_list[@]}"; do
+ dst="${restore_list[${src}]}"
+ if [[ -f "${src}" ]]; then
+ einfo "Symlinking ${src} ..."
+ # Make sure the parent dir exists; some tarballs don't include (e.g.) node's bindir
+ mkdir -p "$(dirname "${dst}")" || die "Failed to create directory for ${dst}"
+ ln -s "${src}" "${dst}" || die "Failed to symlink ${dst} from ${src}"
+ if [[ ! -L "${dst}" || "$(readlink -f "${dst}")" != "${src}" ]]; then
+ die "Symlink verification failed for ${dst} -> ${src}"
+ fi
+ else
+ die "Expected to find ${src} to restore ${dst}, but it does not exist."
+ fi
+ done
+
+ # adjust python interpreter version
+ sed -i -e "s|\(^script_executable = \).*|\1\"${EPYTHON}\"|g" .gn || die
+
+ # Use the system copy of hwdata's usb.ids; upstream is woefully out of date (2015!)
+ sed 's|//third_party/usb_ids/usb.ids|/usr/share/hwdata/usb.ids|g' \
+ -i services/device/public/cpp/usb/BUILD.gn || die "Failed to set system usb.ids path"
+
+ # remove_bundled_libraries.py walks the source tree and looks for paths containing the substring 'third_party'
+ # whitelist matches use the right-most matching path component, so we need to whitelist from that point down.
+ local keeplibs=(
+ base/third_party/cityhash
+ base/third_party/double_conversion
+ base/third_party/icu
+ base/third_party/nspr
+ base/third_party/superfasthash
+ base/third_party/symbolize
+ base/third_party/xdg_user_dirs
+ buildtools/third_party/libc++
+ buildtools/third_party/libc++abi
+ net/third_party/mozilla_security_manager
+ net/third_party/quic
+ net/third_party/uri_template
+ third_party/abseil-cpp
+ third_party/angle
+ third_party/angle/src/common/third_party/xxhash
+ third_party/angle/src/third_party/ceval
+ third_party/angle/src/third_party/libXNVCtrl
+ third_party/angle/src/third_party/volk
+ third_party/anonymous_tokens
+ third_party/apple_apsl
+ third_party/axe-core
+ third_party/bidimapper
+ third_party/blink
+ third_party/boringssl
+ third_party/boringssl/src/third_party/fiat
+ third_party/breakpad
+ third_party/breakpad/breakpad/src/third_party/curl
+ third_party/brotli
+ third_party/catapult
+ third_party/catapult/common/py_vulcanize/third_party/rcssmin
+ third_party/catapult/common/py_vulcanize/third_party/rjsmin
+ third_party/catapult/third_party/beautifulsoup4-4.9.3
+ third_party/catapult/third_party/html5lib-1.1
+ third_party/catapult/third_party/polymer
+ third_party/catapult/third_party/six
+ third_party/catapult/third_party/typ
+ third_party/catapult/tracing/third_party/d3
+ third_party/catapult/tracing/third_party/gl-matrix
+ third_party/catapult/tracing/third_party/jpeg-js
+ third_party/catapult/tracing/third_party/jszip
+ third_party/catapult/tracing/third_party/mannwhitneyu
+ third_party/catapult/tracing/third_party/oboe
+ third_party/catapult/tracing/third_party/pako
+ third_party/ced
+ third_party/cld_3
+ third_party/closure_compiler
+ third_party/compiler-rt # Since M137 atomic is required; we could probably unbundle this as a target of opportunity.
+ third_party/content_analysis_sdk
+ third_party/cpuinfo
+ third_party/crabbyavif
+ third_party/crashpad
+ third_party/crashpad/crashpad/third_party/lss
+ third_party/crashpad/crashpad/third_party/zlib
+ third_party/crc32c
+ third_party/cros_system_api
+ third_party/d3
+ third_party/dav1d
+ third_party/dawn
+ third_party/dawn/third_party/gn/webgpu-cts
+ third_party/dawn/third_party/OpenGL-Registry
+ third_party/dawn/third_party/renderdoc
+ third_party/dawn/third_party/webgpu-headers
+ third_party/depot_tools
+ third_party/devscripts
+ third_party/devtools-frontend
+ third_party/devtools-frontend/src/front_end/third_party/acorn
+ third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+ third_party/devtools-frontend/src/front_end/third_party/axe-core
+ third_party/devtools-frontend/src/front_end/third_party/chromium
+ third_party/devtools-frontend/src/front_end/third_party/codemirror
+ third_party/devtools-frontend/src/front_end/third_party/csp_evaluator
+ third_party/devtools-frontend/src/front_end/third_party/diff
+ third_party/devtools-frontend/src/front_end/third_party/i18n
+ third_party/devtools-frontend/src/front_end/third_party/intl-messageformat
+ third_party/devtools-frontend/src/front_end/third_party/json5
+ third_party/devtools-frontend/src/front_end/third_party/legacy-javascript
+ third_party/devtools-frontend/src/front_end/third_party/lighthouse
+ third_party/devtools-frontend/src/front_end/third_party/lit
+ third_party/devtools-frontend/src/front_end/third_party/marked
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/mitt
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/parsel-js
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/rxjs
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/urlpattern-polyfill
+ third_party/devtools-frontend/src/front_end/third_party/source-map-scopes-codec
+ third_party/devtools-frontend/src/front_end/third_party/third-party-web
+ third_party/devtools-frontend/src/front_end/third_party/vscode.web-custom-data
+ third_party/devtools-frontend/src/front_end/third_party/wasmparser
+ third_party/devtools-frontend/src/front_end/third_party/web-vitals
+ third_party/devtools-frontend/src/third_party
+ third_party/dom_distiller_js
+ third_party/dragonbox
+ third_party/eigen3
+ third_party/emoji-segmenter
+ third_party/farmhash
+ third_party/fast_float
+ third_party/fdlibm
+ third_party/federated_compute/chromium/fcp/confidentialcompute
+ third_party/federated_compute/src/fcp/base
+ third_party/federated_compute/src/fcp/confidentialcompute
+ third_party/federated_compute/src/fcp/protos/confidentialcompute
+ third_party/federated_compute/src/fcp/protos/federatedcompute
+ third_party/ffmpeg
+ third_party/fft2d
+ third_party/flatbuffers
+ third_party/fp16
+ third_party/freetype
+ third_party/fusejs
+ third_party/fxdiv
+ third_party/gemmlowp
+ third_party/google_input_tools
+ third_party/google_input_tools/third_party/closure_library
+ third_party/google_input_tools/third_party/closure_library/third_party/closure
+ third_party/googletest
+ third_party/gperf # We symlink system gperf, but this will purge the symlink since we tidy up afterwards.
+ third_party/highway
+ third_party/hunspell
+ third_party/ink/src/ink/brush
+ third_party/ink/src/ink/color
+ third_party/ink/src/ink/geometry
+ third_party/ink/src/ink/rendering
+ third_party/ink/src/ink/rendering/skia/common_internal
+ third_party/ink/src/ink/rendering/skia/native
+ third_party/ink/src/ink/rendering/skia/native/internal
+ third_party/ink/src/ink/strokes
+ third_party/ink/src/ink/types
+ third_party/inspector_protocol
+ third_party/ipcz
+ third_party/jinja2
+ third_party/jsoncpp
+ third_party/khronos
+ third_party/lens_server_proto
+ third_party/leveldatabase
+ third_party/libaddressinput
+ third_party/libaom
+ third_party/libaom/source/libaom/third_party/fastfeat
+ third_party/libaom/source/libaom/third_party/vector
+ third_party/libaom/source/libaom/third_party/x86inc
+ third_party/libc++
+ third_party/libdrm
+ third_party/libgav1
+ third_party/libjingle
+ third_party/libpfm4
+ third_party/libphonenumber
+ third_party/libpng
+ third_party/libsecret
+ third_party/libsrtp
+ third_party/libsync
+ third_party/libtess2/libtess2
+ third_party/libtess2/src/Include
+ third_party/libtess2/src/Source
+ third_party/liburlpattern
+ third_party/libva_protected_content
+ third_party/libvpx
+ third_party/libvpx/source/libvpx/third_party/x86inc
+ third_party/libwebm
+ third_party/libx11
+ third_party/libxcb-keysyms
+ third_party/libxml/chromium
+ third_party/libyuv
+ third_party/libzip
+ third_party/lit
+ third_party/llvm-libc
+ third_party/llvm-libc/src/shared/
+ third_party/lottie
+ third_party/lss
+ third_party/lzma_sdk
+ third_party/mako
+ third_party/markupsafe
+ third_party/material_color_utilities
+ third_party/metrics_proto
+ third_party/minigbm
+ third_party/ml_dtypes
+ third_party/modp_b64
+ third_party/nasm
+ third_party/nearby
+ third_party/neon_2_sse
+ third_party/node
+ third_party/oak/chromium/proto
+ third_party/oak/chromium/proto/attestation
+ third_party/omnibox_proto
+ third_party/one_euro_filter
+ third_party/openscreen
+ third_party/openscreen/src/third_party/
+ third_party/openscreen/src/third_party/tinycbor/src/src
+ third_party/opus
+ third_party/ots
+ third_party/pdfium
+ third_party/pdfium/third_party/agg23
+ third_party/pdfium/third_party/bigint
+ third_party/pdfium/third_party/freetype
+ third_party/pdfium/third_party/lcms
+ third_party/pdfium/third_party/libopenjpeg
+ third_party/pdfium/third_party/libtiff
+ third_party/perfetto
+ third_party/perfetto/protos/third_party/chromium
+ third_party/perfetto/protos/third_party/pprof
+ third_party/perfetto/protos/third_party/primes
+ third_party/perfetto/protos/third_party/simpleperf
+ third_party/pffft
+ third_party/ply
+ third_party/polymer
+ third_party/private_membership
+ third_party/private-join-and-compute
+ third_party/protobuf
+ third_party/protobuf/third_party/utf8_range
+ third_party/pthreadpool
+ third_party/puffin
+ third_party/pyjson5
+ third_party/pyyaml
+ third_party/rapidhash
+ third_party/re2
+ third_party/readability
+ third_party/rnnoise
+ third_party/rust
+ third_party/ruy
+ third_party/s2cellid
+ third_party/search_engines_data
+ third_party/securemessage
+ third_party/selenium-atoms
+ third_party/sentencepiece
+ third_party/sentencepiece/src/third_party/darts_clone
+ third_party/shell-encryption
+ third_party/simdutf
+ third_party/simplejson
+ third_party/six
+ third_party/skia
+ third_party/skia/include/third_party/vulkan
+ third_party/smhasher
+ third_party/snappy
+ third_party/spirv-headers
+ third_party/spirv-tools
+ third_party/sqlite
+ third_party/swiftshader
+ third_party/swiftshader/third_party/astc-encoder
+ third_party/swiftshader/third_party/llvm-subzero
+ third_party/swiftshader/third_party/marl
+ third_party/swiftshader/third_party/SPIRV-Headers/include/spirv
+ third_party/swiftshader/third_party/SPIRV-Tools
+ third_party/swiftshader/third_party/subzero
+ third_party/tensorflow_models
+ third_party/tensorflow-text
+ third_party/tflite
+ third_party/tflite/src/third_party/fft2d
+ third_party/tflite/src/third_party/xla/third_party/tsl
+ third_party/tflite/src/third_party/xla/xla/tsl/framework
+ third_party/tflite/src/third_party/xla/xla/tsl/lib/random
+ third_party/tflite/src/third_party/xla/xla/tsl/platform
+ third_party/tflite/src/third_party/xla/xla/tsl/protobuf
+ third_party/tflite/src/third_party/xla/xla/tsl/util
+ third_party/ukey2
+ third_party/utf
+ third_party/vulkan
+ third_party/wayland
+ third_party/webdriver
+ third_party/webgpu-cts
+ third_party/webrtc
+ third_party/webrtc/common_audio/third_party/ooura
+ third_party/webrtc/common_audio/third_party/spl_sqrt_floor
+ third_party/webrtc/modules/third_party/fft
+ third_party/webrtc/modules/third_party/g711
+ third_party/webrtc/modules/third_party/g722
+ third_party/widevine
+ third_party/woff2
+ third_party/wuffs
+ third_party/x11proto
+ third_party/xcbproto
+ third_party/xnnpack
+ third_party/zlib/google
+ third_party/zxcvbn-cpp
+ url/third_party/mozilla
+ v8/third_party/glibc
+ v8/third_party/inspector_protocol
+ v8/third_party/rapidhash-v8
+ v8/third_party/siphash
+ v8/third_party/utf8-decoder
+ v8/third_party/v8
+ v8/third_party/valgrind
+
+ # gyp -> gn leftovers
+ third_party/speech-dispatcher
+ third_party/usb_ids
+ )
+
+ if use rar; then
+ keeplibs+=( third_party/unrar )
+ fi
+
+ if use test; then
+ keeplibs+=(
+ third_party/breakpad/breakpad/src/processor
+ third_party/fuzztest
+ third_party/google_benchmark/src/include/benchmark
+ third_party/google_benchmark/src/src
+ third_party/test_fonts
+ third_party/test_fonts/fontconfig
+ third_party/test_fonts/test_fonts
+ )
+ fi
+
+ # USE=system-*
+ if ! use system-harfbuzz; then
+ keeplibs+=( third_party/harfbuzz )
+ fi
+
+ if ! use system-icu; then
+ keeplibs+=( third_party/icu )
+ fi
+
+ if ! use system-zstd; then
+ keeplibs+=( third_party/zstd )
+ fi
+
+ # Arch-specific
+ if use arm64 || use ppc64 ; then
+ keeplibs+=( third_party/swiftshader/third_party/llvm-10.0 )
+ fi
+ # we need to generate ppc64 stuff because upstream does not ship it yet
+ # it has to be done before unbundling.
+ if use ppc64; then
+ pushd third_party/libvpx >/dev/null || die
+ mkdir -p source/config/linux/ppc64 || die
+ # requires git and clang, bug #832803
+ # Revert https://chromium.googlesource.com/chromium/src/+/b463d0f40b08b4e896e7f458d89ae58ce2a27165%5E%21/third_party/libvpx/generate_gni.sh
+ # and https://chromium.googlesource.com/chromium/src/+/71ebcbce867dd31da5f8b405a28fcb0de0657d91%5E%21/third_party/libvpx/generate_gni.sh
+ # since we're not in a git repo
+ sed -i -e "s|^update_readme||g; s|clang-format|${EPREFIX}/bin/true|g; /^git -C/d; /git cl/d; /cd \$BASE_DIR\/\$LIBVPX_SRC_DIR/ign format --in-place \$BASE_DIR\/BUILD.gn\ngn format --in-place \$BASE_DIR\/libvpx_srcs.gni" \
+ generate_gni.sh || die
+ ./generate_gni.sh || die
+ popd >/dev/null || die
+
+ pushd third_party/ffmpeg >/dev/null || die
+ cp libavcodec/ppc/h264dsp.c libavcodec/ppc/h264dsp_ppc.c || die
+ cp libavcodec/ppc/h264qpel.c libavcodec/ppc/h264qpel_ppc.c || die
+ popd >/dev/null || die
+ fi
+
+ # Sanity check keeplibs, on major version bumps it is often necessary to update this list
+ # and this enables us to hit them all at once.
+ # There are some entries that need to be whitelisted (TODO: Why? The file is understandable, the rest seem odd)
+ whitelist_libs=(
+ net/third_party/quic
+ third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+ third_party/libjingle
+ third_party/mesa
+ third_party/skia/third_party/vulkan
+ third_party/vulkan
+ )
+ local not_found_libs=()
+ for lib in "${keeplibs[@]}"; do
+ if [[ ! -d "${lib}" ]] && ! has "${lib}" "${whitelist_libs[@]}"; then
+ not_found_libs+=( "${lib}" )
+ fi
+ done
+
+ if [[ ${#not_found_libs[@]} -gt 0 ]]; then
+ eerror "The following \`keeplibs\` directories were not found in the source tree:"
+ for lib in "${not_found_libs[@]}"; do
+ eerror " ${lib}"
+ done
+ die "Please update the ebuild."
+ fi
+
+ # Remove most bundled libraries. Some are still needed.
+ einfo "Unbundling third-party libraries ..."
+ build/linux/unbundle/remove_bundled_libraries.py "${keeplibs[@]}" --do-remove || die
+
+ # Interferes with our bundled clang path; we don't want stripped binaries anyway.
+ sed -i -e 's|${clang_base_path}/bin/llvm-strip|/bin/true|g' \
+ -e 's|${clang_base_path}/bin/llvm-objcopy|/bin/true|g' \
+ build/linux/strip_binary.gni || die
+}
+
+chromium_configure() {
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # 974899: sometimes people try to build with a non-Unicode locale and python gets very upset
+ python_export_utf8_locale || die "Chromium builds require a UTF-8 locale."
+
+ # Bug 491582.
+ export TMPDIR="${WORKDIR}/temp"
+ mkdir -p -m 755 "${TMPDIR}" || die
+
+ # https://bugs.gentoo.org/654216
+ addpredict /dev/dri/ #nowarn
+
+ # Use system-provided libraries.
+ # TODO: freetype -- remove sources (https://bugs.chromium.org/p/pdfium/issues/detail?id=733).
+ # TODO: use_system_hunspell (upstream changes needed).
+ # TODO: use_system_protobuf (bug #525560).
+ # TODO: use_system_sqlite (http://crbug.com/22208).
+
+ # libevent: https://bugs.gentoo.org/593458
+ local gn_system_libraries=(
+ flac
+ fontconfig
+ freetype
+ # Need harfbuzz_from_pkgconfig target
+ #harfbuzz-ng
+ libjpeg
+ libwebp
+ libxml
+ libxslt
+ openh264
+ zlib
+ )
+ if use system-icu; then
+ gn_system_libraries+=( icu )
+ fi
+
+ if use system-zstd; then
+ gn_system_libraries+=( zstd )
+ fi
+
+ build/linux/unbundle/replace_gn_files.py --system-libraries "${gn_system_libraries[@]}" ||
+ die "Failed to replace GN files for system libraries"
+
+ # TODO 131: The above call clobbers `enable_freetype = true` in the freetype gni file
+ # drop the last line, then append the freetype line and a new curly brace to end the block
+ local freetype_gni="build/config/freetype/freetype.gni"
+ sed -i -e '$d' ${freetype_gni} || die
+ echo " enable_freetype = true" >> ${freetype_gni} || die
+ echo "}" >> ${freetype_gni} || die
+
+ if use !custom-cflags; then
+ replace-flags "-Os" "-O2"
+ strip-flags
+ # Debug info section overflows without component build
+ # Prevent linker from running out of address space, bug #471810 .
+ filter-flags "-g*"
+ # 949123: Several multimedia components explicitly build with specific CFLAGS and
+ # use runtime detection to enable optimisations; unfortunately any of our CFLAGS are suffixed
+ # to the end of the command line, which causes build failures.
+ use arm64 && filter-flags "-march*" "-mtune*" "-mcpu*"
+ fi
+
+ # We don't use the same clang version as upstream, and with -Werror
+ # we need to make sure that we don't get superfluous warnings.
+ append-flags -Wno-unknown-warning-option
+ if tc-is-cross-compiler; then # can you cross-compile with the bundled toolchain?
+ export BUILD_CXXFLAGS+=" -Wno-unknown-warning-option"
+ export BUILD_CFLAGS+=" -Wno-unknown-warning-option"
+ fi
+
+ # Start building our GN options
+ local myconf_gn=() # Tip: strings must be quoted, bools or numbers are fine
+
+ if use !bundled-toolchain; then
+ # We already forced the "correct" clang via pkg_setup
+
+ if tc-is-cross-compiler; then
+ CC="${CC} -target ${CHOST} --sysroot ${ESYSROOT}"
+ CXX="${CXX} -target ${CHOST} --sysroot ${ESYSROOT}"
+ BUILD_AR=${AR}
+ BUILD_CC=${CC}
+ BUILD_CXX=${CXX}
+ BUILD_NM=${NM}
+ fi
+
+ # Make sure the build system will use the right tools, bug #340795.
+ tc-export AR CC CXX NM
+
+ strip-unsupported-flags
+ append-ldflags -Wl,--undefined-version # https://bugs.gentoo.org/918897#c32
+
+ myconf_gn+=(
+ "is_clang=true"
+ "clang_use_chrome_plugins=false"
+ "use_clang_modules=false" # M141 enables this for the linux platform by default.
+ "use_lld=true"
+ 'custom_toolchain="//build/toolchain/linux/unbundle:default"'
+ # From M127 we need to provide a location for libclang and the clang resource dir so that bindgen can find them
+ "bindgen_libclang_path=\"$(get_llvm_prefix)/$(get_libdir)\""
+ "bindgen_clang_resource_dir=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/include\""
+ "bindgen_extra_clang_args=[\"-I${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/include\"]"
+ "clang_base_path=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/\""
+ "rust_bindgen_root=\"${EPREFIX}/usr/\""
+ "rust_sysroot_absolute=\"$(get_rust_prefix)\""
+ "rustc_version=\"${RUST_SLOT}\""
+ )
+
+ if [[ ${LLVM_SLOT} -lt 23 ]]; then
+ # Workaround for -fsanitize-ignore-for-ubsan-feature (added in LLVM 23)
+ myconf_gn+=( 'clang_has_ubsan_feature_ignore=false' )
+ fi
+
+ if ! tc-is-cross-compiler; then
+ myconf_gn+=( 'host_toolchain="//build/toolchain/linux/unbundle:default"' )
+ else
+ tc-export BUILD_{AR,CC,CXX,NM}
+ myconf_gn+=(
+ 'host_toolchain="//build/toolchain/linux/unbundle:host"'
+ 'v8_snapshot_toolchain="//build/toolchain/linux/unbundle:host"'
+ "host_pkg_config=\"$(tc-getBUILD_PKG_CONFIG)\""
+ "pkg_config=\"$(tc-getPKG_CONFIG)\""
+ )
+
+ # setup cups-config, build system only uses --libs option
+ if use cups; then
+ mkdir "${T}/cups-config" || die
+ cp "${ESYSROOT}/usr/bin/${CHOST}-cups-config" "${T}/cups-config/cups-config" || die
+ export PATH="${PATH}:${T}/cups-config"
+ fi
+
+ # Don't inherit PKG_CONFIG_PATH from environment
+ local -x PKG_CONFIG_PATH=
+ fi
+
+ fi # !bundled-toolchain
+
+ local myarch
+ myarch="$(tc-arch)"
+ case ${myarch} in
+ amd64)
+ # Bug 530248, 544702, 546984, 853646.
+ use !custom-cflags && filter-flags -mno-mmx -mno-sse2 -mno-ssse3 -mno-sse4.1 \
+ -mno-avx -mno-avx2 -mno-fma -mno-fma4 -mno-xop -mno-sse4a
+ myconf_gn+=( 'target_cpu="x64"' )
+ ;;
+ arm64)
+ myconf_gn+=( 'target_cpu="arm64"' )
+ ;;
+ ppc64)
+ myconf_gn+=( 'target_cpu="ppc64"' )
+ ;;
+ *)
+ die "Failed to determine target arch, got '${myarch}'."
+ ;;
+ esac
+
+ # Common options
+
+ myconf_gn+=(
+ # Disable code formating of generated files
+ "blink_enable_generated_code_formatting=false"
+ # enable DCHECK with USE=debug only, increases chrome binary size by 30%, bug #811138.
+ # DCHECK is fatal by default, make it configurable at runtime, #bug 807881.
+ "dcheck_always_on=$(usex debug true false)"
+ "dcheck_is_configurable=$(usex debug true false)"
+ # Chromium builds provided by Linux distros should disable the testing config
+ "disable_fieldtrial_testing_config=true"
+ # Custom patch: Enable building Chromium as individual channels (e.g. stable, beta, dev) that
+ # use different profile directories, desktop entries, etc. This enables slotting the ebuild.
+ "enable_channel_branding=true"
+ # 131 began laying the groundwork for replacing freetype with
+ # "Rust-based Fontations set of libraries plus Skia path rendering"
+ # We now need to opt-in
+ "enable_freetype=true"
+ "enable_hangout_services_extension=$(usex hangouts true false)"
+ # Don't need nocompile checks and GN crashes with our config (verify with modern GN)
+ "enable_nocompile_tests=false"
+ # pseudolocales are only used for testing
+ "enable_pseudolocales=false"
+ "enable_widevine=$(usex widevine true false)"
+ # Disable fatal linker warnings, bug 506268.
+ "fatal_linker_warnings=false"
+ # Set up Google API keys, see http://www.chromium.org/developers/how-tos/api-keys
+ # Note: these are for Gentoo use ONLY. For your own distribution,
+ # please get your own set of keys. Feel free to contact chromium@gentoo.org for more info.
+ # note: OAuth2 is patched in; check patchset for details.
+ 'google_api_key="AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc"'
+ # Component build isn't generally intended for use by end users. It's mostly useful
+ # for development and debugging.
+ "is_component_build=false"
+ # GN needs explicit config for Debug/Release as opposed to inferring it from build directory.
+ "is_debug=false"
+ "is_official_build=$(usex official true false)"
+ # Enable ozone wayland and/or headless support
+ "ozone_auto_platforms=false"
+ "ozone_platform_headless=true"
+ # Enables building without non-free unRAR licence
+ "safe_browsing_use_unrar=$(usex rar true false)"
+ "thin_lto_enable_optimizations=${use_lto}"
+ "treat_warnings_as_errors=false"
+ # Use in-tree libc++ (buildtools/third_party/libc++ and buildtools/third_party/libc++abi)
+ # instead of the system C++ library for C++ standard library support.
+ # default: true, but let's be explicit (forced since 120 ; USE removed 127).
+ "use_custom_libcxx=true"
+ # Enable ozone wayland and/or headless support
+ "use_ozone=true"
+ # The sysroot is the oldest debian image that chromium supports, we don't need it
+ "use_sysroot=false"
+ # See dependency logic in third_party/BUILD.gn
+ "use_system_harfbuzz=$(usex system-harfbuzz true false)"
+ "use_thin_lto=${use_lto}"
+ # Only enabled for clang, but gcc has endian macros too
+ "v8_use_libm_trig_functions=true"
+ )
+
+ if use bindist ; then
+ myconf_gn+=(
+ # If this is set to false Chromium won't be able to load any proprietary codecs
+ # even if provided with an ffmpeg capable of h264/aac decoding
+ "proprietary_codecs=true"
+ 'ffmpeg_branding="Chrome"'
+ # build ffmpeg as an external component (libffmpeg.so) that we can remove / substitute
+ "is_component_ffmpeg=true"
+ )
+ else
+ myconf_gn+=(
+ "proprietary_codecs=$(usex proprietary-codecs true false)"
+ "ffmpeg_branding=\"$(usex proprietary-codecs Chrome Chromium)\""
+ )
+ fi
+
+ if use headless; then
+ myconf_gn+=(
+ "enable_print_preview=false"
+ "enable_remoting=false"
+ 'ozone_platform="headless"'
+ "rtc_use_pipewire=false"
+ "use_alsa=false"
+ "use_cups=false"
+ "use_gio=false"
+ "use_glib=false"
+ "use_gtk=false"
+ "use_kerberos=false"
+ "use_libpci=false"
+ "use_pangocairo=false"
+ "use_pulseaudio=false"
+ "use_qt5=false"
+ "use_qt6=false"
+ "use_udev=false"
+ "use_vaapi=false"
+ "use_xkbcommon=false"
+ )
+ else
+ myconf_gn+=(
+ "gtk_version=$(usex gtk4 4 3)"
+ # link pulseaudio directly (DT_NEEDED) instead of using dlopen.
+ # helps with automated detection of ABI mismatches and prevents silent errors.
+ "link_pulseaudio=$(usex pulseaudio true false)"
+ "ozone_platform_wayland=$(usex wayland true false)"
+ "ozone_platform_x11=$(usex X true false)"
+ "ozone_platform=\"$(usex wayland wayland x11)\""
+ "rtc_use_pipewire=$(usex screencast true false)"
+ "use_cups=$(usex cups true false)"
+ "use_kerberos=$(usex kerberos true false)"
+ "use_pulseaudio=$(usex pulseaudio true false)"
+ "use_qt5=false"
+ "use_system_libffi=$(usex wayland true false)"
+ "use_system_minigbm=true"
+ "use_vaapi=$(usex vaapi true false)"
+ "use_xkbcommon=true"
+ )
+ if use qt6; then
+ local cbuild_libdir
+ cbuild_libdir="$(get_libdir)"
+ if tc-is-cross-compiler; then
+ # Hack to workaround get_libdir not being able to handle CBUILD, bug #794181
+ cbuild_libdir="$($(tc-getBUILD_PKG_CONFIG) --keep-system-libs --libs-only-L libxslt)"
+ cbuild_libdir="${cbuild_libdir:2}"
+ cbuild_libdir="${cbuild_libdir/% }"
+ fi
+ myconf_gn+=(
+ "use_qt6=true"
+ "moc_qt6_path=\"${EPREFIX}/usr/${cbuild_libdir}/qt6/libexec\""
+ )
+ else
+ myconf_gn+=( "use_qt6=false" )
+ fi
+ fi
+
+ # Explicitly disable ICU data file support for system-icu/headless builds.
+ if use system-icu || use headless; then
+ myconf_gn+=( "icu_use_data_file=false" )
+ fi
+
+ if use official; then
+ # Allow building against system libraries in official builds
+ sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \
+ tools/generate_shim_headers/generate_shim_headers.py || die
+ if use !ppc64; then
+ myconf_gn+=( "is_cfi=${use_lto}" )
+ else
+ myconf_gn+=( "is_cfi=false" ) # requires llvm-runtimes/compiler-rt-sanitizers[cfi]
+ fi
+ # Don't add symbols to build
+ myconf_gn+=( "symbol_level=0" )
+ fi
+
+ if use pgo; then
+ myconf_gn+=( "chrome_pgo_phase=${1}" )
+ if [[ "$1" == "2" ]]; then
+ myconf_gn+=( "pgo_data_path=${2}" )
+ fi
+ else
+ myconf_gn+=( "chrome_pgo_phase=0" )
+ fi
+
+ # Odds and ends
+
+ # skipping typecheck is only supported on amd64, bug #876157
+ if ! use amd64; then
+ myconf_gn+=( "devtools_skip_typecheck=false" )
+ fi
+
+ # Disable external code space for V8 for ppc64. It is disabled for ppc64
+ # by default, but cross-compiling on amd64 enables it again.
+ if tc-is-cross-compiler && use ppc64; then
+ myconf_gn+=( "v8_enable_external_code_space=false" )
+ fi
+
+ # Since we build from tarballs, we need to set the channel here so that it can be used in the build.
+ export CHROME_VERSION_EXTRA="${SLOT}"
+
+ einfo "Configuring Chromium ..."
+ set -- gn gen --args="${myconf_gn[*]}${EXTRA_GN:+ ${EXTRA_GN}}" out/Release
+ echo "$@"
+ "$@" || die "Failed to configure Chromium"
+}
+
+src_configure() {
+ chromium_configure $(usex pgo 1 0)
+}
+
+chromium_compile() {
+
+ # Final link uses lots of file descriptors.
+ ulimit -n 2048
+
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # Don't inherit PYTHONPATH from environment, bug #789021, #812689
+ local -x PYTHONPATH=
+
+ # Build mksnapshot and pax-mark it.
+ if use pax-kernel; then
+ local x
+ for x in mksnapshot v8_context_snapshot_generator code_cache_generator; do
+ if tc-is-cross-compiler; then
+ eninja -C out/Release "host/${x}"
+ pax-mark m "out/Release/host/${x}"
+ else
+ eninja -C out/Release "${x}"
+ pax-mark m "out/Release/${x}"
+ fi
+ done
+ fi
+
+ # Even though ninja autodetects number of CPUs, we respect
+ # user's options, for debugging with -j 1 or any other reason.
+ eninja -C out/Release chrome chromedriver chrome_sandbox $(use test && echo "base_unittests")
+
+ pax-mark m out/Release/chrome
+
+ # This codepath does minimal patching, so we're at the mercy of upstream
+ # CFLAGS. This is fine - we're not intending to force this on users
+ # and we do a lot of flag 'management' anyway.
+ if use bundled-toolchain; then
+ QA_FLAGS_IGNORED="
+ usr/lib64/chromium-browser/chrome
+ usr/lib64/chromium-browser/chrome-sandbox
+ usr/lib64/chromium-browser/chromedriver
+ usr/lib64/chromium-browser/chrome_crashpad_handler
+ usr/lib64/chromium-browser/libEGL.so
+ usr/lib64/chromium-browser/libGLESv2.so
+ usr/lib64/chromium-browser/libVkICD_mock_icd.so
+ usr/lib64/chromium-browser/libVkLayer_khronos_validation.so
+ usr/lib64/chromium-browser/libqt6_shim.so
+ usr/lib64/chromium-browser/libvk_swiftshader.so
+ usr/lib64/chromium-browser/libvulkan.so.1
+ "
+ fi
+}
+
+# This function is called from virtx, and must always return so that Xvfb
+# session isn't left running. If we return 1, virtx will call die().
+chromium_profile() {
+ einfo "Profiling for PGO"
+
+ pushd "${WORKDIR}/chromium-profiler-"* >/dev/null || return 1
+
+ # Remove old profdata in case profiling was interrupted.
+ rm -rf "${1}" || return 1
+
+ if ! "${EPYTHON}" ./chromium_profiler.py \
+ --chrome-executable "${S}/out/Release/chrome" \
+ --chromedriver-executable "${S}/out/Release/chromedriver.unstripped" \
+ --add-arg no-sandbox --add-arg disable-dev-shm-usage \
+ --profile-output "${1}"; then
+ eerror "Profiling failed"
+ return 1
+ fi
+
+ popd >/dev/null || return 1
+}
+
+src_compile() {
+ if use pgo; then
+ local profdata
+
+ profdata="${WORKDIR}/chromium.profdata"
+
+ if [[ ! -e "${WORKDIR}/.pgo-profiled" ]]; then
+ chromium_compile
+ virtx chromium_profile "$profdata"
+
+ touch "${WORKDIR}/.pgo-profiled" || die
+ fi
+
+ if [[ ! -e "${WORKDIR}/.pgo-phase-2-configured" ]]; then
+ # Remove phase 1 output
+ rm -r out/Release || die
+
+ chromium_configure 2 "$profdata"
+
+ touch "${WORKDIR}/.pgo-phase-2-configured" || die
+ fi
+
+ if [[ ! -e "${WORKDIR}/.pgo-phase-2-compiled" ]]; then
+ chromium_compile
+ touch "${WORKDIR}/.pgo-phase-2-compiled" || die
+ fi
+ else
+ chromium_compile
+ fi
+
+ mv out/Release/chromedriver{.unstripped,} || die
+
+ rm -f out/Release/locales/*.pak.info || die
+
+ # Generate support files (desktop file, manpage, etc.) See: #684550 #706786 #968958
+ ${EPYTHON} "${FILESDIR}/generate-support-files.py" \
+ --installdir "/usr/$(get_libdir)/chromium-browser" \
+ --channel "${SLOT}" ||
+ die "Failed to generate support files"
+}
+
+src_test() {
+ # Tests may be flaky with usersandbox, and the test runner executes significantly faster without.
+ # If you seem to be excluding too many tests for a particular milestone: comment them out, reboot, and
+ # run the tests again. If that doesn't help, try FEATURES="-usersandbox" and send it because obviously the
+ # chromium gods are not smiling upon you today. Do some runtime testing, obvs.
+ local skip_tests=(
+ # Wildcard exclusions (if all tests in a test suite are broken)
+ 'AlternateTestParams/PartitionAllocDeathTest.RepeatedAllocReturnNullDirect/*'
+ 'AlternateTestParams/PartitionAllocDeathTest.RepeatedReallocReturnNullDirect/*'
+ 'AlternateTestParams/PartitionAllocTest.*' # 200+ tests, >= 1 crashes entire test runner with usersandbox.
+ 'CheckExitCodeAfterSignalHandlerDeathTest.*'
+ 'CriticalProcessAndThreadSpotChecks/HangWatcherAnyCriticalThreadTests.*'
+ 'LazyThreadPoolTaskRunnerEnvironmentTest.*' # M142
+ 'ToolsSanityTest.BadVirtualCall*'
+ # requires en-us locale
+ SysStrings.SysNativeMBAndWide
+ SysStrings.SysNativeMBToWide
+ SysStrings.SysWideToNativeMB
+ # Specific test cases
+ CancelableEventTest.BothCancelFailureAndSucceedOccurUnderContention
+ FilePathTest.FromUTF8Unsafe_And_AsUTF8Unsafe
+ HistogramTesterTest.PumaTestUniqueSample
+ PathServiceTest.CheckedGetFailure
+ PlatformThreadTest.CanChangeThreadType
+ RawPtrTest.SetLookupUsesGetForComparison # M146 ; also broken for alpine in M144.
+ RustLogIntegrationTest.CheckAllSeverity
+ StackCanary.ChangingStackCanaryCrashesOnReturn
+ StackTraceDeathTest.StackDumpSignalHandlerIsMallocFree
+ TestLauncherTools.TruncateSnippetFocusedMatchesFatalMessagesTest
+ ThreadPoolEnvironmentConfig.CanUseBackgroundPriorityForWorker
+ )
+ local test_filter="-$(IFS=:; printf '%s' "${skip_tests[*]}")"
+ # test-launcher-bot-mode enables parallelism and plain output
+ # Check individual tests with --gtest_filter=<test you want> --single-process-tests
+ ./out/Release/base_unittests --test-launcher-bot-mode \
+ --test-launcher-jobs="$(get_makeopts_jobs)" \
+ --gtest_filter="${test_filter}" || die "Tests failed!"
+}
+
+src_install() {
+ local browser_suffix
+ if [[ "${SLOT}" != "stable" ]]; then
+ browser_suffix="-${SLOT}"
+ else
+ browser_suffix=""
+ fi
+ local CHROMIUM_HOME="/usr/$(get_libdir)/chromium-browser${browser_suffix}"
+ exeinto "${CHROMIUM_HOME}"
+ doexe out/Release/chrome
+
+ newexe out/Release/chrome_sandbox chrome-sandbox
+ fperms 4755 "${CHROMIUM_HOME}/chrome-sandbox"
+
+ doexe out/Release/chromedriver
+ doexe out/Release/chrome_crashpad_handler
+
+ ozone_auto_session () {
+ use X && use wayland && ! use headless && echo true || echo false
+ }
+
+ cat <<- EOF > "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+ #!/bin/bash
+ # Wrapper to launch slotted Chromium via the chromium-common launcher script.
+ export CHROME_DESKTOP="chromium-browser${browser_suffix}.desktop"
+ export CHROME_EXEC_NAME="chromium-browser${browser_suffix}"
+ export CHROME_VERSION_EXTRA="${SLOT}"
+ export CHROME_WRAPPER="\$(readlink -f "\$0")"
+ export OZONE_AUTO_SESSION=$(ozone_auto_session)
+
+ exec /usr/libexec/chromium/chromium-launcher.sh "\$@"
+ EOF
+
+ chmod 755 "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+
+ # It is important that we name the target "chromium-browser",
+ # xdg-utils expect it; bug #355517.
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-browser${browser_suffix}
+ # keep the old symlink around for consistency
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium${browser_suffix}
+
+ dosym "${CHROMIUM_HOME}/chromedriver" /usr/bin/chromedriver${browser_suffix}
+
+ pushd out/Release/locales > /dev/null || die
+ chromium_remove_language_paks
+ popd > /dev/null || die
+
+ insinto "${CHROMIUM_HOME}"
+ doins out/Release/*.bin
+ doins out/Release/*.pak
+
+ if use bindist; then
+ # We built libffmpeg as a component library, but we can't distribute it
+ # with proprietary codec support. Remove it and make a symlink to the requested
+ # system library.
+ rm -f out/Release/libffmpeg.so \
+ || die "Failed to remove bundled libffmpeg.so (with proprietary codecs)"
+ # symlink the libffmpeg.so from either ffmpeg-chromium or ffmpeg[chromium].
+ einfo "Creating symlink to libffmpeg.so from $(usex ffmpeg-chromium ffmpeg-chromium ffmpeg[chromium])..."
+ dosym ../chromium/libffmpeg.so$(usex ffmpeg-chromium .${PV%%\.*} "") \
+ /usr/$(get_libdir)/chromium-browser/libffmpeg.so
+ fi
+
+ (
+ shopt -s nullglob
+ local files=(out/Release/*.so out/Release/*.so.[0-9])
+ [[ ${#files[@]} -gt 0 ]] && doins "${files[@]}"
+ )
+
+ if ! use system-icu && ! use headless; then
+ doins out/Release/icudtl.dat
+ fi
+
+ doins -r out/Release/locales
+ doins -r out/Release/MEIPreload
+
+ # Install vk_swiftshader_icd.json; bug #827861
+ doins out/Release/vk_swiftshader_icd.json
+
+ if [[ -d out/Release/swiftshader ]]; then
+ insinto "${CHROMIUM_HOME}/swiftshader"
+ doins out/Release/swiftshader/*.so
+ fi
+
+ # Install icons
+ local branding size
+ for size in 16 24 32 48 64 128 256 ; do
+ case ${size} in
+ 16|32) branding="chrome/app/theme/default_100_percent/chromium" ;;
+ *) branding="chrome/app/theme/chromium" ;;
+ esac
+ newicon -s ${size} "${branding}/product_logo_${size}.png" \
+ chromium-browser${browser_suffix}.png
+ done
+
+ # Install desktop entry
+ domenu out/Release/chromium-browser${browser_suffix}.desktop
+
+ # Install GNOME default application entry (bug #303100).
+ insinto /usr/share/gnome-control-center/default-apps
+ doins out/Release/chromium-browser${browser_suffix}.xml
+
+ # Install AppStream metadata
+ insinto /usr/share/appdata
+ doins out/Release/chromium-browser${browser_suffix}.appdata.xml
+
+ # Install manpage; bug #684550
+ doman out/Release/chromium-browser${browser_suffix}.1
+ dosym chromium-browser${browser_suffix}.1 /usr/share/man/man1/chromium${browser_suffix}.1
+
+ readme.gentoo_create_doc
+}
+
+pkg_postrm() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+}
+
+pkg_postinst() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+ readme.gentoo_print_elog
+
+ if use !headless && [[ -z "${REPLACING_VERSIONS}" ]]; then
+ if use vaapi; then
+ elog "Hardware-accelerated video decoding configuration:"
+ elog
+ elog "Chromium supports multiple backends for hardware acceleration. To enable one,"
+ elog " Add to CHROMIUM_FLAGS in /etc/chromium/default:"
+ elog
+ elog "1. VA-API with OpenGL (recommended for most users):"
+ elog " --enable-features=AcceleratedVideoDecodeLinuxGL"
+ elog " VaapiVideoDecoder may need to be added as well, but try without first."
+ elog
+ if use wayland; then
+ elog "2. Enhanced Wayland/EGL performance:"
+ elog " --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL"
+ elog
+ fi
+ if use X; then
+ elog "$(usex wayland "3" "2"). VA-API with Vulkan:"
+ elog " --enable-features=VaapiVideoDecoder,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE"
+ elog
+ if use wayland; then
+ elog " NOTE: Vulkan acceleration requires X11 and will not work under Wayland sessions."
+ elog " Use OpenGL-based acceleration instead when running under Wayland."
+ elog
+ fi
+ fi
+ elog "Additional options:"
+ elog " To enable hardware-accelerated encoding (if supported)"
+ elog " add 'AcceleratedVideoEncoder' to your feature list"
+ elog " VaapiIgnoreDriverChecks bypasses driver compatibility checks"
+ elog " (may be needed for newer/unsupported hardware)"
+ elog
+ else
+ elog "This Chromium build was compiled without VA-API support, which provides"
+ elog "hardware-accelerated video decoding."
+ fi
+ if use screencast; then
+ elog "Screencast is disabled by default at runtime. Either enable it"
+ elog "by navigating to chrome://flags/#enable-webrtc-pipewire-capturer"
+ elog "inside Chromium or add --enable-features=WebRTCPipeWireCapturer"
+ elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+ fi
+ if use gtk4; then
+ elog "Chromium prefers GTK3 over GTK4 at runtime. To override this"
+ elog "behavior you need to pass --gtk-version=4, e.g. by adding it"
+ elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+ fi
+ fi
+
+ if systemd_is_booted && ! [[ -f "/etc/machine-id" ]]; then
+ ewarn "The lack of an '/etc/machine-id' file on this system booted with systemd"
+ ewarn "indicates that the Gentoo handbook was not followed to completion."
+ ewarn ""
+ ewarn "Chromium is known to behave unpredictably with this system configuration;"
+ ewarn "please complete the configuration of this system before logging any bugs."
+ fi
+
+ # Stable slot doesn't change profile directory, and it's vanishingly unlikely that users will downgrade from dev.
+ if [[ -n "${REPLACING_VERSIONS}" ]]; then
+ local replacing_non_slotted=false
+ # there could be more than one PVR
+ for version in ${REPLACING_VERSIONS}; do
+ if ver_test "${version}" -le "145.0.7632.116"; then
+ replacing_non_slotted=true
+ break
+ fi
+ done
+ if ${replacing_non_slotted}; then
+ ewarn "This version of Chromium has replaced a non-slotted ebuild."
+ if [[ ${SLOT} != "stable" ]]; then
+ ewarn "This channel has its own profile directory, so your existing profile will not be used."
+ ewarn "To use your existing profile, either copy or move it to the new location."
+ ewarn "See https://wiki.gentoo.org/wiki/Chromium#Profile_Directories for more information."
+ ewarn ""
+ fi
+ ewarn "Any existing Progressive Web Apps (PWAs) will need to be reinstalled,"
+ ewarn "or have the path in the desktop files updated to point to the new wrapper script."
+ fi
+ fi
+}
diff --git a/www-client/chromium/chromium-150.0.7846.4.ebuild b/www-client/chromium/chromium-150.0.7846.4.ebuild
new file mode 100644
index 000000000000..9a911d02f6c5
--- /dev/null
+++ b/www-client/chromium/chromium-150.0.7846.4.ebuild
@@ -0,0 +1,1765 @@
+# Copyright 2009-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+# PACKAGING NOTES
+
+# Upstream roll their bundled Clang every two weeks, and the bundled Rust
+# is rolled regularly and depends on that. While we do our best to build
+# with system Clang, we may eventually hit the point where we need to use
+# the bundled Clang due to the use of prerelease features.
+
+# USE=bundled-toolchain is intended for users who want to use the same toolchain
+# as the upstream releases. It's also a good fallback in case we fall behind
+# and need to get a release out quickly (less likely with `dev` in-tree).
+# We can't rely on it as a default since the toolchain is only shipped for x86-64;
+# other architectures will need to use system toolchain.
+
+# Since m133 we are using CI-generated tarballs from
+# https://github.com/chromium-linux-tarballs/chromium-tarballs/
+
+# These are bit-for-bit identical to the official releases, but are built
+# using an external CI system that we have some control over, in case
+# issues pop up again with official tarball generation.
+
+GN_MIN_VER=0.2374
+# chromium-tools/get-chromium-toolchain-strings.py (or just use Chromicler)
+# Node for M145+ should be 24.12.0 but that's not packaged in Gentoo yet. See #969145
+TEST_FONT="9c07d19d9c5ee1ff94f717e6fb17e0c8c354e6f9"
+BUNDLED_CLANG_VER="llvmorg-23-init-10931-g20b6ec66-11"
+BUNDLED_RUST_VER="4c4205163abcbd08948b3efab796c543ba1ea687-3"
+RUST_SHORT_HASH=${BUNDLED_RUST_VER:0:10}-${BUNDLED_RUST_VER##*-}
+NODE_VER="24.12.0"
+ESBUILD_VER="0.25.1"
+ROLLUP_VER="4.57.1" # currently manual.
+VIRTUALX_REQUIRED="pgo"
+
+CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu he
+ hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr
+ sv sw ta te th tr uk ur vi zh-CN zh-TW"
+
+LLVM_COMPAT=( 21 )
+PYTHON_COMPAT=( python3_{11..14} )
+PYTHON_REQ_USE="xml(+)"
+RUST_MIN_VER=1.91.0
+RUST_NEEDS_LLVM="yes please"
+RUST_OPTIONAL="yes" # Not actually optional, but we don't need system Rust (or LLVM) with USE=bundled-toolchain
+RUST_REQ_USE="rustfmt" # Upstream run rustfmt on bindgen output, so we need it to be available.
+
+inherit check-reqs chromium-2 desktop flag-o-matic llvm-r1 multiprocessing ninja-utils pax-utils
+inherit python-any-r1 readme.gentoo-r1 rust systemd toolchain-funcs virtualx xdg-utils
+
+DESCRIPTION="Open-source version of Google Chrome web browser"
+HOMEPAGE="https://www.chromium.org/"
+PPC64_HASH="a85b64f07b489b8c6fdb13ecf79c16c56c560fc6"
+PATCH_V="150"
+COPIUM_COMMIT="b00f26bb5e0781020da5f830981472a142c6baf1"
+SRC_URI="https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/download/${PV}/chromium-${PV}-linux.tar.xz
+ https://deps.gentoo.zip/www-client/chromium/rollup-wasm-node-${ROLLUP_VER}.tgz
+ https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
+ !bundled-toolchain? (
+ https://codeberg.org/selfisekai/copium/archive/${COPIUM_COMMIT}.tar.gz
+ -> chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+ )
+ bundled-toolchain? (
+ https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-${BUNDLED_CLANG_VER}.tar.xz
+ -> chromium-clang-${BUNDLED_CLANG_VER}.tar.xz
+ https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/rust-toolchain-${BUNDLED_RUST_VER}-${BUNDLED_CLANG_VER%-*}.tar.xz
+ -> chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz
+ )
+ test? (
+ https://chromium-fonts.storage.googleapis.com/${TEST_FONT} -> chromium-testfonts-${TEST_FONT:0:10}.tar.gz
+ )
+ ppc64? (
+ https://gitlab.raptorengineering.com/raptor-engineering-public/chromium/openpower-patches/-/archive/${PPC64_HASH}/openpower-patches-${PPC64_HASH}.tar.bz2 -> chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+ )
+ pgo? ( https://github.com/elkablo/chromium-profiler/releases/download/v0.2/chromium-profiler-0.2.tar )"
+
+# https://gitweb.gentoo.org/proj/chromium-tools.git/tree/get-chromium-licences.py @ 145.0.7632.76
+LICENSE="Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD BSD-2 Base64 Boost-1.0 CC-BY-3.0 CC-BY-4.0 Clear-BSD FFT2D FTL"
+LICENSE+=" IJG ISC LGPL-2 LGPL-2.1 MIT MPL-1.1 MPL-2.0 Ms-PL PSF-2 SGI-B-2.0 SSLeay SunSoft Unicode-3.0"
+LICENSE+=" Unicode-DFS-2015 Unlicense UoI-NCSA ZLIB libtiff openssl"
+LICENSE+=" rar? ( unRAR )"
+
+SLOT="unstable"
+# Unstable in gentoo exists mostly to give devs some breathing room for beta/stable releases.
+# It shouldn't be keyworded but adventurous users are encouraged to select it;
+# there's official dev channel Google Chrome after all.
+# KEYWORDS="~amd64 ~arm64"
+
+IUSE_SYSTEM_LIBS="+system-harfbuzz +system-icu +system-zstd"
+IUSE="+X ${IUSE_SYSTEM_LIBS} bindist bundled-toolchain cups debug ffmpeg-chromium gtk4 +hangouts headless kerberos +official pax-kernel pgo"
+IUSE+=" +proprietary-codecs pulseaudio qt6 +rar +screencast selinux test +vaapi +wayland +widevine cpu_flags_ppc_vsx3"
+RESTRICT="
+ !bindist? ( bindist )
+ !test? ( test )
+ arm64? ( test )" # Tests require CFI, which requires LTO, which is broken on arm64 with LLVM 21.
+
+REQUIRED_USE="
+ !headless? ( || ( X wayland ) )
+ pgo? ( X !wayland )
+ screencast? ( wayland )
+ ffmpeg-chromium? ( bindist proprietary-codecs )
+"
+
+COMMON_X_DEPEND="
+ x11-libs/libXcomposite:=
+ x11-libs/libXcursor:=
+ x11-libs/libXdamage:=
+ x11-libs/libXfixes:=
+ >=x11-libs/libXi-1.6.0:=
+ x11-libs/libXrandr:=
+ x11-libs/libXrender:=
+ x11-libs/libXtst:=
+ x11-libs/libxshmfence:=
+"
+
+# sys-libs/zlib: https://bugs.gentoo.org/930365; -ng is not compatible.
+# We _could_ use the bundled minizip, but that's against policy.
+COMMON_SNAPSHOT_DEPEND="
+ system-icu? ( >=dev-libs/icu-73.0:= )
+ >=dev-libs/libxml2-2.12.4:=[icu]
+ dev-libs/nspr:=
+ >=dev-libs/nss-3.26:=
+ dev-libs/libxslt:=
+ media-libs/fontconfig:=
+ >=media-libs/freetype-2.11.0-r1:=
+ system-harfbuzz? ( >=media-libs/harfbuzz-3:0=[icu(-)] )
+ media-libs/libjpeg-turbo:=
+ system-zstd? ( >=app-arch/zstd-1.5.5:= )
+ >=media-libs/libwebp-0.4.0:=
+ media-libs/mesa:=[gbm(+)]
+ >=media-libs/openh264-2.6.0:=
+ sys-libs/zlib:=
+ !headless? (
+ dev-libs/glib:2
+ >=media-libs/alsa-lib-1.0.19:=
+ pulseaudio? ( media-libs/libpulse:= )
+ sys-apps/pciutils:=
+ kerberos? ( virtual/krb5 )
+ vaapi? ( >=media-libs/libva-2.7:=[X?,wayland?] )
+ X? (
+ x11-base/xorg-proto:=
+ x11-libs/libX11:=
+ x11-libs/libxcb:=
+ x11-libs/libXext:=
+ )
+ x11-libs/libxkbcommon:=
+ wayland? (
+ dev-libs/libffi:=
+ dev-libs/wayland:=
+ screencast? ( media-video/pipewire:= )
+ )
+ )
+"
+
+COMMON_DEPEND="
+ ${COMMON_SNAPSHOT_DEPEND}
+ app-arch/bzip2:=
+ dev-libs/expat:=
+ net-misc/curl[ssl]
+ sys-apps/dbus:=
+ media-libs/flac:=
+ sys-libs/zlib:=[minizip]
+ !headless? (
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ media-libs/mesa:=[X?,wayland?]
+ virtual/udev
+ x11-libs/cairo:=
+ x11-libs/gdk-pixbuf:2
+ x11-libs/pango:=
+ cups? ( >=net-print/cups-1.3.11:= )
+ qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ X? ( ${COMMON_X_DEPEND} )
+ )
+"
+RDEPEND="${COMMON_DEPEND}
+ !www-client/chromium:0
+ >=www-client/chromium-common-2
+ !headless? (
+ || (
+ x11-libs/gtk+:3[X?,wayland?]
+ gui-libs/gtk:4[X?,wayland?]
+ )
+ qt6? ( dev-qt/qtbase:6[X?,wayland?] )
+ )
+ virtual/ttf-fonts
+ selinux? ( sec-policy/selinux-chromium )
+ bindist? (
+ !ffmpeg-chromium? ( >=media-video/ffmpeg-6.1-r1:0/58.60.60[chromium] )
+ ffmpeg-chromium? ( media-video/ffmpeg-chromium:${PV%%\.*} )
+ )
+"
+DEPEND="${COMMON_DEPEND}
+ !headless? (
+ gtk4? ( gui-libs/gtk:4[X?,wayland?] )
+ !gtk4? ( x11-libs/gtk+:3[X?,wayland?] )
+ )
+"
+
+BDEPEND="
+ ${COMMON_SNAPSHOT_DEPEND}
+ ${PYTHON_DEPS}
+ $(python_gen_any_dep '
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ ')
+ >=app-arch/gzip-1.7
+ !headless? (
+ qt6? ( dev-qt/qtbase:6 )
+ )
+ !bundled-toolchain? ( $(llvm_gen_dep '
+ llvm-core/clang:${LLVM_SLOT}
+ llvm-core/llvm:${LLVM_SLOT}
+ official? (
+ !ppc64? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[cfi] )
+ ) ')
+ || (
+ $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}')
+ >=sys-devel/mold-2.41.0
+ )
+ ${RUST_DEPEND}
+ )
+ pgo? (
+ >=dev-python/selenium-3.141.0
+ >=dev-util/web_page_replay_go-20220314
+ )
+ >=dev-util/bindgen-0.72.1
+ >=dev-build/gn-${GN_MIN_VER}
+ app-alternatives/ninja
+ dev-lang/perl
+ >=dev-util/gperf-3.2
+ dev-util/esbuild:${ESBUILD_VER}
+ dev-vcs/git
+ >=net-libs/nodejs-${NODE_VER}[inspector]
+ sys-apps/hwdata
+ >=sys-devel/bison-2.4.3
+ sys-devel/flex
+ virtual/pkgconfig
+ x11-misc/xdg-utils
+"
+
+if ! has chromium_pkg_die ${EBUILD_DEATH_HOOKS}; then
+ EBUILD_DEATH_HOOKS+=" chromium_pkg_die";
+fi
+
+DISABLE_AUTOFORMATTING="yes"
+DOC_CONTENTS="
+Some web pages may require additional fonts to display properly.
+Try installing some of the following packages if some characters
+are not displayed properly:
+- media-fonts/arphicfonts
+- media-fonts/droid
+- media-fonts/ipamonafont
+- media-fonts/noto
+- media-fonts/ja-ipafonts
+- media-fonts/takao-fonts
+- media-fonts/wqy-microhei
+- media-fonts/wqy-zenhei
+
+To fix broken icons on the Downloads page, you should install an icon
+theme that covers the appropriate MIME types, and configure this as your
+GTK+ icon theme.
+
+For native file dialogs in KDE, install kde-apps/kdialog.
+
+To make password storage work with your desktop environment you may
+have install one of the supported credentials management applications:
+- app-crypt/libsecret (GNOME)
+- kde-frameworks/kwallet (KDE)
+If you have one of above packages installed, but don't want to use
+them in Chromium, then add --password-store=basic to CHROMIUM_FLAGS
+in /etc/chromium/default.
+"
+
+python_check_deps() {
+ python_has_version "dev-python/setuptools[${PYTHON_USEDEP}]"
+}
+
+pre_build_checks() {
+ # Check build requirements: bugs #471810, #541816, #914220
+ # We're going to start doing maths here on the size of an unpacked source tarball,
+ # this should make updates easier as chromium continues to balloon in size.
+ # xz -l /var/cache/distfiles/chromium-${PV}*.tar.xz
+ local base_disk=9 # Round up
+ use test && base_disk=$((base_disk + 5))
+ local extra_disk=1 # Always include a little extra space
+ local memory=4
+ tc-is-cross-compiler && extra_disk=$((extra_disk * 2))
+ if tc-is-lto || use pgo; then
+ memory=$((memory * 2 + 1))
+ tc-is-cross-compiler && extra_disk=$((extra_disk * 2)) # Double the requirements
+ use pgo && extra_disk=$((extra_disk + 4))
+ fi
+ if is-flagq '-g?(gdb)?([1-9])'; then
+ if use custom-cflags; then
+ extra_disk=$((extra_disk + 5))
+ fi
+ memory=$((memory * 2))
+ fi
+ local CHECKREQS_MEMORY="${memory}G"
+ local CHECKREQS_DISK_BUILD="$((base_disk + extra_disk))G"
+ check-reqs_${EBUILD_PHASE_FUNC}
+}
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]]; then
+ # The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+ pre_build_checks
+ fi
+
+ if use headless; then
+ local headless_unused_flags=("cups" "kerberos" "pulseaudio" "qt6" "vaapi" "wayland")
+ for myiuse in ${headless_unused_flags[@]}; do
+ use ${myiuse} && ewarn "Ignoring USE=${myiuse}, USE=headless is set."
+ done
+ fi
+
+ if ! use bindist && use ffmpeg-chromium; then
+ ewarn "Ignoring USE=ffmpeg-chromium, USE=bindist is not set."
+ fi
+}
+
+pkg_setup() {
+ if [[ ${MERGE_TYPE} != binary ]]; then
+ # The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+ pre_build_checks
+
+ # We haven't massaged any CFLAGS yet, so we want to do this before we force CC/CXX to prevent warnings.
+ local want_lto="false"
+ tc-is-lto && want_lto="true"
+
+ # The linux:unbundle toolchain in GN grabs CC, CXX, CPP (etc) from the environment
+ # We'll set these to clang here then use llvm-utils functions to very explicitly set these
+ # to a sane value.
+ # This is effectively the 'force-clang' path if GCC support is re-added.
+ if use !bundled-toolchain; then
+ llvm-r1_pkg_setup
+ rust_pkg_setup
+
+ # Forcing clang; respect llvm_slot_x to enable selection of impl via LLVM_COMPAT
+ AR=llvm-ar
+ CPP="${CHOST}-clang++-${LLVM_SLOT} -E"
+ NM=llvm-nm
+ CC="${CHOST}-clang-${LLVM_SLOT}"
+ CXX="${CHOST}-clang++-${LLVM_SLOT}"
+ fi
+
+ # LTO in Chromium means LLVM ThinLTO, if GCC support is re-added
+ # We'll need to handle that here too.
+ use_lto="false"
+ local lto_usable="true"
+ if [[ "$want_lto" == "true" ]]; then
+ if use arm64 && [[ "${LLVM_SLOT}" -lt 22 ]]; then
+ einfo "LTO is broken with LLVM 21 on arm64, ignoring CFLAGS."
+ lto_usable="false"
+ else
+ use_lto="true"
+ fi
+ # We can rely on GN to do this for us; without this builds
+ # take significantly longer with LTO enabled.
+ filter-lto
+ fi
+
+ if [[ "$use_lto" == "false" ]] && use official && [[ "$lto_usable" == "true" ]]; then
+ einfo "USE=official selected and LTO not detected."
+ einfo "It is _highly_ recommended that LTO be enabled for performance reasons"
+ einfo "and to be consistent with the upstream \"official\" build optimisations."
+ fi
+
+ if [[ "$use_lto" == "false" ]] && use test; then
+ die "Tests require CFI which requires LTO"
+ fi
+
+ export use_lto
+
+ if tc-is-cross-compiler; then
+ use pgo && die "The pgo USE flag cannot be used when cross-compiling"
+ CPP="${CBUILD}-clang++-${LLVM_SLOT} -E"
+ fi
+
+ # I hate doing this but upstream Rust have yet to come up with a better solution for
+ # us poor packagers. Required for Split LTO units, which are required for CFI.
+ export RUSTC_BOOTSTRAP=1
+
+ # Sanity checks for development convenience
+ if ver_test $(gn --version || die) -lt ${GN_MIN_VER}; then
+ die "dev-build/gn >= ${GN_MIN_VER} is required to build this Chromium"
+ fi
+
+ # Sometimes, when adding a new LLVM slot, devs (me) forget to install an appropriate lld.
+ if tc-ld-is-lld; then
+ local lld_ver=$(ld.lld --version | awk '{split($2,a,"."); print a[1]}' || die "Failed to check lld version")
+ if [[ ${lld_ver} -lt ${LLVM_SLOT} ]]; then
+ die "Your lld version (${lld_ver}) is too old for the selected LLVM slot (${LLVM_SLOT}). Please install a newer lld or select an older LLVM slot."
+ fi
+ fi
+ fi
+
+ chromium_suid_sandbox_check_kernel_config
+}
+
+src_unpack() {
+ unpack ${P}-linux.tar.xz
+ unpack chromium-patches-${PATCH_V}.tar.bz2
+ # These should only be required when we're not using the official toolchain
+ if use !bundled-toolchain; then
+ unpack chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+ fi
+
+ use pgo && unpack chromium-profiler-0.2.tar
+
+ if use test; then
+ # This just contains a bunch of font files that need to be unpacked (or moved) to the correct location.
+ local testfonts_dir="${WORKDIR}/${P}/third_party/test_fonts/test_fonts"
+ local testfonts_tar="${DISTDIR}/chromium-testfonts-${TEST_FONT:0:10}.tar.gz"
+ einfo "Unpacking test fonts ..."
+ tar xf "${testfonts_tar}" -C "${testfonts_dir}" || die "Failed to unpack testfonts"
+ fi
+
+ # We need to manually unpack this since M126 else we'd unpack one toolchain over the other.
+ # Since we're doing that anyway let's unpack to sensible locations to make symlink creation easier.
+ if use bundled-toolchain; then
+ einfo "Unpacking bundled Clang ..."
+ mkdir -p "${WORKDIR}"/clang || die "Failed to create clang directory"
+ tar xf "${DISTDIR}/chromium-clang-${BUNDLED_CLANG_VER}.tar.xz" -C "${WORKDIR}/clang" || die "Failed to unpack Clang"
+ einfo "Unpacking bundled Rust ..."
+ local rust_dir="${WORKDIR}/rust-toolchain"
+ mkdir -p "${rust_dir}" || die "Failed to create rust toolchain directory"
+ tar xf "${DISTDIR}/chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz" -C "${rust_dir}" ||
+ die "Failed to unpack Rust"
+ fi
+
+ if use ppc64; then
+ unpack chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+ fi
+
+ # This is a dirty hack, but we need rollup to build successfully and it's proving to be challenging
+ # to build locally due to deps
+ unpack rollup-wasm-node-${ROLLUP_VER}.tgz
+}
+
+remove_compiler_builtins() {
+ # We can't use the bundled compiler builtins with the system toolchain
+ # We used to `grep` then `sed`, but it was indirect. Combining the two into a single
+ # `awk` command is more efficient and lets us document the logic more clearly.
+
+ local pattern=' configs += [ "//build/config/clang:compiler_builtins" ]'
+ local target='build/config/compiler/BUILD.gn'
+
+ local tmpfile
+ tmpfile=$(mktemp) || die "Failed to create temporary file."
+
+ if awk -v pat="${pattern}" '
+ BEGIN {
+ match_found = 0
+ }
+
+ # If the delete countdown is active, decrement it and skip to the next line.
+ d > 0 { d--; next }
+
+ # If the current line matches the pattern...
+ $0 == pat {
+ match_found = 1 # ...set our flag to true.
+ d = 2 # Set delete counter for this line and the next two.
+ prev = "" # Clear the buffered previous line so it is not printed.
+ next
+ }
+
+ # For any other line, print the buffered previous line.
+ NR > 1 { print prev }
+
+ # Buffer the current line to be printed on the next cycle.
+ { prev = $0 }
+
+ END {
+ # Print the last line if it was not part of a deleted block.
+ if (d == 0) { print prev }
+
+ # If the pattern was never found, exit with a failure code.
+ if (match_found == 0) {
+ exit 1
+ }
+ }
+ ' "${target}" > "${tmpfile}"; then
+ # AWK SUCCEEDED (exit code 0): The pattern was found and edited.
+ # This is to avoid gawk's `-i inplace` option which users complain about.
+ mv "${tmpfile}" "${target}"
+ else
+ # AWK FAILED (exit code 1): The pattern was not found.
+ rm -f "${tmpfile}"
+ die "Awk patch failed: Pattern not found in ${target}."
+ fi
+}
+
+src_prepare() {
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # We'll fill this in as we go. Patches go in chromium-patches.
+ local PATCHES=()
+
+ PATCHES+=(
+ "${WORKDIR}/chromium-patches-${PATCH_V}/common/"
+ )
+
+ # https://issues.chromium.org/issues/442698344
+ # Unreleased fontconfig changed magic numbers and google have rolled to this version
+ if has_version "<=media-libs/fontconfig-2.17.1"; then
+ PATCHES+=( "${FILESDIR}/chromium-142-work-with-old-fontconfig.patch" )
+ fi
+
+ if use bundled-toolchain; then
+ # We need to symlink the toolchain into the expected location
+ einfo "Symlinking Clang toolchain to expected location ..."
+ mkdir -p third_party/llvm-build/ || die "Failed to create llvm-build directory"
+ # the 'Chromium Linux Tarballs' seem to already have 'Release+Asserts/{lib,bin}'; not sure if this is an
+ # upstream change - we're using the same scripts to build, theoretically. We'll still attempt to create
+ # llvm-build, but we'll rm Release+Asserts and symlink directly.
+ if [[ -d third_party/llvm-build/Release+Asserts ]]; then
+ rm -r third_party/llvm-build/Release+Asserts || die "Failed to remove third_party/llvm-build/Release+Asserts"
+ fi
+ ln -s "${WORKDIR}"/clang third_party/llvm-build/Release+Asserts || die "Failed to bundle Clang"
+ einfo "Symlinking Rust toolchain to expected location ..."
+ # As above, so below
+ if [[ -d third_party/rust-toolchain ]]; then
+ rm -r third_party/rust-toolchain || die "Failed to remove third_party/rust-toolchain"
+ fi
+ ln -s "${WORKDIR}"/rust-toolchain third_party/rust-toolchain || die "Failed to bundle rust"
+ cp "${WORKDIR}"/rust-toolchain/VERSION \
+ "${WORKDIR}"/rust-toolchain/INSTALLED_VERSION || die "Failed to set rust version"
+ else
+ # We don't need our toolchain patches if we're using the official toolchain
+
+ # Copium patches go here.
+ PATCHES+=(
+ "${WORKDIR}/copium/cr143-libsync-__BEGIN_DECLS.patch"
+ "${WORKDIR}/copium/cr149-unbundle-minizip-undo-unicode.patch"
+ )
+
+ # Automate conditional application of chromium-patches
+ # The directory structure is expected to be something like:
+ # chromium-patches-145/
+ # ├── toolchain/
+ # │ ├── cr123-foo.patch
+ # │ └── cr135-bar.patch
+ # ├── llvm/
+ # │ ├── cr144-baz.patch
+ # │ └── lt-23/
+ # │ └── cr145-bleeding-edge-llvm-feature.patch
+ # Where `lt-23` means "apply this patch if the LLVM version is less than 23".
+ # Only categories in `slot_map` will be checked for version constraints.
+ shopt -s nullglob
+ local -A slot_map=( [llvm]="${LLVM_SLOT}" [rust]="${RUST_SLOT}" )
+
+ for category in "${WORKDIR}/chromium-patches-${PATCH_V}"/*/; do
+ local category_name="${category%/}"
+ category_name="${category_name##*/}"
+
+ # Skip arch-specific categories
+ if [[ "${category_name}" == "ppc64le" ]]; then
+ use ppc64 || continue
+ fi
+
+ # We applied common patches above, no need to apply them again here
+ [[ "${category_name}" == "common" ]] && continue
+
+ # Unconditional patches for this category
+ local category_patches=( "${category}"*.patch )
+ [[ ${#category_patches[@]} -gt 0 ]] && PATCHES+=( "${category}" )
+
+ # Version-constrained subdirectories (e.g., llvm/lt-23/)
+ for constraint_dir in "${category}"*/; do
+ local dir_name="${constraint_dir%/}"
+ dir_name="${dir_name##*/}"
+ if [[ "${dir_name}" =~ ^lt-(.*)$ && -v slot_map[${category_name}] ]]; then
+ ver_test "${slot_map[${category_name}]}" -lt "${BASH_REMATCH[1]}" &&
+ PATCHES+=( "${constraint_dir}" )
+ fi
+ done
+ done
+
+ shopt -u nullglob
+
+ # Strictly speaking this doesn't need to be gated (no bundled toolchain for ppc64); it keeps the logic together
+ if use ppc64; then
+ local patchset_dir="${WORKDIR}/openpower-patches-${PPC64_HASH}/patches"
+ # patch causes build errors on 4K page systems (https://bugs.gentoo.org/show_bug.cgi?id=940304)
+ local page_size_patch="ppc64le/third_party/use-sysconf-page-size-on-ppc64.patch"
+ local isa_3_patch="ppc64le/core/baseline-isa-3-0.patch"
+ # Apply the OpenPOWER patches (check for page size and isa 3.0)
+ openpower_patches=( $(grep -E "^ppc64le|^upstream" "${patchset_dir}/series" | grep -v "${page_size_patch}" |
+ grep -v "${isa_3_patch}" || die) )
+ for patch in "${openpower_patches[@]}"; do
+ PATCHES+=( "${patchset_dir}/${patch}" )
+ done
+ if [[ $(getconf PAGESIZE) == 65536 ]]; then
+ PATCHES+=( "${patchset_dir}/${page_size_patch}" )
+ fi
+ # We use vsx3 as a proxy for 'want isa3.0' (POWER9)
+ if use cpu_flags_ppc_vsx3 ; then
+ PATCHES+=( "${patchset_dir}/${isa_3_patch}" )
+ fi
+ fi
+
+ remove_compiler_builtins
+
+ # We can't rely on the eselect'd Rust to actually include rustfmt, so we'll point to the selected slot specifically.
+ local suffix=""
+ if [[ "${RUST_TYPE}" == "binary" ]]; then
+ suffix="-bin-${RUST_SLOT}"
+ else
+ suffix="-${RUST_SLOT}"
+ fi
+ sed -i "s|/bin/rustfmt|/bin/rustfmt${suffix}|g" build/rust/rust_bindgen_generator.gni ||
+ die "Failed to update rustfmt path"
+
+ fi
+
+ # Do this before we apply patches since (e.g.) ppc64 needs to patch rollup and it's easier in ${S}
+ einfo "Moving rollup wasm-node package into place ..."
+ mkdir -p third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+ die "Failed to create node_modules/@rollup/wasm-node"
+ mv "${WORKDIR}"/package/* third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+ die "Failed to move rollup package"
+
+ default
+
+ # Sanity check esbuild version before we start removing files.
+ # We _could_ patch the version check out - in theory esbuild upstream are being super conservative after
+ # arch(AUR) packaged an `esbuild` binary and set ESBUILD_BINARY_PATH=/usr/bin/esbuild, causing much breakage,
+ # but this is fine too and exactly matches what upstream are expecting.
+ # https://github.com/evanw/esbuild/issues/2894
+ local esbuild_js="${S}/third_party/devtools-frontend/src/node_modules/esbuild/lib/main.js"
+ local found
+ found=$(awk -F'"' '/if \(binaryVersion !==/ {print $2}' "${esbuild_js}")
+ if [[ "${found}" != "${ESBUILD_VER}" ]]; then
+ die "esbuild version mismatch: expected ${ESBUILD_VER}, found ${found}"
+ fi
+
+ elog "Removing bundled binaries from source tree ..."
+ # Purge bundled ELF files: These are non-portable and will cause issues if used instead of system versions.
+ # Use `--wasm` to also remove WebAssembly binaries, if desired - they're portable so shouldn't break builds.
+ ${EPYTHON} "${FILESDIR}/bin-finder.py" --elf "${S}" | awk '{print $1}' | xargs rm -f ||
+ die "Failed to remove bundled binaries"
+
+ # And now we restore any that we actually need, from the host system
+ local esbuild_path="${S}/third_party/devtools-frontend/src/third_party/esbuild"
+ local -A restore_list=(
+ ["/usr/bin/esbuild-${ESBUILD_VER}"]="${esbuild_path}/esbuild"
+ ["/usr/bin/gperf"]="${S}/third_party/gperf/cipd/bin/gperf"
+ ["/usr/bin/node"]="${S}/third_party/node/linux/node-linux-x64/bin/node"
+ )
+
+ for src in "${!restore_list[@]}"; do
+ dst="${restore_list[${src}]}"
+ if [[ -f "${src}" ]]; then
+ einfo "Symlinking ${src} ..."
+ # Make sure the parent dir exists; some tarballs don't include (e.g.) node's bindir
+ mkdir -p "$(dirname "${dst}")" || die "Failed to create directory for ${dst}"
+ ln -s "${src}" "${dst}" || die "Failed to symlink ${dst} from ${src}"
+ if [[ ! -L "${dst}" || "$(readlink -f "${dst}")" != "${src}" ]]; then
+ die "Symlink verification failed for ${dst} -> ${src}"
+ fi
+ else
+ die "Expected to find ${src} to restore ${dst}, but it does not exist."
+ fi
+ done
+
+ # adjust python interpreter version
+ sed -i -e "s|\(^script_executable = \).*|\1\"${EPYTHON}\"|g" .gn || die
+
+ # Use the system copy of hwdata's usb.ids; upstream is woefully out of date (2015!)
+ sed 's|//third_party/usb_ids/usb.ids|/usr/share/hwdata/usb.ids|g' \
+ -i services/device/public/cpp/usb/BUILD.gn || die "Failed to set system usb.ids path"
+
+ # remove_bundled_libraries.py walks the source tree and looks for paths containing the substring 'third_party'
+ # whitelist matches use the right-most matching path component, so we need to whitelist from that point down.
+ local keeplibs=(
+ base/third_party/cityhash
+ base/third_party/double_conversion
+ base/third_party/icu
+ base/third_party/nspr
+ base/third_party/superfasthash
+ base/third_party/symbolize
+ base/third_party/xdg_user_dirs
+ buildtools/third_party/libc++
+ buildtools/third_party/libc++abi
+ net/third_party/mozilla_security_manager
+ net/third_party/quic
+ net/third_party/uri_template
+ third_party/abseil-cpp
+ third_party/angle
+ third_party/angle/src/common/third_party/xxhash
+ third_party/angle/src/third_party/ceval
+ third_party/angle/src/third_party/libXNVCtrl
+ third_party/angle/src/third_party/volk
+ third_party/anonymous_tokens
+ third_party/apple_apsl
+ third_party/axe-core
+ third_party/bidimapper
+ third_party/blink
+ third_party/boringssl
+ third_party/boringssl/src/third_party/fiat
+ third_party/breakpad
+ third_party/breakpad/breakpad/src/third_party/curl
+ third_party/brotli
+ third_party/catapult
+ third_party/catapult/common/py_vulcanize/third_party/rcssmin
+ third_party/catapult/common/py_vulcanize/third_party/rjsmin
+ third_party/catapult/third_party/beautifulsoup4-4.9.3
+ third_party/catapult/third_party/html5lib-1.1
+ third_party/catapult/third_party/polymer
+ third_party/catapult/third_party/six
+ third_party/catapult/third_party/typ
+ third_party/catapult/tracing/third_party/d3
+ third_party/catapult/tracing/third_party/gl-matrix
+ third_party/catapult/tracing/third_party/jpeg-js
+ third_party/catapult/tracing/third_party/jszip
+ third_party/catapult/tracing/third_party/mannwhitneyu
+ third_party/catapult/tracing/third_party/oboe
+ third_party/catapult/tracing/third_party/pako
+ third_party/ced
+ third_party/cld_3
+ third_party/closure_compiler
+ third_party/compiler-rt # Since M137 atomic is required; we could probably unbundle this as a target of opportunity.
+ third_party/content_analysis_sdk
+ third_party/cpuinfo
+ third_party/crabbyavif
+ third_party/crashpad
+ third_party/crashpad/crashpad/third_party/lss
+ third_party/crashpad/crashpad/third_party/zlib
+ third_party/crc32c
+ third_party/cros_system_api
+ third_party/d3
+ third_party/dav1d
+ third_party/dawn
+ third_party/dawn/third_party/gn/webgpu-cts
+ third_party/dawn/third_party/OpenGL-Registry
+ third_party/dawn/third_party/renderdoc
+ third_party/dawn/third_party/webgpu-headers
+ third_party/depot_tools
+ third_party/devscripts
+ third_party/devtools-frontend
+ third_party/devtools-frontend/src/front_end/third_party/acorn
+ third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+ third_party/devtools-frontend/src/front_end/third_party/axe-core
+ third_party/devtools-frontend/src/front_end/third_party/chromium
+ third_party/devtools-frontend/src/front_end/third_party/codemirror
+ third_party/devtools-frontend/src/front_end/third_party/csp_evaluator
+ third_party/devtools-frontend/src/front_end/third_party/diff
+ third_party/devtools-frontend/src/front_end/third_party/i18n
+ third_party/devtools-frontend/src/front_end/third_party/intl-messageformat
+ third_party/devtools-frontend/src/front_end/third_party/json5
+ third_party/devtools-frontend/src/front_end/third_party/legacy-javascript
+ third_party/devtools-frontend/src/front_end/third_party/lighthouse
+ third_party/devtools-frontend/src/front_end/third_party/lit
+ third_party/devtools-frontend/src/front_end/third_party/marked
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/third_party/mitt
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/third_party/parsel-js
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/third_party/rxjs
+ third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/third_party/urlpattern-polyfill
+ third_party/devtools-frontend/src/front_end/third_party/source-map-scopes-codec
+ third_party/devtools-frontend/src/front_end/third_party/third-party-web
+ third_party/devtools-frontend/src/front_end/third_party/vscode.web-custom-data
+ third_party/devtools-frontend/src/front_end/third_party/wasmparser
+ third_party/devtools-frontend/src/front_end/third_party/web-vitals
+ third_party/devtools-frontend/src/third_party
+ third_party/dom_distiller_js
+ third_party/dragonbox
+ third_party/eigen3
+ third_party/emoji-segmenter
+ third_party/farmhash
+ third_party/fast_float
+ third_party/fdlibm
+ third_party/federated_compute/chromium/fcp/confidentialcompute
+ third_party/federated_compute/src/fcp/base
+ third_party/federated_compute/src/fcp/confidentialcompute
+ third_party/federated_compute/src/fcp/protos/confidentialcompute
+ third_party/federated_compute/src/fcp/protos/federatedcompute
+ third_party/ffmpeg
+ third_party/fft2d
+ third_party/flatbuffers
+ third_party/fp16
+ third_party/freetype
+ third_party/fusejs
+ third_party/fxdiv
+ third_party/gemmlowp
+ third_party/google_input_tools
+ third_party/google_input_tools/third_party/closure_library
+ third_party/google_input_tools/third_party/closure_library/third_party/closure
+ third_party/googletest
+ third_party/gperf # We symlink system gperf, but this will purge the symlink since we tidy up afterwards.
+ third_party/highway
+ third_party/hunspell
+ third_party/ink/src/ink/brush
+ third_party/ink/src/ink/color
+ third_party/ink/src/ink/geometry
+ third_party/ink/src/ink/rendering
+ third_party/ink/src/ink/rendering/skia/common_internal
+ third_party/ink/src/ink/rendering/skia/native
+ third_party/ink/src/ink/rendering/skia/native/internal
+ third_party/ink/src/ink/strokes
+ third_party/ink/src/ink/types
+ third_party/inspector_protocol
+ third_party/ipcz
+ third_party/jinja2
+ third_party/jsoncpp
+ third_party/khronos
+ third_party/lens_server_proto
+ third_party/leveldatabase
+ third_party/libaddressinput
+ third_party/libaom
+ third_party/libaom/source/libaom/third_party/fastfeat
+ third_party/libaom/source/libaom/third_party/vector
+ third_party/libaom/source/libaom/third_party/x86inc
+ third_party/libc++
+ third_party/libdrm
+ third_party/libgav1
+ third_party/libjingle
+ third_party/libpfm4
+ third_party/libphonenumber
+ third_party/libpng
+ third_party/libsecret
+ third_party/libsrtp
+ third_party/libsync
+ third_party/libtess2/libtess2
+ third_party/libtess2/src/Include
+ third_party/libtess2/src/Source
+ third_party/liburlpattern
+ third_party/libva_protected_content
+ third_party/libvpx
+ third_party/libvpx/source/libvpx/third_party/x86inc
+ third_party/libwebm
+ third_party/libx11
+ third_party/libxcb-keysyms
+ third_party/libxml/chromium
+ third_party/libyuv
+ third_party/libzip
+ third_party/lit
+ third_party/llvm-libc
+ third_party/llvm-libc/src/shared/
+ third_party/lottie
+ third_party/lss
+ third_party/lzma_sdk
+ third_party/mako
+ third_party/markupsafe
+ third_party/material_color_utilities
+ third_party/metrics_proto
+ third_party/minigbm
+ third_party/ml_dtypes
+ third_party/modp_b64
+ third_party/nasm
+ third_party/nearby
+ third_party/neon_2_sse
+ third_party/node
+ third_party/oak/chromium/proto
+ third_party/oak/chromium/proto/attestation
+ third_party/omnibox_proto
+ third_party/one_euro_filter
+ third_party/openscreen
+ third_party/openscreen/src/third_party/
+ third_party/openscreen/src/third_party/tinycbor/src/src
+ third_party/opus
+ third_party/ots
+ third_party/pdfium
+ third_party/pdfium/third_party/agg23
+ third_party/pdfium/third_party/bigint
+ third_party/pdfium/third_party/freetype
+ third_party/pdfium/third_party/lcms
+ third_party/pdfium/third_party/libopenjpeg
+ third_party/pdfium/third_party/libtiff
+ third_party/perfetto
+ third_party/perfetto/protos/third_party/android
+ third_party/perfetto/protos/third_party/chromium
+ third_party/perfetto/protos/third_party/pprof
+ third_party/perfetto/protos/third_party/primes
+ third_party/perfetto/protos/third_party/simpleperf
+ third_party/pffft
+ third_party/ply
+ third_party/polymer
+ third_party/private_membership
+ third_party/private-join-and-compute
+ third_party/protobuf
+ third_party/protobuf/third_party/utf8_range
+ third_party/pthreadpool
+ third_party/puffin
+ third_party/pyjson5
+ third_party/pyyaml
+ third_party/rapidhash
+ third_party/re2
+ third_party/readability
+ third_party/rnnoise
+ third_party/rust
+ third_party/ruy
+ third_party/s2cellid
+ third_party/search_engines_data
+ third_party/securemessage
+ third_party/selenium-atoms
+ third_party/sentencepiece
+ third_party/sentencepiece/src/third_party/darts_clone
+ third_party/shell-encryption
+ third_party/simdutf
+ third_party/simplejson
+ third_party/six
+ third_party/skia
+ third_party/skia/include/third_party/vulkan
+ third_party/smhasher
+ third_party/snappy
+ third_party/spirv-headers
+ third_party/spirv-tools
+ third_party/sqlite
+ third_party/swiftshader
+ third_party/swiftshader/third_party/astc-encoder
+ third_party/swiftshader/third_party/llvm-subzero
+ third_party/swiftshader/third_party/marl
+ third_party/swiftshader/third_party/SPIRV-Headers/include/spirv
+ third_party/swiftshader/third_party/SPIRV-Tools
+ third_party/swiftshader/third_party/subzero
+ third_party/tensorflow_models
+ third_party/tensorflow-text
+ third_party/tflite
+ third_party/tflite/src/third_party/fft2d
+ third_party/tflite/src/third_party/xla/third_party/tsl
+ third_party/tflite/src/third_party/xla/xla/tsl/framework
+ third_party/tflite/src/third_party/xla/xla/tsl/lib/random
+ third_party/tflite/src/third_party/xla/xla/tsl/platform
+ third_party/tflite/src/third_party/xla/xla/tsl/protobuf
+ third_party/tflite/src/third_party/xla/xla/tsl/util
+ third_party/ukey2
+ third_party/utf
+ third_party/vulkan
+ third_party/wayland
+ third_party/webdriver
+ third_party/webgpu-cts
+ third_party/webrtc
+ third_party/webrtc/common_audio/third_party/ooura
+ third_party/webrtc/common_audio/third_party/spl_sqrt_floor
+ third_party/webrtc/modules/third_party/fft
+ third_party/webrtc/modules/third_party/g711
+ third_party/webrtc/modules/third_party/g722
+ third_party/widevine
+ third_party/woff2
+ third_party/wuffs
+ third_party/x11proto
+ third_party/xcbproto
+ third_party/xnnpack
+ third_party/zlib/google
+ third_party/zxcvbn-cpp
+ url/third_party/mozilla
+ v8/third_party/glibc
+ v8/third_party/inspector_protocol
+ v8/third_party/rapidhash-v8
+ v8/third_party/siphash
+ v8/third_party/utf8-decoder
+ v8/third_party/v8
+ v8/third_party/valgrind
+
+ # gyp -> gn leftovers
+ third_party/speech-dispatcher
+ third_party/usb_ids
+ )
+
+ if use rar; then
+ keeplibs+=( third_party/unrar )
+ fi
+
+ if use test; then
+ keeplibs+=(
+ third_party/breakpad/breakpad/src/processor
+ third_party/fuzztest
+ third_party/google_benchmark/src/include/benchmark
+ third_party/google_benchmark/src/src
+ third_party/test_fonts
+ third_party/test_fonts/fontconfig
+ third_party/test_fonts/test_fonts
+ )
+ fi
+
+ # USE=system-*
+ if ! use system-harfbuzz; then
+ keeplibs+=( third_party/harfbuzz )
+ fi
+
+ if ! use system-icu; then
+ keeplibs+=( third_party/icu )
+ fi
+
+ if ! use system-zstd; then
+ keeplibs+=( third_party/zstd )
+ fi
+
+ # Arch-specific
+ if use arm64 || use ppc64 ; then
+ keeplibs+=( third_party/swiftshader/third_party/llvm-10.0 )
+ fi
+ # we need to generate ppc64 stuff because upstream does not ship it yet
+ # it has to be done before unbundling.
+ if use ppc64; then
+ pushd third_party/libvpx >/dev/null || die
+ mkdir -p source/config/linux/ppc64 || die
+ # requires git and clang, bug #832803
+ # Revert https://chromium.googlesource.com/chromium/src/+/b463d0f40b08b4e896e7f458d89ae58ce2a27165%5E%21/third_party/libvpx/generate_gni.sh
+ # and https://chromium.googlesource.com/chromium/src/+/71ebcbce867dd31da5f8b405a28fcb0de0657d91%5E%21/third_party/libvpx/generate_gni.sh
+ # since we're not in a git repo
+ sed -i -e "s|^update_readme||g; s|clang-format|${EPREFIX}/bin/true|g; /^git -C/d; /git cl/d; /cd \$BASE_DIR\/\$LIBVPX_SRC_DIR/ign format --in-place \$BASE_DIR\/BUILD.gn\ngn format --in-place \$BASE_DIR\/libvpx_srcs.gni" \
+ generate_gni.sh || die
+ ./generate_gni.sh || die
+ popd >/dev/null || die
+
+ pushd third_party/ffmpeg >/dev/null || die
+ cp libavcodec/ppc/h264dsp.c libavcodec/ppc/h264dsp_ppc.c || die
+ cp libavcodec/ppc/h264qpel.c libavcodec/ppc/h264qpel_ppc.c || die
+ popd >/dev/null || die
+ fi
+
+ # Sanity check keeplibs, on major version bumps it is often necessary to update this list
+ # and this enables us to hit them all at once.
+ # There are some entries that need to be whitelisted (TODO: Why? The file is understandable, the rest seem odd)
+ whitelist_libs=(
+ net/third_party/quic
+ third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+ third_party/libjingle
+ third_party/mesa
+ third_party/skia/third_party/vulkan
+ third_party/vulkan
+ )
+ local not_found_libs=()
+ for lib in "${keeplibs[@]}"; do
+ if [[ ! -d "${lib}" ]] && ! has "${lib}" "${whitelist_libs[@]}"; then
+ not_found_libs+=( "${lib}" )
+ fi
+ done
+
+ if [[ ${#not_found_libs[@]} -gt 0 ]]; then
+ eerror "The following \`keeplibs\` directories were not found in the source tree:"
+ for lib in "${not_found_libs[@]}"; do
+ eerror " ${lib}"
+ done
+ die "Please update the ebuild."
+ fi
+
+ # Remove most bundled libraries. Some are still needed.
+ einfo "Unbundling third-party libraries ..."
+ build/linux/unbundle/remove_bundled_libraries.py "${keeplibs[@]}" --do-remove || die
+
+ # Interferes with our bundled clang path; we don't want stripped binaries anyway.
+ sed -i -e 's|${clang_base_path}/bin/llvm-strip|/bin/true|g' \
+ -e 's|${clang_base_path}/bin/llvm-objcopy|/bin/true|g' \
+ build/linux/strip_binary.gni || die
+}
+
+chromium_configure() {
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # 974899: sometimes people try to build with a non-Unicode locale and python gets very upset
+ python_export_utf8_locale || die "Chromium builds require a UTF-8 locale."
+
+ # Bug 491582.
+ export TMPDIR="${WORKDIR}/temp"
+ mkdir -p -m 755 "${TMPDIR}" || die
+
+ # https://bugs.gentoo.org/654216
+ addpredict /dev/dri/ #nowarn
+
+ # Use system-provided libraries.
+ # TODO: freetype -- remove sources (https://bugs.chromium.org/p/pdfium/issues/detail?id=733).
+ # TODO: use_system_hunspell (upstream changes needed).
+ # TODO: use_system_protobuf (bug #525560).
+ # TODO: use_system_sqlite (http://crbug.com/22208).
+
+ # libevent: https://bugs.gentoo.org/593458
+ local gn_system_libraries=(
+ flac
+ fontconfig
+ freetype
+ # Need harfbuzz_from_pkgconfig target
+ #harfbuzz-ng
+ libjpeg
+ libwebp
+ libxml
+ libxslt
+ openh264
+ zlib
+ )
+ if use system-icu; then
+ gn_system_libraries+=( icu )
+ fi
+
+ if use system-zstd; then
+ gn_system_libraries+=( zstd )
+ fi
+
+ build/linux/unbundle/replace_gn_files.py --system-libraries "${gn_system_libraries[@]}" ||
+ die "Failed to replace GN files for system libraries"
+
+ # TODO 131: The above call clobbers `enable_freetype = true` in the freetype gni file
+ # drop the last line, then append the freetype line and a new curly brace to end the block
+ local freetype_gni="build/config/freetype/freetype.gni"
+ sed -i -e '$d' ${freetype_gni} || die
+ echo " enable_freetype = true" >> ${freetype_gni} || die
+ echo "}" >> ${freetype_gni} || die
+
+ if use !custom-cflags; then
+ replace-flags "-Os" "-O2"
+ strip-flags
+ # Debug info section overflows without component build
+ # Prevent linker from running out of address space, bug #471810 .
+ filter-flags "-g*"
+ # 949123: Several multimedia components explicitly build with specific CFLAGS and
+ # use runtime detection to enable optimisations; unfortunately any of our CFLAGS are suffixed
+ # to the end of the command line, which causes build failures.
+ # Since M150 `skia` will begin breaking for x86_64 due to compilation of `avx512` code paths;
+ # we need to filter these for all arches.
+ filter-flags "-march*" "-mtune*" "-mcpu*"
+
+ fi
+
+ # We don't use the same clang version as upstream, and with -Werror
+ # we need to make sure that we don't get superfluous warnings.
+ append-flags -Wno-unknown-warning-option
+ if tc-is-cross-compiler; then # can you cross-compile with the bundled toolchain?
+ export BUILD_CXXFLAGS+=" -Wno-unknown-warning-option"
+ export BUILD_CFLAGS+=" -Wno-unknown-warning-option"
+ fi
+
+ # Start building our GN options
+ local myconf_gn=() # Tip: strings must be quoted, bools or numbers are fine
+
+ if use !bundled-toolchain; then
+ # We already forced the "correct" clang via pkg_setup
+
+ if tc-is-cross-compiler; then
+ CC="${CC} -target ${CHOST} --sysroot ${ESYSROOT}"
+ CXX="${CXX} -target ${CHOST} --sysroot ${ESYSROOT}"
+ BUILD_AR=${AR}
+ BUILD_CC=${CC}
+ BUILD_CXX=${CXX}
+ BUILD_NM=${NM}
+ fi
+
+ # Make sure the build system will use the right tools, bug #340795.
+ tc-export AR CC CXX NM
+
+ strip-unsupported-flags
+ append-ldflags -Wl,--undefined-version # https://bugs.gentoo.org/918897#c32
+
+ myconf_gn+=(
+ "is_clang=true"
+ "clang_use_chrome_plugins=false"
+ "use_clang_modules=false" # M141 enables this for the linux platform by default.
+ 'custom_toolchain="//build/toolchain/linux/unbundle:default"'
+ # From M127 we need to provide a location for libclang and the clang resource dir so that bindgen can find them
+ "bindgen_libclang_path=\"$(get_llvm_prefix)/$(get_libdir)\""
+ "bindgen_clang_resource_dir=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/include\""
+ "bindgen_extra_clang_args=[\"-I${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/include\"]"
+ "clang_base_path=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/\""
+ "rust_bindgen_root=\"${EPREFIX}/usr/\""
+ "rust_sysroot_absolute=\"$(get_rust_prefix)\""
+ "rustc_version=\"${RUST_SLOT}\""
+ )
+
+ if tc-ld-is-mold; then
+ myconf_gn+=(
+ "use_mold=true"
+ "use_lld=false"
+ "linker_path=\"${EPREFIX}/usr/bin/mold\""
+ )
+ else
+ myconf_gn+=( "use_lld=true" )
+ fi
+
+ if [[ ${LLVM_SLOT} -lt 23 ]]; then
+ # Workaround for -fsanitize-ignore-for-ubsan-feature (added in LLVM 23)
+ myconf_gn+=( 'clang_has_ubsan_feature_ignore=false' )
+ fi
+
+ if ! tc-is-cross-compiler; then
+ myconf_gn+=( 'host_toolchain="//build/toolchain/linux/unbundle:default"' )
+ else
+ tc-export BUILD_{AR,CC,CXX,NM}
+ myconf_gn+=(
+ 'host_toolchain="//build/toolchain/linux/unbundle:host"'
+ 'v8_snapshot_toolchain="//build/toolchain/linux/unbundle:host"'
+ "host_pkg_config=\"$(tc-getBUILD_PKG_CONFIG)\""
+ "pkg_config=\"$(tc-getPKG_CONFIG)\""
+ )
+
+ # setup cups-config, build system only uses --libs option
+ if use cups; then
+ mkdir "${T}/cups-config" || die
+ cp "${ESYSROOT}/usr/bin/${CHOST}-cups-config" "${T}/cups-config/cups-config" || die
+ export PATH="${PATH}:${T}/cups-config"
+ fi
+
+ # Don't inherit PKG_CONFIG_PATH from environment
+ local -x PKG_CONFIG_PATH=
+ fi
+
+ fi # !bundled-toolchain
+
+ local myarch
+ myarch="$(tc-arch)"
+ case ${myarch} in
+ amd64)
+ # Bug 530248, 544702, 546984, 853646.
+ use !custom-cflags && filter-flags -mno-mmx -mno-sse2 -mno-ssse3 -mno-sse4.1 \
+ -mno-avx -mno-avx2 -mno-fma -mno-fma4 -mno-xop -mno-sse4a
+ myconf_gn+=( 'target_cpu="x64"' )
+ ;;
+ arm64)
+ myconf_gn+=( 'target_cpu="arm64"' )
+ ;;
+ ppc64)
+ myconf_gn+=( 'target_cpu="ppc64"' )
+ ;;
+ *)
+ die "Failed to determine target arch, got '${myarch}'."
+ ;;
+ esac
+
+ # Common options
+
+ myconf_gn+=(
+ # Disable code formating of generated files
+ "blink_enable_generated_code_formatting=false"
+ # enable DCHECK with USE=debug only, increases chrome binary size by 30%, bug #811138.
+ # DCHECK is fatal by default, make it configurable at runtime, #bug 807881.
+ "dcheck_always_on=$(usex debug true false)"
+ "dcheck_is_configurable=$(usex debug true false)"
+ # Chromium builds provided by Linux distros should disable the testing config
+ "disable_fieldtrial_testing_config=true"
+ # Custom patch: Enable building Chromium as individual channels (e.g. stable, beta, dev) that
+ # use different profile directories, desktop entries, etc. This enables slotting the ebuild.
+ "enable_channel_branding=true"
+ # 131 began laying the groundwork for replacing freetype with
+ # "Rust-based Fontations set of libraries plus Skia path rendering"
+ # We now need to opt-in
+ "enable_freetype=true"
+ "enable_hangout_services_extension=$(usex hangouts true false)"
+ # Don't need nocompile checks and GN crashes with our config (verify with modern GN)
+ "enable_nocompile_tests=false"
+ # pseudolocales are only used for testing
+ "enable_pseudolocales=false"
+ "enable_widevine=$(usex widevine true false)"
+ # Disable fatal linker warnings, bug 506268.
+ "fatal_linker_warnings=false"
+ # Set up Google API keys, see http://www.chromium.org/developers/how-tos/api-keys
+ # Note: these are for Gentoo use ONLY. For your own distribution,
+ # please get your own set of keys. Feel free to contact chromium@gentoo.org for more info.
+ # note: OAuth2 is patched in; check patchset for details.
+ 'google_api_key="AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc"'
+ # Component build isn't generally intended for use by end users. It's mostly useful
+ # for development and debugging.
+ "is_component_build=false"
+ # GN needs explicit config for Debug/Release as opposed to inferring it from build directory.
+ "is_debug=false"
+ "is_official_build=$(usex official true false)"
+ # Enable ozone wayland and/or headless support
+ "ozone_auto_platforms=false"
+ "ozone_platform_headless=true"
+ # Enables building without non-free unRAR licence
+ "safe_browsing_use_unrar=$(usex rar true false)"
+ "thin_lto_enable_optimizations=${use_lto}"
+ "treat_warnings_as_errors=false"
+ # Use in-tree libc++ (buildtools/third_party/libc++ and buildtools/third_party/libc++abi)
+ # instead of the system C++ library for C++ standard library support.
+ # default: true, but let's be explicit (forced since 120 ; USE removed 127).
+ "use_custom_libcxx=true"
+ # Enable ozone wayland and/or headless support
+ "use_ozone=true"
+ # The sysroot is the oldest debian image that chromium supports, we don't need it
+ "use_sysroot=false"
+ # See dependency logic in third_party/BUILD.gn
+ "use_system_harfbuzz=$(usex system-harfbuzz true false)"
+ "use_thin_lto=${use_lto}"
+ # Only enabled for clang, but gcc has endian macros too
+ "v8_use_libm_trig_functions=true"
+ )
+
+ if use bindist ; then
+ myconf_gn+=(
+ # If this is set to false Chromium won't be able to load any proprietary codecs
+ # even if provided with an ffmpeg capable of h264/aac decoding
+ "proprietary_codecs=true"
+ 'ffmpeg_branding="Chrome"'
+ # build ffmpeg as an external component (libffmpeg.so) that we can remove / substitute
+ "is_component_ffmpeg=true"
+ )
+ else
+ myconf_gn+=(
+ "proprietary_codecs=$(usex proprietary-codecs true false)"
+ "ffmpeg_branding=\"$(usex proprietary-codecs Chrome Chromium)\""
+ )
+ fi
+
+ if use headless; then
+ myconf_gn+=(
+ "enable_print_preview=false"
+ "enable_remoting=false"
+ 'ozone_platform="headless"'
+ "rtc_use_pipewire=false"
+ "use_alsa=false"
+ "use_cups=false"
+ "use_gio=false"
+ "use_glib=false"
+ "use_gtk=false"
+ "use_kerberos=false"
+ "use_libpci=false"
+ "use_pangocairo=false"
+ "use_pulseaudio=false"
+ "use_qt5=false"
+ "use_qt6=false"
+ "use_udev=false"
+ "use_vaapi=false"
+ "use_xkbcommon=false"
+ )
+ else
+ myconf_gn+=(
+ "gtk_version=$(usex gtk4 4 3)"
+ # link pulseaudio directly (DT_NEEDED) instead of using dlopen.
+ # helps with automated detection of ABI mismatches and prevents silent errors.
+ "link_pulseaudio=$(usex pulseaudio true false)"
+ "ozone_platform_wayland=$(usex wayland true false)"
+ "ozone_platform_x11=$(usex X true false)"
+ "ozone_platform=\"$(usex wayland wayland x11)\""
+ "rtc_use_pipewire=$(usex screencast true false)"
+ "use_cups=$(usex cups true false)"
+ "use_kerberos=$(usex kerberos true false)"
+ "use_pulseaudio=$(usex pulseaudio true false)"
+ "use_qt5=false"
+ "use_system_libffi=$(usex wayland true false)"
+ "use_system_minigbm=true"
+ "use_vaapi=$(usex vaapi true false)"
+ "use_xkbcommon=true"
+ )
+ if use qt6; then
+ local cbuild_libdir
+ cbuild_libdir="$(get_libdir)"
+ if tc-is-cross-compiler; then
+ # Hack to workaround get_libdir not being able to handle CBUILD, bug #794181
+ cbuild_libdir="$($(tc-getBUILD_PKG_CONFIG) --keep-system-libs --libs-only-L libxslt)"
+ cbuild_libdir="${cbuild_libdir:2}"
+ cbuild_libdir="${cbuild_libdir/% }"
+ fi
+ myconf_gn+=(
+ "use_qt6=true"
+ "moc_qt6_path=\"${EPREFIX}/usr/${cbuild_libdir}/qt6/libexec\""
+ )
+ else
+ myconf_gn+=( "use_qt6=false" )
+ fi
+ fi
+
+ # Explicitly disable ICU data file support for system-icu/headless builds.
+ if use system-icu || use headless; then
+ myconf_gn+=( "icu_use_data_file=false" )
+ fi
+
+ if use official; then
+ # Allow building against system libraries in official builds
+ sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \
+ tools/generate_shim_headers/generate_shim_headers.py || die
+ if use !ppc64; then
+ myconf_gn+=( "is_cfi=${use_lto}" )
+ else
+ myconf_gn+=( "is_cfi=false" ) # requires llvm-runtimes/compiler-rt-sanitizers[cfi]
+ fi
+ # Don't add symbols to build
+ myconf_gn+=( "symbol_level=0" )
+ fi
+
+ if use pgo; then
+ myconf_gn+=( "chrome_pgo_phase=${1}" )
+ if [[ "$1" == "2" ]]; then
+ myconf_gn+=( "pgo_data_path=${2}" )
+ fi
+ else
+ myconf_gn+=( "chrome_pgo_phase=0" )
+ fi
+
+ # Odds and ends
+
+ # skipping typecheck is only supported on amd64, bug #876157
+ if ! use amd64; then
+ myconf_gn+=( "devtools_skip_typecheck=false" )
+ fi
+
+ # Disable external code space for V8 for ppc64. It is disabled for ppc64
+ # by default, but cross-compiling on amd64 enables it again.
+ if tc-is-cross-compiler && use ppc64; then
+ myconf_gn+=( "v8_enable_external_code_space=false" )
+ fi
+
+ # Since we build from tarballs, we need to set the channel here so that it can be used in the build.
+ export CHROME_VERSION_EXTRA="${SLOT}"
+
+ einfo "Configuring Chromium ..."
+ set -- gn gen --args="${myconf_gn[*]}${EXTRA_GN:+ ${EXTRA_GN}}" out/Release
+ echo "$@"
+ "$@" || die "Failed to configure Chromium"
+}
+
+src_configure() {
+ chromium_configure $(usex pgo 1 0)
+}
+
+chromium_compile() {
+
+ # Final link uses lots of file descriptors.
+ ulimit -n 2048
+
+ # Calling this here supports resumption via FEATURES=keepwork
+ python_setup
+
+ # Don't inherit PYTHONPATH from environment, bug #789021, #812689
+ local -x PYTHONPATH=
+
+ # Build mksnapshot and pax-mark it.
+ if use pax-kernel; then
+ local x
+ for x in mksnapshot v8_context_snapshot_generator code_cache_generator; do
+ if tc-is-cross-compiler; then
+ eninja -C out/Release "host/${x}"
+ pax-mark m "out/Release/host/${x}"
+ else
+ eninja -C out/Release "${x}"
+ pax-mark m "out/Release/${x}"
+ fi
+ done
+ fi
+
+ # Even though ninja autodetects number of CPUs, we respect
+ # user's options, for debugging with -j 1 or any other reason.
+ eninja -C out/Release chrome chromedriver chrome_sandbox $(use test && echo "base_unittests")
+
+ pax-mark m out/Release/chrome
+
+ # This codepath does minimal patching, so we're at the mercy of upstream
+ # CFLAGS. This is fine - we're not intending to force this on users
+ # and we do a lot of flag 'management' anyway.
+ if use bundled-toolchain; then
+ QA_FLAGS_IGNORED="
+ usr/lib64/chromium-browser/chrome
+ usr/lib64/chromium-browser/chrome-sandbox
+ usr/lib64/chromium-browser/chromedriver
+ usr/lib64/chromium-browser/chrome_crashpad_handler
+ usr/lib64/chromium-browser/libEGL.so
+ usr/lib64/chromium-browser/libGLESv2.so
+ usr/lib64/chromium-browser/libVkICD_mock_icd.so
+ usr/lib64/chromium-browser/libVkLayer_khronos_validation.so
+ usr/lib64/chromium-browser/libqt6_shim.so
+ usr/lib64/chromium-browser/libvk_swiftshader.so
+ usr/lib64/chromium-browser/libvulkan.so.1
+ "
+ fi
+}
+
+# This function is called from virtx, and must always return so that Xvfb
+# session isn't left running. If we return 1, virtx will call die().
+chromium_profile() {
+ einfo "Profiling for PGO"
+
+ pushd "${WORKDIR}/chromium-profiler-"* >/dev/null || return 1
+
+ # Remove old profdata in case profiling was interrupted.
+ rm -rf "${1}" || return 1
+
+ if ! "${EPYTHON}" ./chromium_profiler.py \
+ --chrome-executable "${S}/out/Release/chrome" \
+ --chromedriver-executable "${S}/out/Release/chromedriver.unstripped" \
+ --add-arg no-sandbox --add-arg disable-dev-shm-usage \
+ --profile-output "${1}"; then
+ eerror "Profiling failed"
+ return 1
+ fi
+
+ popd >/dev/null || return 1
+}
+
+src_compile() {
+ if use pgo; then
+ local profdata
+
+ profdata="${WORKDIR}/chromium.profdata"
+
+ if [[ ! -e "${WORKDIR}/.pgo-profiled" ]]; then
+ chromium_compile
+ virtx chromium_profile "$profdata"
+
+ touch "${WORKDIR}/.pgo-profiled" || die
+ fi
+
+ if [[ ! -e "${WORKDIR}/.pgo-phase-2-configured" ]]; then
+ # Remove phase 1 output
+ rm -r out/Release || die
+
+ chromium_configure 2 "$profdata"
+
+ touch "${WORKDIR}/.pgo-phase-2-configured" || die
+ fi
+
+ if [[ ! -e "${WORKDIR}/.pgo-phase-2-compiled" ]]; then
+ chromium_compile
+ touch "${WORKDIR}/.pgo-phase-2-compiled" || die
+ fi
+ else
+ chromium_compile
+ fi
+
+ mv out/Release/chromedriver{.unstripped,} || die
+
+ rm -f out/Release/locales/*.pak.info || die
+
+ # Generate support files (desktop file, manpage, etc.) See: #684550 #706786 #968958
+ ${EPYTHON} "${FILESDIR}/generate-support-files.py" \
+ --installdir "/usr/$(get_libdir)/chromium-browser" \
+ --channel "${SLOT}" ||
+ die "Failed to generate support files"
+}
+
+src_test() {
+ # Tests may be flaky with usersandbox, and the test runner executes significantly faster without.
+ # If you seem to be excluding too many tests for a particular milestone: comment them out, reboot, and
+ # run the tests again. If that doesn't help, try FEATURES="-usersandbox" and send it because obviously the
+ # chromium gods are not smiling upon you today. Do some runtime testing, obvs.
+ local skip_tests=(
+ # Wildcard exclusions (if all tests in a test suite are broken)
+ 'AlternateTestParams/PartitionAllocDeathTest.RepeatedAllocReturnNullDirect/*'
+ 'AlternateTestParams/PartitionAllocDeathTest.RepeatedReallocReturnNullDirect/*'
+ 'AlternateTestParams/PartitionAllocTest.*' # 200+ tests, >= 1 crashes entire test runner with usersandbox.
+ 'CheckExitCodeAfterSignalHandlerDeathTest.*'
+ 'CriticalProcessAndThreadSpotChecks/HangWatcherAnyCriticalThreadTests.*'
+ 'LazyThreadPoolTaskRunnerEnvironmentTest.*' # M142
+ 'ToolsSanityTest.BadVirtualCall*'
+ # requires en-us locale
+ SysStrings.SysNativeMBAndWide
+ SysStrings.SysNativeMBToWide
+ SysStrings.SysWideToNativeMB
+ # Specific test cases
+ CancelableEventTest.BothCancelFailureAndSucceedOccurUnderContention
+ FilePathTest.FromUTF8Unsafe_And_AsUTF8Unsafe
+ HistogramTesterTest.PumaTestUniqueSample
+ ImmediateCrashTest.ExpectedOpcodeSequence # M150
+ PathServiceTest.CheckedGetFailure
+ PlatformThreadTest.CanChangeThreadType
+ RawPtrTest.SetLookupUsesGetForComparison # M146 ; also broken for alpine in M144.
+ RustLogIntegrationTest.CheckAllSeverity
+ StackCanary.ChangingStackCanaryCrashesOnReturn
+ StackTraceDeathTest.StackDumpSignalHandlerIsMallocFree
+ TestLauncherTools.TruncateSnippetFocusedMatchesFatalMessagesTest
+ ThreadPoolEnvironmentConfig.CanUseBackgroundPriorityForWorker
+ )
+ local test_filter="-$(IFS=:; printf '%s' "${skip_tests[*]}")"
+ # test-launcher-bot-mode enables parallelism and plain output
+ # Check individual tests with --gtest_filter=<test you want> --single-process-tests
+ ./out/Release/base_unittests --test-launcher-bot-mode \
+ --test-launcher-jobs="$(get_makeopts_jobs)" \
+ --gtest_filter="${test_filter}" || die "Tests failed!"
+}
+
+src_install() {
+ local browser_suffix
+ if [[ "${SLOT}" != "stable" ]]; then
+ browser_suffix="-${SLOT}"
+ else
+ browser_suffix=""
+ fi
+ local CHROMIUM_HOME="/usr/$(get_libdir)/chromium-browser${browser_suffix}"
+ exeinto "${CHROMIUM_HOME}"
+ doexe out/Release/chrome
+
+ newexe out/Release/chrome_sandbox chrome-sandbox
+ fperms 4755 "${CHROMIUM_HOME}/chrome-sandbox"
+
+ doexe out/Release/chromedriver
+ doexe out/Release/chrome_crashpad_handler
+
+ ozone_auto_session () {
+ use X && use wayland && ! use headless && echo true || echo false
+ }
+
+ cat <<- EOF > "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+ #!/bin/bash
+ # Wrapper to launch slotted Chromium via the chromium-common launcher script.
+ export CHROME_DESKTOP="chromium-browser${browser_suffix}.desktop"
+ export CHROME_EXEC_NAME="chromium-browser${browser_suffix}"
+ export CHROME_VERSION_EXTRA="${SLOT}"
+ export CHROME_WRAPPER="\$(readlink -f "\$0")"
+ export OZONE_AUTO_SESSION=$(ozone_auto_session)
+
+ exec /usr/libexec/chromium/chromium-launcher.sh "\$@"
+ EOF
+
+ chmod 755 "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+
+ # It is important that we name the target "chromium-browser",
+ # xdg-utils expect it; bug #355517.
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-browser${browser_suffix}
+ # keep the old symlink around for consistency
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium${browser_suffix}
+
+ dosym "${CHROMIUM_HOME}/chromedriver" /usr/bin/chromedriver${browser_suffix}
+
+ pushd out/Release/locales > /dev/null || die
+ chromium_remove_language_paks
+ popd > /dev/null || die
+
+ insinto "${CHROMIUM_HOME}"
+ doins out/Release/*.bin
+ doins out/Release/*.pak
+
+ if use bindist; then
+ # We built libffmpeg as a component library, but we can't distribute it
+ # with proprietary codec support. Remove it and make a symlink to the requested
+ # system library.
+ rm -f out/Release/libffmpeg.so \
+ || die "Failed to remove bundled libffmpeg.so (with proprietary codecs)"
+ # symlink the libffmpeg.so from either ffmpeg-chromium or ffmpeg[chromium].
+ einfo "Creating symlink to libffmpeg.so from $(usex ffmpeg-chromium ffmpeg-chromium ffmpeg[chromium])..."
+ dosym ../chromium/libffmpeg.so$(usex ffmpeg-chromium .${PV%%\.*} "") \
+ /usr/$(get_libdir)/chromium-browser/libffmpeg.so
+ fi
+
+ (
+ shopt -s nullglob
+ local files=(out/Release/*.so out/Release/*.so.[0-9])
+ [[ ${#files[@]} -gt 0 ]] && doins "${files[@]}"
+ )
+
+ if ! use system-icu && ! use headless; then
+ doins out/Release/icudtl.dat
+ fi
+
+ doins -r out/Release/locales
+ doins -r out/Release/MEIPreload
+
+ # Install vk_swiftshader_icd.json; bug #827861
+ doins out/Release/vk_swiftshader_icd.json
+
+ if [[ -d out/Release/swiftshader ]]; then
+ insinto "${CHROMIUM_HOME}/swiftshader"
+ doins out/Release/swiftshader/*.so
+ fi
+
+ # Install icons
+ local branding size
+ for size in 16 24 32 48 64 128 256 ; do
+ case ${size} in
+ 16|32) branding="chrome/app/theme/default_100_percent/chromium" ;;
+ *) branding="chrome/app/theme/chromium" ;;
+ esac
+ newicon -s ${size} "${branding}/product_logo_${size}.png" \
+ chromium-browser${browser_suffix}.png
+ done
+
+ # Install desktop entry
+ domenu out/Release/chromium-browser${browser_suffix}.desktop
+
+ # Install GNOME default application entry (bug #303100).
+ insinto /usr/share/gnome-control-center/default-apps
+ doins out/Release/chromium-browser${browser_suffix}.xml
+
+ # Install AppStream metadata
+ insinto /usr/share/appdata
+ doins out/Release/chromium-browser${browser_suffix}.appdata.xml
+
+ # Install manpage; bug #684550
+ doman out/Release/chromium-browser${browser_suffix}.1
+ dosym chromium-browser${browser_suffix}.1 /usr/share/man/man1/chromium${browser_suffix}.1
+
+ readme.gentoo_create_doc
+}
+
+pkg_postrm() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+}
+
+pkg_postinst() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+ readme.gentoo_print_elog
+
+ if use !headless && [[ -z "${REPLACING_VERSIONS}" ]]; then
+ if use vaapi; then
+ elog "Hardware-accelerated video decoding configuration:"
+ elog
+ elog "Chromium supports multiple backends for hardware acceleration. To enable one,"
+ elog " Add to CHROMIUM_FLAGS in /etc/chromium/default:"
+ elog
+ elog "1. VA-API with OpenGL (recommended for most users):"
+ elog " --enable-features=AcceleratedVideoDecodeLinuxGL"
+ elog " VaapiVideoDecoder may need to be added as well, but try without first."
+ elog
+ if use wayland; then
+ elog "2. Enhanced Wayland/EGL performance:"
+ elog " --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL"
+ elog
+ fi
+ if use X; then
+ elog "$(usex wayland "3" "2"). VA-API with Vulkan:"
+ elog " --enable-features=VaapiVideoDecoder,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE"
+ elog
+ if use wayland; then
+ elog " NOTE: Vulkan acceleration requires X11 and will not work under Wayland sessions."
+ elog " Use OpenGL-based acceleration instead when running under Wayland."
+ elog
+ fi
+ fi
+ elog "Additional options:"
+ elog " To enable hardware-accelerated encoding (if supported)"
+ elog " add 'AcceleratedVideoEncoder' to your feature list"
+ elog " VaapiIgnoreDriverChecks bypasses driver compatibility checks"
+ elog " (may be needed for newer/unsupported hardware)"
+ elog
+ else
+ elog "This Chromium build was compiled without VA-API support, which provides"
+ elog "hardware-accelerated video decoding."
+ fi
+ if use screencast; then
+ elog "Screencast is disabled by default at runtime. Either enable it"
+ elog "by navigating to chrome://flags/#enable-webrtc-pipewire-capturer"
+ elog "inside Chromium or add --enable-features=WebRTCPipeWireCapturer"
+ elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+ fi
+ if use gtk4; then
+ elog "Chromium prefers GTK3 over GTK4 at runtime. To override this"
+ elog "behavior you need to pass --gtk-version=4, e.g. by adding it"
+ elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+ fi
+ fi
+
+ if systemd_is_booted && ! [[ -f "/etc/machine-id" ]]; then
+ ewarn "The lack of an '/etc/machine-id' file on this system booted with systemd"
+ ewarn "indicates that the Gentoo handbook was not followed to completion."
+ ewarn ""
+ ewarn "Chromium is known to behave unpredictably with this system configuration;"
+ ewarn "please complete the configuration of this system before logging any bugs."
+ fi
+
+ # Stable slot doesn't change profile directory, and it's vanishingly unlikely that users will downgrade from dev.
+ if [[ -n "${REPLACING_VERSIONS}" ]]; then
+ local replacing_non_slotted=false
+ # there could be more than one PVR
+ for version in ${REPLACING_VERSIONS}; do
+ if ver_test "${version}" -le "145.0.7632.116"; then
+ replacing_non_slotted=true
+ break
+ fi
+ done
+ if ${replacing_non_slotted}; then
+ ewarn "This version of Chromium has replaced a non-slotted ebuild."
+ if [[ ${SLOT} != "stable" ]]; then
+ ewarn "This channel has its own profile directory, so your existing profile will not be used."
+ ewarn "To use your existing profile, either copy or move it to the new location."
+ ewarn "See https://wiki.gentoo.org/wiki/Chromium#Profile_Directories for more information."
+ ewarn ""
+ fi
+ ewarn "Any existing Progressive Web Apps (PWAs) will need to be reinstalled,"
+ ewarn "or have the path in the desktop files updated to point to the new wrapper script."
+ fi
+ fi
+}
diff --git a/www-client/chromium/metadata.xml b/www-client/chromium/metadata.xml
index 63f72b4f7566..0bcb63e1c22d 100644
--- a/www-client/chromium/metadata.xml
+++ b/www-client/chromium/metadata.xml
@@ -27,5 +27,5 @@
<flag name="system-zstd">Use system <pkg>app-arch/zstd</pkg> instead of the bundled one.</flag>
<flag name="widevine">Unsupported closed-source DRM capability (required by Netflix VOD)</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/dillo/metadata.xml b/www-client/dillo/metadata.xml
index 86d528c4b706..48ff31ce54c9 100644
--- a/www-client/dillo/metadata.xml
+++ b/www-client/dillo/metadata.xml
@@ -7,5 +7,5 @@
<flag name="mbedtls">Build against the <pkg>net-libs/mbedtls</pkg> library for TLS support.</flag>
<flag name="xembed">Enable XEmbed protocol support</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/elinks/elinks-0.18.0.ebuild b/www-client/elinks/elinks-0.18.0.ebuild
index e0ace8215a37..de5c0e7a287a 100644
--- a/www-client/elinks/elinks-0.18.0.ebuild
+++ b/www-client/elinks/elinks-0.18.0.ebuild
@@ -5,7 +5,7 @@ EAPI=8
GUILE_REQ_USE="deprecated"
GUILE_COMPAT=( 2-2 3-0 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..13} )
LUA_COMPAT=( lua5-{1,3,4} luajit )
inherit flag-o-matic guile-single meson lua-single python-single-r1
diff --git a/www-client/elinks/elinks-0.19.0.ebuild b/www-client/elinks/elinks-0.19.0.ebuild
index 1d90f1687bb9..484268a2cc99 100644
--- a/www-client/elinks/elinks-0.19.0.ebuild
+++ b/www-client/elinks/elinks-0.19.0.ebuild
@@ -5,7 +5,7 @@ EAPI=8
GUILE_REQ_USE="deprecated"
GUILE_COMPAT=( 2-2 3-0 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
LUA_COMPAT=( lua5-{1,3,4} luajit )
inherit flag-o-matic guile-single meson lua-single python-single-r1
diff --git a/www-client/elinks/elinks-0.19.1.ebuild b/www-client/elinks/elinks-0.19.1.ebuild
index 1d90f1687bb9..484268a2cc99 100644
--- a/www-client/elinks/elinks-0.19.1.ebuild
+++ b/www-client/elinks/elinks-0.19.1.ebuild
@@ -5,7 +5,7 @@ EAPI=8
GUILE_REQ_USE="deprecated"
GUILE_COMPAT=( 2-2 3-0 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
LUA_COMPAT=( lua5-{1,3,4} luajit )
inherit flag-o-matic guile-single meson lua-single python-single-r1
diff --git a/www-client/elinks/elinks-9999.ebuild b/www-client/elinks/elinks-9999.ebuild
index 47c3731ba456..b1b9e756702b 100644
--- a/www-client/elinks/elinks-9999.ebuild
+++ b/www-client/elinks/elinks-9999.ebuild
@@ -5,7 +5,7 @@ EAPI=8
GUILE_REQ_USE="deprecated"
GUILE_COMPAT=( 2-2 3-0 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
LUA_COMPAT=( lua5-{1,3,4} luajit )
inherit flag-o-matic guile-single meson lua-single python-single-r1
diff --git a/www-client/elinks/metadata.xml b/www-client/elinks/metadata.xml
index ce898f014cc6..42ce4c0c69ba 100644
--- a/www-client/elinks/metadata.xml
+++ b/www-client/elinks/metadata.xml
@@ -23,5 +23,5 @@
<flag name="tre">Enable support for regex searches via <pkg>dev-libs/tre</pkg></flag>
<flag name="xml">Enable support for bookmarks via <pkg>dev-libs/expat</pkg></flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/epiphany/epiphany-48.5.ebuild b/www-client/epiphany/epiphany-48.5.ebuild
index e1e87cee22df..53f61d9b5bd2 100644
--- a/www-client/epiphany/epiphany-48.5.ebuild
+++ b/www-client/epiphany/epiphany-48.5.ebuild
@@ -11,7 +11,7 @@ HOMEPAGE="https://apps.gnome.org/Epiphany/"
LICENSE="GPL-3+"
SLOT="0"
KEYWORDS="amd64 ~arm arm64 ~loong ~ppc ~ppc64 ~riscv x86"
-IUSE="test"
+IUSE="test selinux"
RESTRICT="!test? ( test )"
DEPEND="
@@ -38,6 +38,7 @@ DEPEND="
"
RDEPEND="${DEPEND}
x11-themes/adwaita-icon-theme
+ selinux? ( sec-policy/selinux-mozilla )
"
# appstream-glib needed for appdata.xml gettext translation
BDEPEND="
diff --git a/www-client/epiphany/epiphany-49.3.ebuild b/www-client/epiphany/epiphany-49.3.ebuild
index 1827581883c5..ab027f7151e9 100644
--- a/www-client/epiphany/epiphany-49.3.ebuild
+++ b/www-client/epiphany/epiphany-49.3.ebuild
@@ -11,7 +11,7 @@ HOMEPAGE="https://apps.gnome.org/Epiphany/"
LICENSE="GPL-3+"
SLOT="0"
KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc64 ~riscv ~x86"
-IUSE="test"
+IUSE="test selinux"
RESTRICT="!test? ( test )"
DEPEND="
@@ -38,6 +38,7 @@ DEPEND="
"
RDEPEND="${DEPEND}
x11-themes/adwaita-icon-theme
+ selinux? ( sec-policy/selinux-mozilla )
"
# appstream-glib needed for appdata.xml gettext translation
BDEPEND="
diff --git a/www-client/epiphany/epiphany-49.8.1.ebuild b/www-client/epiphany/epiphany-49.8.1.ebuild
index 1827581883c5..ab027f7151e9 100644
--- a/www-client/epiphany/epiphany-49.8.1.ebuild
+++ b/www-client/epiphany/epiphany-49.8.1.ebuild
@@ -11,7 +11,7 @@ HOMEPAGE="https://apps.gnome.org/Epiphany/"
LICENSE="GPL-3+"
SLOT="0"
KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc64 ~riscv ~x86"
-IUSE="test"
+IUSE="test selinux"
RESTRICT="!test? ( test )"
DEPEND="
@@ -38,6 +38,7 @@ DEPEND="
"
RDEPEND="${DEPEND}
x11-themes/adwaita-icon-theme
+ selinux? ( sec-policy/selinux-mozilla )
"
# appstream-glib needed for appdata.xml gettext translation
BDEPEND="
diff --git a/www-client/epiphany/metadata.xml b/www-client/epiphany/metadata.xml
index 2662b6a6554e..c3562b8f6381 100644
--- a/www-client/epiphany/metadata.xml
+++ b/www-client/epiphany/metadata.xml
@@ -8,5 +8,5 @@
<upstream>
<remote-id type="cpe">cpe:/a:gnome:epiphany</remote-id>
</upstream>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/falkon/metadata.xml b/www-client/falkon/metadata.xml
index ff90b1da65f4..9e4999779232 100644
--- a/www-client/falkon/metadata.xml
+++ b/www-client/falkon/metadata.xml
@@ -10,5 +10,5 @@
<name>Gentoo KDE Project</name>
</maintainer>
- <origin>ports</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/fetch/metadata.xml b/www-client/fetch/metadata.xml
index 83d00b14c8d4..7a420b460d5e 100644
--- a/www-client/fetch/metadata.xml
+++ b/www-client/fetch/metadata.xml
@@ -2,5 +2,5 @@
<!DOCTYPE pkgmetadata SYSTEM "https://liguros.gitlab.io/dtd/metadata.dtd">
<pkgmetadata>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/firefox-bin/Manifest b/www-client/firefox-bin/Manifest
index d153e802303c..37d9400f499b 100644
--- a/www-client/firefox-bin/Manifest
+++ b/www-client/firefox-bin/Manifest
@@ -192,6 +192,103 @@ DIST firefox-140.10.2esr-vi.xpi 469140 BLAKE2B 27a83bf6b3be85a350588d489ca7171e1
DIST firefox-140.10.2esr-xh.xpi 272786 BLAKE2B e49ebe04e70d6f98f5cd159d0e53a4fc59a64ae11499768706453106d5f077ccfd8a2f2d620d60d4f0ea3c6e23dc8e483e059efcdebfb084bbeb67eef012ccb7 SHA512 18090a9d265d517d091e2f8be305c1da86f18fc185730b20bf50d20e3ccf2c13bef3d226031681815bd464290c195260b90bd09a997b87c847bef140ac8ddc93
DIST firefox-140.10.2esr-zh-CN.xpi 460701 BLAKE2B b7d86a273f8e474b5ecdfa002d7eed175aee0d53847996d5f684b090ac4a6efb6e48ca4606e112d0fba69c8666e38ac1dab892a54a8e77d01858ba06f7a0f325 SHA512 0c5e1d8f1ef2f36b34675e62190053e13f221fe6cc9d50577053f2e6e75c083318c2f0920e1a87939131d517da140e0436d471304d3b5a1cf10e3e2b2f0d216e
DIST firefox-140.10.2esr-zh-TW.xpi 463738 BLAKE2B 523649b74cc2f0ca7de709b76c4cddfd915303902490ffffaa3b43507d03d20de61b56f171d283d75b0ec9587f2c0ffe47f214c810e8d436d0069c9b5fef721b SHA512 bc9e612545dffb0b8d4a61cdd1c0c1b4ba2f413718c577ba21bd1123a032d4bb7cc32a8833e2acd108e5a100768c77edfb98a91f3c637c7363a7745df04db288
+DIST firefox-140.11.0esr-ach.xpi 294371 BLAKE2B 29cf9831983dd0a8df011f1a4ce787a53a9579d49625206c4fa69e5b1b9cc5b5bfb3b6a722148d6c1e3ac60cc8023425a3d8a420a23e7a828b11d6d3a379fb7d SHA512 4064306bf02f5da0c57edca1e207de6a225355ab4929d7ac1df8cf8b47c60b1ec8aad4350d65828eeef54549018d39e641aad7d37d0ad347b572ed4b4ea211c3
+DIST firefox-140.11.0esr-af.xpi 266634 BLAKE2B 7be8bd546e96e1255d18ce096d58f4ab9cd0303bdcd7e168289d258b8fa8682b366c9cc23405d62c15408f76a3f7ec65560b39554d75caacd0bce3d7121e46a7 SHA512 752d9d2d7a5e634bc5309096444f737705e651390a70bfcdd8d8a14e97f6ba16087546cf39c4588c6034c4f47b795f445542effe71124b5059c24adab94dd31a
+DIST firefox-140.11.0esr-an.xpi 332299 BLAKE2B 955c0d23c831273ae91ef4c45400660d0245909c8ece8d7dc38a1b08cfc88695e3707ea990f0f281815cbd4b6ed316c8519ecff3be0925e251abaf64610cb16f SHA512 127de6e64b8a85ff9998dbea57ce89d16b4b6dc34eef063645d0de4ce8762a6e5f0647812dde4f7bc6e7fd0c7a819af7d036be089d2a8f4488f2cf778577ffef
+DIST firefox-140.11.0esr-ar.xpi 445288 BLAKE2B 22189d5b1c4c5aa6e2e8d942ec0b80551d351a01ac65e8d423514b2c2285f290c3280f59a835f74b81924f8d81a8854dcaaad34dddbccddec0b8dba4d40f7b1c SHA512 45d4775723eb6f53ed678b879e94f8d59c92204b391fadc454298bb44264142e67dc438cb9839ef88d29c086583e2e4e96c25b886e6f095ec4326a92e1bb4ae6
+DIST firefox-140.11.0esr-ast.xpi 312216 BLAKE2B 0f505df9d95fdfd849a1db1b870f260b8393be323aed4394e19e53ae9639b22facbb8b7fbf36b938e276b82885c9d644105c0c2378528c9a22e004c2aa687130 SHA512 e228029ff32870a123dd8fab8bea416ca842cb8e8ae44be0b766354cc5d24967d4ef9d668aae752f5b89d7193117df27b65419880bbc8a919369712b57b00ea9
+DIST firefox-140.11.0esr-az.xpi 318412 BLAKE2B e7e4385647565e2453ecc797cd8c4fb9b9ea9851805175029484e7f7ccfcabac5e9dcf6d3dc76cdb3a20ccd6f21f83b5fba3a725d8cc7cefeb08c635c5e4bf1c SHA512 ecc9a8f1813a8677085b29ca3762d992ff88ed0f749c29f9d6de32b8d61e6a8f26cb9d150719a4d091ec11d73d2930aa72d54a36d13343b31413d5effb0f2363
+DIST firefox-140.11.0esr-be.xpi 521200 BLAKE2B 8d2e8d3af762e3ab4e58f011d43feb10aed25c63e9a960d3a1c43563677fda09dc1fe761cd7d731f27ad83745f82583dd9dd8befa1ccfe23e2865ecf3c5ab57c SHA512 e219c477104838f244ccf1d1c3eee8c22065b4ff1835f5918c10bca60c2fb5555217c2d626120deae6f6ee808fd2c393e3784e5af1fc83a0b9339629790fe706
+DIST firefox-140.11.0esr-bg.xpi 457555 BLAKE2B 31f80376a72d36bbbfeb8b42e318812129a2f79a3244be5ff53e06b909930f13ee28dbef8416ba73ec6af1e80c0e3ce44c3a601043490640b110fe727b11cb1b SHA512 ca61f6b632db989e7bd8725c5fb834fbf19d8f4d5ab7b6238e005fa4273096855173905111a5a449dabd4b9382ac18c59c25a89692dd288e617b67d5f88cf648
+DIST firefox-140.11.0esr-bn.xpi 413377 BLAKE2B 3a607b01c32ab80478b2595ff0f331f5669879c26d4590e83123d79a756bd35ec1abf2b89ebc49f4f3c14ffaa26cb07a4ddd14faa9dca4db096219b409d1032c SHA512 c6a6edeced542a7d18452e2353cd8da1df62f058937299fcd9bef5a30cae1fdc311cee2b66c8a6cfa2f8a1aa5b78cba36dd41eb16024aa70c2a16cd153a34f7a
+DIST firefox-140.11.0esr-br.xpi 395302 BLAKE2B b59bf7fcf4ebacdf798ac7abee91feb55e8932acbe6f092c8675c183aa2d68cf9ccae5d9f596b7c9ca62ee1cff49235a36bda74e35d3c8467e21dde695ef2c39 SHA512 0e63b6eaf2ab583905cf7f27c055e0c93f38e8ddfb5513be33ca4cfdd9bb30ed1a94cdadef5d0894f30242227abb57121c9b5159d29459f8a142c8fd17976511
+DIST firefox-140.11.0esr-bs.xpi 447174 BLAKE2B 475886a98ef884a29fc1186eb87e743ec3e493135220099cf2cec895d34c30ebdecf8e5944ae851eaf2526f595ead18cd6f62910409406f19b23f62adea59258 SHA512 368ab5b4ff8a70b3547dca71394a5c2cf7c70b7209d035dcfbb9ec84407c395025a7a89313cbb703af28aa5719eb6c3fadc1f861234c2e9ffd11bd06e2eaa0c4
+DIST firefox-140.11.0esr-ca-valencia.xpi 357934 BLAKE2B f4035ab23fcfeb631e2b72cbf5e9f66e866a77db6a8f1f7799ca4893ecf34b5defb808fb2c0579ffe3ddaf019937cd90ed49485924a72e15c77795398346c085 SHA512 f385612bf6feba63cca40d934f470b639b2fdb07dea5a430367d4bd4c30af748eefe6c0f479c58da7fdd1c802f7084a606eb5e6976f16ae429129565e853f207
+DIST firefox-140.11.0esr-ca.xpi 404833 BLAKE2B 104a1da0ab04c0f88fac44cc654091643756102c233f988e655bf07cc82d4a3fb0410e7e240b1d53225bb8f58f0bd8ccff7885b2608e85cba2edca81fe051723 SHA512 1feeae2ae0e25505e3d1dcadf4c96f648cc5e5e3882dba8e255bd66e657bbd07c7fa1d0dc8ee8bb04774650ed13960e0096a25ab9207f4f347af624b16e6ff51
+DIST firefox-140.11.0esr-cak.xpi 390847 BLAKE2B 4b07c25370fae466ca1033c40012857cf7baaba2882687ad00f1951d923f68808b3a6ba24ddfe14e5e7772c0cbed6adfcc1968eaf11749963405a85a7135d47f SHA512 521866521a691015e3526f30c6a2e6ab1cc4c723d810522229e972b8af369da94d75228ee04e4b72af370ced8ef533d2f82b293f06d0b8605e5d119e4984b035
+DIST firefox-140.11.0esr-cs.xpi 475926 BLAKE2B ede401d984bb83185e99ba58008f17d4b5594be134ec209af77a96f187e450bf314ee6497d05425f16bec6000868f7550dc7dd2ebe5acf71d8943864847c1264 SHA512 391c282d773631774f8e147604f6573705926d4feda98d21240532e7b41d6c2f7babe5b7e1bf961080f838cae1efaeb1930a3a66722acccc5b44b0cacd399da5
+DIST firefox-140.11.0esr-cy.xpi 441956 BLAKE2B 95fb71d4293f947288ef797832f08ef1c318f0fd1760a1d8b3ef452639834680a303d6f538935f3abee341d777b4f0d21457fcabcba10b3f45f2212e4edaf729 SHA512 d88ba7806a6f1dafae326a9f249f0138b26e8d88ad3121924cb45e6da6d6e218e17579e25d56fb1cd1e72b72c301a63b7c2a989d5b57ef3a99ca3f88a70f085a
+DIST firefox-140.11.0esr-da.xpi 431126 BLAKE2B 8607f77feb838f829c8afd2ac5ce3975556ef13c764132f29362e33d1ed6e192a580321462902d98e2504702ef3b04c997044e753abc2ff69cf7e73c3b7cbd71 SHA512 0cf4fd0539f45d5ed5972ba79d9e4b7a34317eb172dc962b5e727cbfc7ea4a6d3ce6f68d527a5321449abb5de6083ee1a6edd9ce4e04bdd78e4bcd211f526cca
+DIST firefox-140.11.0esr-de.xpi 452699 BLAKE2B 86b2ab0a7c440c33e8c0da4f00182ef546eb1f7f3a7b0d1989b94d60b761a983103271a1d6ece50c4c4b73ca358334d94f56da1ad61be40c233a071675c8a936 SHA512 8d283ddc974356930fb5ef44599de5ea51af5b47b2dfbce8d9f119bf38d1771c7235800ede7e6407114eb557d42fb560fe05dca45b1ad86e494bfae787d19208
+DIST firefox-140.11.0esr-dsb.xpi 466065 BLAKE2B 786032e6575b115c3f299459b5cb2957713cdb1e966693046a9dc1ad57ebe9184137b56d0f3bece5c3473e040efab5db5ee0b4a412b04046fa8966eebfed94c1 SHA512 0245698b35f387bb1c5389a0614f63c11335e88df6af495a0f7a820b42ef8eabfc49c6ec0d21b155cfb395bf788f3c637e913740aa3c506a3b53534f570f1539
+DIST firefox-140.11.0esr-el.xpi 536817 BLAKE2B 7ffc22a84591130762ea6e6607594ec29179091a3705e910807f2439aff04446c1832d48e929dabae24b3c62aa1efa884c1a77182edec6c3228decdcb591e477 SHA512 65e3dac8a7b74393736cf9e9dbbccd83c0b316a2954e65883ecf2fb7ae2f2fcb70784279506551c4ace4ad56858db49ab1e11fbc3bc7702d8b1b0eb14c3e4881
+DIST firefox-140.11.0esr-en-CA.xpi 411054 BLAKE2B 9543148d9ec86fbd301f58f7d1a6d1da706460c35d97f85b247d78a7894f627d8d03088142c5e8cdf3c4efd5a34948e41e549612327f76275d59d99d4aaf1655 SHA512 57e7b1904137df3217dbe1e14c5b0c95c72f5e2c9bbc694775825e2299cb0d9b1844ec4e885d4781fc98dcbfa8f1accb0f3e78aec9575a860f61a985f749376c
+DIST firefox-140.11.0esr-en-GB.xpi 411412 BLAKE2B 0b8cb73f84af0185bdaead1f70b247be6e477e9d895ac3ce2935e0610628c667ebd2a50d187a0fe60aec7364a63e43382c947822bec6b7e185fd195875172aaf SHA512 0035befe38cddc83f9f993e7ba5e3f0b4d8d3d3471acce7a12a0f83001f2effaa5979324e01db738811d2e1b1aa46863f946eb9ba33294bbcee1e4a257d9aa61
+DIST firefox-140.11.0esr-eo.xpi 433477 BLAKE2B 8ad62c7c3a5c0892c1dab7d30450a83c84d0f097cb154bf21957e028856fc0b900aa3afa8c9b16f06ebe39340f70e74b404310f31c06c3836c20ac34abd3dc58 SHA512 9cbcdce267ead7359d46584a3c5cf39621a9c1ed8d5a5c7090e6e77708689f980e041eba9de961b23e24f1e4dfaf5e9106c9f8967fad9c49b78a6a5083dea4bf
+DIST firefox-140.11.0esr-es-AR.xpi 445515 BLAKE2B b6d5925612a1f0041587ef902151dac5b45218b202b8ce42911d76a38bacdeda21e40f7e0f8db454a5320020fa27b3c0ffdb97b7340d580b7c6c65366ac270c1 SHA512 663122c70d281d99afa665246d0fdfe0f50bfec569e26f94f1979c38d5886086d16cc299ea4cb2dbc5728946a8b14a3bf48263b6c867ff210b5f6ea931c87101
+DIST firefox-140.11.0esr-es-CL.xpi 446304 BLAKE2B d66e52c04e0ac9e2f04533dc8d031b3fbdd4fc3fbe7cfa0019d537fab1239b946be23f7386654ea1ab5a7bd89ad13727748c88efde138eb1c10134e0add2c57e SHA512 d3424b21d4b630ac5ce24e96ad40fcc2b32e3f17782546b436b145c8de772962b016fb20b7a8aafdf5a1dccfd675daec221feab2d380f571869a9dc514bc73a2
+DIST firefox-140.11.0esr-es-ES.xpi 447015 BLAKE2B e023b0d80d2d8b82c21a754cd2bb1e5b3b3bf8002395ab57aada57cab929ad0d635288753ba7dbe412a3ef11a4610deb7c6ce0a23ec4c722eff897f30d1cb8cc SHA512 c39afcfed79822f0a1305c233c3b1daf7f7b13c62740faa3b749eebb1a75070f4c6689b139f5063eb1c4a09f018a44934423c9fb2ea887e1e0a0656fc5111b4a
+DIST firefox-140.11.0esr-es-MX.xpi 446240 BLAKE2B 2a67018bd95dbd9056051a0cc5bbff6c14f3dc2bfb7d16c5c60c74b38ed76349adb0409b5855baaf5be688eaa36f8d40697b5d69cc19da31a991c3cf36cddb72 SHA512 60044bbd788f12d08c85859e46dd5ba4eedb17c5301e34d3d33535703ca478bbee0012dde2e41c0eb1cf2eb5aed62b351bda11105635224012d395346d934e6e
+DIST firefox-140.11.0esr-et.xpi 359327 BLAKE2B 487bcd65e93183a760095c376b14d397b736c7a83fc48ae1590177b839dfb341ff12c0bdab3d26e8b149ac9d6c0920dba261784f2edf3e55700cffb20a1dbcbc SHA512 4861ee0358af9d42d5c8e488d86eab8d4e6bec0909792d84ed8fef2107f66b25c0d5bb75416927953f871f68659314edb5ae47e342d9ecb2ef9c049946d91e47
+DIST firefox-140.11.0esr-eu.xpi 417292 BLAKE2B 675959ecb9376b3578293e0372ae518d953f9cea31b1e7727a6fe02f8e160245e2424210254589ab705bb31858862c64e6f06940040f84d78f0d484b87a75897 SHA512 c0426796b7c2d673043b0d29402ca28e808fba956a61e443b8b72a3d72e005b340dfc00a6f6acfe0163cc24b7ccaac9244f48c81ed2e14d9e1f9ddac22f29d70
+DIST firefox-140.11.0esr-fa.xpi 421633 BLAKE2B 2c0f92b174e7418224554906a9865c39f94467d49a1940baea1b3d3cc8deae9144bf0689f88813e0a7f6ed295d5d91c20fc84bc7a20732f940e94db8e74dd0b5 SHA512 d4b30f50f85233c86556e4446908a4a24d810a0458484dcba8da4378e05aec24fac7b97785e638e6137c5a1c96fdf0be7baf2ec1d2bd0150e2557f97cfe9658b
+DIST firefox-140.11.0esr-ff.xpi 310183 BLAKE2B b99fcc7ea695061ca2e337d7860d920054c1023e6d944bd8ed361002e1c0877786b94bd5038a0d72eae24f669af16947268847f3a33e5917fea54bb280c3ec6d SHA512 d7de0e3bdafd5090356d4d73ff0d0826b769760cda1a7d3721a046eaa7794ee899b98f6286f265b7b43b1b4fa49cbe828664a69d40b6cc9c9a8b38c528193069
+DIST firefox-140.11.0esr-fi.xpi 430163 BLAKE2B baf495856ea9817b1a6c8323bc2ce4fc5877481109f37a092fbf68ad3fca050cfcd8364ace46f90310dba0bd41d27b2a7d20751e78ce9fb4a131d574a16077e5 SHA512 285b7e47d34d8b457f953e6aae36bdbbcfdd0d41cd1420ca97fb5555a471343387e4c42b67c3779a9060675fad03e734b1755392c549a502e30ffc444b405635
+DIST firefox-140.11.0esr-fr.xpi 458457 BLAKE2B dc74642bb01478e07ee3996f56d01379bce078642bbbdae19636940177a8a980b07f3c3b52584f99089970b622cd110013c780a8f84f6e903724f82205dbadcd SHA512 4d72ad72401c679a66a3b628762d51fd88d4bb59d5c08b645bd2764129596a94b70eebe2c83e03e0f2de6f87b6fb02460798026efb4052d59ca98263f2a685e2
+DIST firefox-140.11.0esr-fy-NL.xpi 442166 BLAKE2B 98ff53c9e16fbe381c184b2b4037cf714170c85b9abda0749bec29f14e1f0e18621702798aa95d3f1643610cee0dfd688aa53122f69a347aea4562201953d8c9 SHA512 1f34f676f1d1b682d4402c04c29d319d3bf8a60a60632a94efdfe760e6af6901706fba783f7d2d0cefea484d4177fe3518e2ca10af7c4335e8f643891e82cd4b
+DIST firefox-140.11.0esr-ga-IE.xpi 315284 BLAKE2B 9be83e360dd1f73543eda0eef9664a7dcbaa8940452a2b8ede19c50a3439c3ba73737808c2baf47e47c34c7d89f2eca2729351189de109a3b6d57382471bf49d SHA512 72431fa9dc55b850dd6070ba2d4dd158fd38068e8400ffe9f4ed49e4ba8cbc42492802e49aee1e89f79e06cc1e87b58459a1e45f728741154411f67fa109a10a
+DIST firefox-140.11.0esr-gd.xpi 399430 BLAKE2B 75edb7ffcbb8d44fc4617bbe8697c040cc717709824632be586d7d905514e438f229db177c9a8e438d4268ce152bb9d67e4de08dd5ce184beb265a65f042e314 SHA512 ad3b36eb22d6a07502f3fdafc98133bd3ec98e29da1a5b50bde20f9380f96fbc14da3c9f2a5bbaa842912a42de86d088e94118c4c4ae63c5ea24c2db1d34e555
+DIST firefox-140.11.0esr-gl.xpi 442916 BLAKE2B de516c754c723892d4bc892e36cec758fe12bb6952ced5fd23cda744ad90a0ff54f48521f4305e00d92c6f739aa91a33941145638c940c8dbe32537a1cd5c753 SHA512 75276df8f81cad4a30cb899815344a6d874f288a2e58b352633f9cedc1485b1cf2e8c11fe011950873959777c5e044f2df5470e7e04a95887a7c1bd29cddd5f7
+DIST firefox-140.11.0esr-gn.xpi 451091 BLAKE2B 0ffd400799e3af5d69b0f832cfb13bd7e7979855fd1786b8ba473a2ec3cce7cc936a7559524aa12dbc6f8e7317fdf22bc870372298a1c9c4e5cedcebd38a01c4 SHA512 3b7eb0a661af1def1a5bc517dae62d1716f66495f9239aa42402f54d2e210634e063d0c23e4f51c3f5bafd6e1f7f750baa4c802e50869d1c1b6c6e42fb013e4c
+DIST firefox-140.11.0esr-gu-IN.xpi 358974 BLAKE2B e4af8542660bc809a7c1e30ae333f350b7031cd2d5e2d69bf878dff0fdbc25041cf8b64510e56e19b1718d64593abc7473eef2d68285c5eba437a8a863cb2f07 SHA512 4336af040a43cef3a9546ba77e716f678fab7840000665cab0b7cc785693137819541fb933b4b1dfae72fe66d65726690d290ad162685fae67db12007b80ee36
+DIST firefox-140.11.0esr-he.xpi 444991 BLAKE2B 3745e5fe2e2856c5aa448eac7fe14a9e345bf6f16245db94aac0adbbf5ab03d4ab6f87421a5e51d2d122790d61ccf28d6940f062508a037a11197fecc5905961 SHA512 ec616c7776b1b185696119ffa0184f3f692cb802bb265015522ead01bb664e26bdcf0a34757fdaf7196cb48660ac8586c08c888966dc2ee4d4cd67af75c5ca57
+DIST firefox-140.11.0esr-hi-IN.xpi 377455 BLAKE2B 9baec6cc104ba7d8f6902e975e151a73a653ec61a73ce264b69e25b4ac8a0146c962463f1296f25789f508b70cc190a96955911f9e1632c1096dffea01a97ec9 SHA512 ea14495fff531b74d032edde89e2df59905b9b4022d1a6dcbf1923bb0f1c59f78dc8f4d051048da7ab58494167a452893d2fdb8d8438f5e0967c054d95b28ecb
+DIST firefox-140.11.0esr-hr.xpi 437689 BLAKE2B a5986d51b43145b9e9421ec5b7f9e20703e72b7f14bd29e71061f64fd7fc4013304473a8d0bcd96d9635607a74766dcf025daeac91d8566208a5ab64c9aaf2a5 SHA512 bd9748a19357dd5509ace144cec948c05f7071467c120c8efce327222980bf4cef445e57482f5c8881b4bbcf2efedcd47e0cd25a9b5ca01c61daf4affbddcbf6
+DIST firefox-140.11.0esr-hsb.xpi 462696 BLAKE2B ba0a66715ac289f04dc8c007be8c937c66058249bec9e5933389ffbba92a558dceff6978688876e147e2fb95a5e2c2f83a262237f441f427e178d2a5676cbbab SHA512 bfbb55790a6977005b830d1ae6986fe85548c094d310f6613fb4cba2de674f3d6481fe4020b6fa9199ded91a3f476afb41f6b0ae01fccad2f2fdbba2255839a4
+DIST firefox-140.11.0esr-hu.xpi 466165 BLAKE2B 43b2a0389da75a09791a7fa82b055b4879f481edb155fc49430e034554f86488fb5494c10b220982f3aff323b70d984631e9528fbe647038e8e52c7ee92c3a9f SHA512 099176f73e327a4ddca9e4f10934f30b2be05c6aad45a75e9c8db296e5e631920423339cb5e073f072b75f6b292679a3fe9eb75df371049c6b2a3ca6b2f0cd52
+DIST firefox-140.11.0esr-hy-AM.xpi 461618 BLAKE2B b7e0d15ea44614a142f4c3d022531717cd550c652e3175b0b3a714f11fd3122866df131036f2a8989cb4abcec40350091fb09c85d981257c7c4bb2d5225792fa SHA512 cb23f39da7b20086fed2d47e508d445c7af2080973a5dbdb9ea0e50b96b0cb96cca8f1ce731829e4e645ab8681cb66ebdd4ada705d3199f26ecbd71a6ae4400c
+DIST firefox-140.11.0esr-ia.xpi 430106 BLAKE2B 40aae475489c64aa0c7d842de51fcb37bf91caa976ec562304ab8f1252258824e405e6c535071a8938f2f599f96adb261263b62f4ba3ba0442cbb87e09c8e3bb SHA512 60021a2e88eb868076609013dc568a4c2da1a0b70efe389a86c6480bac1c3f3a0a126f346774b685060bb0c8584c991643fe543cf110e743186ec5da8e64919a
+DIST firefox-140.11.0esr-id.xpi 422739 BLAKE2B b87c3a3e29fafd24438494fb4a9c00e7f0019c390fbec07c60b0fcf4452d09be812fe360d0934c512b4dbe60b6e85d897218f9cb5ebf50d77e2dc2029016868b SHA512 76accaa329cf829e63869afdd011cca7c182607457f769e2a8dbaedd801f0c4cb0fcb4eb736391dfcaef61b4711b8fb6a1d2d1dc3e535d8e400bff3796f737e6
+DIST firefox-140.11.0esr-is.xpi 432674 BLAKE2B c2c6624197aacd553ba2e26305b25305500c9c15d8d522a011d23de48c29fdc22df96b95f06f4e14af0a401c906cac448cabb3e3c6ee3d7fbf7aa43982eaa8fe SHA512 c2c0a845c4800a4427982204e73f0b62d8b6fa7c839976b76ecc36be56211772fd8181b790f36350722b48f89d52c453cf9f35adc7fd39d34edff23f80a8cfc2
+DIST firefox-140.11.0esr-it.xpi 440903 BLAKE2B bd42519c47ee47662bde0ba4382e2ae35057c2afd6a0777e921de5d9bcc3d0f60bb650086165dc2568d8394f579f7d25465938657641f5d24172e4dbdfd60038 SHA512 9e1ba3a8fb3bbc5c024e1293f5ceebf1d1d48ad23af73460bfba569a8a0dc2d23788f47831992d064b55c86a8950c08b3276eb220d2333674d1d9724b4e54fe8
+DIST firefox-140.11.0esr-ja.xpi 481317 BLAKE2B cae34121519ab7a624eae841475351733db7f24237385fb240c120abfc544a4a2065de10599612470eeccc41a2339eb6f98df6553b5010dc3567f94e67f93b5d SHA512 2fac5f8f1cff6b78b5a8bf4afdf2795352d1a215a7c139e8e3eaadd0517218129d451c1584bc1fe30edd5a8d1ac162fec420fe79333fa380bbd12ac49a0e87d1
+DIST firefox-140.11.0esr-ka.xpi 494873 BLAKE2B 7ba1e335e444629480ea3584c56ef95436827fd127ce7be4a5665e874898121b108c2f6b3171aee43c19d4066f907cf8ecebcc446ed0940c862ff832e68a367a SHA512 9a1dc8eb181dc2b4fe42388fff7f41bd9da740f650309d21de9cc4713b10a6eef5b4bd65cb947af89800f3a43dbc9aade2c73e6799e515f7fe1ce39d1d3b89e0
+DIST firefox-140.11.0esr-kab.xpi 422861 BLAKE2B a28442a40c69446c2d4f432be5e7435a0997f36654028a8c44fa45b4d77e2f9983a9a66d5aa42b98e566b4f889b8f189cc15a82b2d8c9583685e771417091651 SHA512 0b1ffe0071b7fb9e33ea511a5194e5480977069e424a721fdc7a52a46b16af32aa88aed523471291a0c9e0572539eb0b4ae396181017912d7d59bac681cbb2c7
+DIST firefox-140.11.0esr-kk.xpi 506683 BLAKE2B 026efd0c44baf0255a873eb79bd56f4b18e25b7685e445a1042838bdabf00433d2c57729b405c3573f0ae9b4bdb440e06255aa66b5208f4a4abcb1c96e6af6ed SHA512 b760df0532ee3f7601025a31566b3324dceec1dcd696fac5965a8daa0c758943507357fd79c8ff909987adfdb4cb5af268f8234e9f9a2c2c35bf4b73f455e9f2
+DIST firefox-140.11.0esr-km.xpi 348779 BLAKE2B e17cde6d40eb6088120f552d30dadb2b2b66e7ef90460b8616e6772c6f5369b14f7ec74d8bd2f3c2b6d3d3b0811f548d38ad0fc2a641ff8d5c0a29347bf00a9a SHA512 7c29d2e9d8c9d2df15619117f23755f3ffcacdf048fc32f9196c724bb00a46c68a6c7e2c3cf8d66b3bca6f4061c8647ff8387e0a737881aa99599a915ac00d33
+DIST firefox-140.11.0esr-kn.xpi 331777 BLAKE2B bce4de0593c5470c444773af257f4badc5a778251538f7755387a8020d57943fbf0c70b36a360d75d92ff4934c63378b46e66ed90ec848927e97d587e4b6cea8 SHA512 d548867bd6fa31ed7ed77b6c8e6fa8d9daa9d72e3174e376d1179ea179369471094159fd8f4ec3cc6262d89a61f329c67ec8633efe665262dd030511ac3b0ce2
+DIST firefox-140.11.0esr-ko.xpi 467544 BLAKE2B 6bc8462d97e98e4a62f0f81ca93b382bf03f83ebbbe4f7870e6f829315f1351be9fc26c963f306b1f1a286fe6193d99e8d4f0c8aa09b20a7302350607cdfb80a SHA512 07ea4b806c48b4b5068c0a616a13689a0a3cc3fa2fc105726383ed08570e017e6eb988ed725d8696167b26e6476a7eae1d0ba1dc54b674bdff5cbc0b530e4ccb
+DIST firefox-140.11.0esr-lij.xpi 319285 BLAKE2B de726e7edf42eee728257da5385e46ee8eaae473cd54abab9f9708c3f12dd84f7535626369a2e340c73747ef17225f116bc33ad5f0f5439c3cf84492018eca16 SHA512 31f5da496d3e7cbc0443e629d65e5a77a9408637ad198fa90999f9cf24556fdb6e0aa6c831fe23a46793c048264ed8abf50eeea508e411dfdfab8269acaeb723
+DIST firefox-140.11.0esr-lt.xpi 379964 BLAKE2B f5de8086b5ba25768658ed02e863e05c4268bf75fae2a30b5b70a7b7f6c269a876750616206e381c353e15ca7573792b5220f99a9718239d0fc9d3950c424b04 SHA512 044140845c8211cbf29f1f3f45e033ea5f3e1043cdff177de2a6d17ed79d6eedfe55b047ae4716530d76aa11b5c95db137383b6b74db77d63f0ffbc99e21cc39
+DIST firefox-140.11.0esr-lv.xpi 389077 BLAKE2B 6c1b23eab0791817ff016e05ca37baaab2f08809d5b97e88fbd58eb592de6befc4029ecf6d1fe73d4f4ffa9adceef07cd474dae3dceccf4c7bd4724795e956d8 SHA512 bf910f5bffa80cadcbc35f7ad69a2c3ef9fba6bc7e6284c72c75540811556b959821c2ebfb7e3b5f13eec797dfb40e2f709ae0664686ff7ff2505f6f5939474f
+DIST firefox-140.11.0esr-mk.xpi 316834 BLAKE2B 2d449b01be65ce23e6ff5a5f99f4bf77201c1e46e962fc02440086b92f9436b94c108a48850144e60259aaeef206d967fdaee5e24558cc4fd863d0f4099257ee SHA512 e8dab96c2126cadfc6622c3f2f016b55b5d561c1cd3cf81d949a5cd3893aebd43239512f0b6e591aecc4f4a81939582501eac922af93669d18233e42eb0b110a
+DIST firefox-140.11.0esr-mr.xpi 356252 BLAKE2B ab143e0c5b2de1bc5cf5a387d02cdb45e77da59ea5a2badb7512b01526cd155d77cd65befdc93f4dc789db30a6363bf2b2acde57406431968ecedda415a92aeb SHA512 ac855b5d296e0b2098c8882800c5102b20d045c62327efcc5ced4edff4cde19187ad203f7f53e426733ab8a7a9fe0e9aa975000e1c2cc290f95cfccd59a05dd9
+DIST firefox-140.11.0esr-ms.xpi 295388 BLAKE2B 8cd101629cd4f56bb270daff1e22832ab6cede7f311c187108b316da627f39540edaeeed47a68b98a3043303f4d4d000acbf4bc0f015a36282794fce0082489f SHA512 1eec846a78be0f03b3acaf949ed7d6ff9e883db9959d68e1864f360f11dc2ef3e39aec614b81deb130d7208c2c4cc1c0d7cff9d2d5548814860a1f91c27032fa
+DIST firefox-140.11.0esr-my.xpi 343021 BLAKE2B 226606563c3c1081950db9b8d9d7a6bdc8917eef54e7b5bb0e674f8d0ba8a21b6fa8e6bad682233f232bcba997337147eea8b6ed9cb36ae3f6e2ca6541dde47b SHA512 3d47f5c6b04a162b3f3778c27b84b4d6e7709dddb481bc07a34fef344efb362e00e752f2262295b6f0f55f6a281f220c7caa85aa5ff24a5009bdae81beb0462f
+DIST firefox-140.11.0esr-nb-NO.xpi 429338 BLAKE2B ee627240b132d9d114aac1bfb870cc5ef47f785842abbdae8e5039a446876ac53e029d65b8c25c88429394f9a7c3c16e9bfffbce5cfbc8ab4d9f26bc6470a49f SHA512 342a987493a4867a1ba479e6fcb81fc5e8be5b632d7f50c5e82f2cbe7934c54f1ef545bfd595660dcb229dddac98996a4fc7b1b6fc22d05888901fd9076324e1
+DIST firefox-140.11.0esr-ne-NP.xpi 349012 BLAKE2B 15fe886f33c1a629c9f552688ad678eb059942f35201b88fd449f5783d586198256380cecfaa8dce6235fe532ad0a31fe4aa630e9c916ac52df1ec3b93bc212a SHA512 9f361774225a3a8688fff65526cbc8e138fea92098f5c467ea7aa43a6d871f3b116deaa6d06a58f3a4fc6abe483f38ac4cecf9120a3e908671462b499656b64c
+DIST firefox-140.11.0esr-nl.xpi 436181 BLAKE2B b7ecd90e109c1597a9bb3ebe29a86bb7797d554828ce68ec916b8bca0d5fb3c3f51c4aaab6308de66a28ed8b9ef724b49c05cbc20eb3ad5892eef783639bffb5 SHA512 ef691e9288c9777e65ee30fb6f92a42f0802429c14b95c0b99172898360a73be4c6b0fa6e026319c84af5e818bab546c2f1261b7e69a819544db40b48db3778d
+DIST firefox-140.11.0esr-nn-NO.xpi 432220 BLAKE2B 354b961252eb667aa08f02cb4eb7f0cd5a4ec74d92b23bce39257cc85037403683d8b4749c5d8a10978bdea00c36274d8b3203f36457c8a4bc1bb36bd8104431 SHA512 982a0eb742104d91ff4d85e34a1d72e79dcb909c5218b8cac2d25b912b1fbe22a39f8587ca110e3b315d3f2f6da9948e9118f0cfd258a4acfb3fe328917c45a3
+DIST firefox-140.11.0esr-oc.xpi 410937 BLAKE2B 91643dd9d840b7303c905ea08af7cbd46b2b4af1b778fd7b5d3da4a6b233c911dcbbb762105ab754db89ca772f1e29a08cc07f76aa65f3685bcde7fa799110b1 SHA512 10ee716d6af2742efc2f4261d75e13358dc50c61cdd2ea7619f70a42d68643a12968926c2ce6d15fe5e196da5f521d0446cda06cdb47e8da8a13f9c404cd2ff7
+DIST firefox-140.11.0esr-pa-IN.xpi 494402 BLAKE2B 2b344f45ca632cecf94402675e06ac71bc6336fbac5349c84c59499d7560d2dee3f1f3f0064b877db1fa54be0391ef2a71d875bee7b056f1bdf5e4ac1a3564a8 SHA512 e04ead3bd20173a15651a4e87207637d22b716857d38b73ec656bc77c37abb2eeffeb4663ef0c738bcdedc80b8511b5644a21ea2beb12d6462b4e6cf15502884
+DIST firefox-140.11.0esr-pl.xpi 460926 BLAKE2B ad04e980228b7d7005938266fcad2cf35a757cd59fa35f7309dfdf2dfa29c97373a472ae8dda93bda0da33456f37da3f322edc5b0bd5450e5e11e690a31ddf41 SHA512 fa4a05b27656a1b609f62b47de9667772029a222cd0491c912fc495d0bc80a1c9819fa96bcae06f63f38a3cbe3b5d31451f0100f015f1b675957a478e4636b42
+DIST firefox-140.11.0esr-pt-BR.xpi 440763 BLAKE2B 254f58900046f316ca39a141bf46f29397bdefcac26a098691f84cb0878ef182155cc6d913f38c170a7fb7ade305fd63d939751ade6a611ec39f4451049fcf4a SHA512 25e90824a3737bbe0e0171bc274a8e84fee4f000bb323619a6ac402dcf587efe460a543205c3d988c477e42b805eded80c0eaa68d644fc436a79b61437be1289
+DIST firefox-140.11.0esr-pt-PT.xpi 446417 BLAKE2B 91534363b487fde9326f17f7370fc76c9422e450b28cba2419d68bc13cbd86b321092488390532c81db1ff659d3461924f63d36ff2c09d10b9116908242251d4 SHA512 2b3fa9572b85ab212161cc3d5e1e7e578600029ef3505f8446463e3c402b3727499976b283e35581961173af255720291119ee47831a30542c32a057bca52bb8
+DIST firefox-140.11.0esr-rm.xpi 438025 BLAKE2B 8eb38575780975ad2fa35b8f7471330b1626c6b4c8ac1021bb7e42700846b908f6ca09d70702ad8b91c39d8dffd4984a4b46c1490b9d6ceb2a83c8967c199695 SHA512 710b4e24ac2e7286f4bc376e05031e395abb5a485ef0700e363ea83018648d2658ac0cc6a4fb0c136179d043260f1ece432ae9b6294d35ab937a5127a69d860b
+DIST firefox-140.11.0esr-ro.xpi 452843 BLAKE2B d36fe19e78c884443a1d6be0da019541a47e96b3bf25c3a8d33f3ad7adff91ee1790f199823307f83a4274de5ffee59a2d938b9a8d410e349e9b798e81c178c2 SHA512 11a55e13fd831d4c7c90c52a28b6648c1fbf2a31f114f02ecb5f2c163b75a09e0fa23bb023f136dc19161e49a7e5b5c59e058169477fed07082a7fd36579a7b2
+DIST firefox-140.11.0esr-ru.xpi 525180 BLAKE2B 4b9f9fe21302e6a8bc9566faacd58b893d2ed7fcaaa8797f8e1cc8d2c838298b32cb93a3782776103d6772e0cc4329c516a08b058937ea63d6f0db8c11f4c7ce SHA512 26becb9a236fe5892bd68473bc67f3f21299c628953abeadd94aaa588c0a6753f0615dfdde16b6401feef3399b1b66d5701b11886be224fd1f92db33a885bd9a
+DIST firefox-140.11.0esr-sco.xpi 322643 BLAKE2B ae536d3af5ff27b24096ded46891c7daff1d6eceb9bd5a8e73c189bed81725355eb5aaf0a28e61f0721fad755948e6e50ae835a4a8bff28aea94599ff4aac00f SHA512 b58354c217d7f6e04e3dbc8275a0723f17cce5f1eed010932dee71cbec89fed7664d15549f3e3bd3f135b2d0c86aa36ab13db936b73dc1b6093abfdee863f7dd
+DIST firefox-140.11.0esr-si.xpi 411601 BLAKE2B 3d1135cb37bbe43e102c150cc0805363fbe3af42c544a118eefd26809bc3bbc46f1777a8fd3e364cb163d0d9b66ac46a66d82f81dd290670daf321f4fa46c704 SHA512 4d0e82b8fda455c7350939503cb5d8aeb47e6b5a65e636a2e8701ee9ff2a6def97f3a7c123610a05e5b4bb22606339a79bbcbf15cd2b3d4398d193ba17e89ec5
+DIST firefox-140.11.0esr-sk.xpi 468229 BLAKE2B 2bc3b5669e55cfb8ec50931c987a88a0cad6653153081772b042d205c62d44ecdff7e9899ccf07f58a2c098b34ead4e4e3d1c6f4902a4c7bac4ec43ca4aeaea3 SHA512 42514c1ed7e8c65d4982b77cd724f2530e8a70a2a1b4e41a37763dfd2d0882a7c7276ab3d829ff9024daf02de81acde8e7022d3c45df568f281320df13f41535
+DIST firefox-140.11.0esr-skr.xpi 485866 BLAKE2B e9046769b0d54a03f07524f943062e5c95fd9d9295fec766faa57e08213f0bc375c3237ef04dd0567817d8089776b64cc6636eafdda0e1702f3b9bfb6ab38033 SHA512 0ee94f32f9f54d70bd99f59dd4e55e6d94bd3ecc6df046ecc06ae4004c7196eced84c7d7d6b6905158522ebacb441624ebe8df81fdf0b8c42a99370bd6c0b4a4
+DIST firefox-140.11.0esr-sl.xpi 441203 BLAKE2B edfab4497902999911517276b8a0bb9a0ba63d0b465df5a59f8d2c251fa2a2e75ec75d7ad7e779efa0195f8efd58b55717250f68f0175ef407432a024bf0bc3a SHA512 fc8e60d4afadb912c00d888808b6c88f6d78dcc32e07d2df7c404a9b442213cb8e5ec4fdef6ff20d46b9ca1729833abb5eefb421867b5992929af5fe788cca9c
+DIST firefox-140.11.0esr-son.xpi 273120 BLAKE2B 1355e4fde7766eadaa07316cd01d07922d222836876bc4dee6e68b2f85b75c6358522e22b5714d20b64d2efb0607992e4ddd513fc062e8fd66b31d9fe5690b00 SHA512 ec73b581fcf412a572f6b89161426ebb8ba9255fa969db90b61741f0d49fac19474f7a0fe4a2815e2539ce1232262876274511468b0ae08707e08afc647ff361
+DIST firefox-140.11.0esr-sq.xpi 456016 BLAKE2B 1a7d114367b36c388c8072d6f0e8a42bdebeb7d36b7afd64a8225261b3e71bf690b619e4dd4dc1e5c61afe731355a638fc19ca5405965cb85ac26e534eaefeb4 SHA512 99cf4b4069a8e64c6025bb068dffaf073ad830c921e4b444b19884bc1d69489de910412a5e5d622ac7d610ec69e107d06610d46b96be91fa58f9ce7acc2181e0
+DIST firefox-140.11.0esr-sr.xpi 453371 BLAKE2B 1d0e43c584388c3a3d42e889d68d90a18a92a9da60545af1f819f5090972c2306343f4e07865a6e5558877c27b4e7d9ac2c71454c9166464a192feee70b8048b SHA512 3af1374ce22b523567ae17b753fa4776215f687bc218e2187a1f4d409d2703291e445ae1ac25923b7f4a56bc97c3f56501d007e73736c118a1527278eda838eb
+DIST firefox-140.11.0esr-sv-SE.xpi 436160 BLAKE2B 25d94fe5c0f0a51393a52c087ea91c29f35ef1bf3688a8e7894acef34de149c72feffe6377f9f78a3f8d159a752ad599aa3f67312ebe94a6422cd1b8a5d6e551 SHA512 47b796c7b34dab4a10d61ac040d76f9ca0e2e5338272cf556b6d0a9795e31e0f1932182f87ef9fe6dbabf6f90cd89b4cdd4dbdbebb9e1680fbe204c5f3f4e1f6
+DIST firefox-140.11.0esr-ta.xpi 338147 BLAKE2B a6d89a39ed5a8aef6b4c27228114edbfea219b4e84f8101770a076e5e7bba81571864029a4913b30d109ad0abf339c190c8a79d979b174f9a6cb6964b232cd05 SHA512 04d5b97b992832572592cd6cfa128cebe5df3990b0c0633dabe72bae3a4078551359a1b72c8ac009d15cdb80d9cf759741e3b59e8d92881afa420c25a275c3ef
+DIST firefox-140.11.0esr-te.xpi 382197 BLAKE2B ff2b0fe75b7873a685d7c7918ce5bf473ccf90eb61bca2c540af6a010b16016fdb6c9b8924dd8648b549f706f8b99a74ac690dba1bebe010caf1f6220e579c72 SHA512 bae2caf00c46cb7846dd1363c83050fa224e5ab05e08cc09d08dd876a0d11137bb366d5c07489fe163ce22ef5bd63c1909828f181a9cfabb741c0145d5106daa
+DIST firefox-140.11.0esr-th.xpi 505495 BLAKE2B ddff0beee6e9b737f7a91cf8087ebdb312afc240382959dadaa5bf4ac221eb7b92c2f07641abd5cb11457380569a0e323b68f5e0fd5c197887d60f4070788cbc SHA512 12fd3bebe0418a2417642e7403eede920ed622cc3c84fad3fcbdec303664ab361b66a5273c21d5b5ee371d48df85884ccd30c908d8d72ac267a941a48c381f17
+DIST firefox-140.11.0esr-tl.xpi 356652 BLAKE2B 1c2cbaa261df51725e6904789226a83df4916292afa5093a2e951e3102b4fd78d57fa9ffb051528a18c816e736e85ffbec76b1b687064c45d4a85dbf69be78b6 SHA512 9e99cb3427b35ed96812c1478bbce594af4e8259a5a0816f8accd877639cd7ff457532fb56c996cb63bb46655005ccb4e1a92e0fafd7fbd6db4a395ec42a392c
+DIST firefox-140.11.0esr-tr.xpi 449314 BLAKE2B 0aca31b306fb5282a3fa77cf25fc0f293835059c8c3b9775eee3993dde2b285bba3eb8b1a75d512ec922e6cb174ef694ce5a8922a59790304eed93424c6462d1 SHA512 450b7c2c441d13512f275f73c7aa5c5ed01b2da4c51a7cd664a2255b72a2d6208db01b423bd3c0f86a2554fcb2a0eae8a50a42e12daf3cb22a02b3489d68f401
+DIST firefox-140.11.0esr-trs.xpi 324523 BLAKE2B 33e03748e0221e77c18662a9ba184a1ec82c283a81e6e55f48ee318062480ff67eb0683ece3dc28c9f4691003405c6467165b9de031f7537b3bc1d0ee27da256 SHA512 4541b8cb11b5c5f448d765a4d2eeadeb5601e6f2e1222a2a56603a734a928a973a47ed814817be145a6e2702d06539985390f60dd390ee552110511b2eabfc4c
+DIST firefox-140.11.0esr-uk.xpi 516731 BLAKE2B 76386e56c09ee21fde90f632167b166ef198ca4b70ee2566aa00afccba8b016b3041361128954717adde6c15018fc2b929b9d3ea9f9290a3b3e9561964d7c553 SHA512 01ac9d3aedafec939a36f24fecd111edda911078b92da6ff7cd68700beda07dee534fbc1b0dfd9baf51e615f32684a642f0fbd422adc2cc853dc65ae64efa421
+DIST firefox-140.11.0esr-ur.xpi 370172 BLAKE2B db5f156918549c174f022ffd6642a195b417bb82ccfe1d68d638a4467335af4d4d6f826353684fb5535e5118b0fdf777e5b7e1230591170133c5e927ab826fd1 SHA512 32d25f6edeeb91a986862852a9ffbc5ee34e97be56503920e87b0d5b8cb5c22f3bbb4e2065ba06f5abea6988a09b2b048581a0902f98ba039c6723635a39ec5c
+DIST firefox-140.11.0esr-uz.xpi 303479 BLAKE2B 469511d7525b093abaa9fec204591a69fb3f3faa96b4089fc4403fd5727cddd0fc40e9f56ce78016a0bb51a660afaef0e8d1bee0e0accfa7fd559529e5babd18 SHA512 d9b034f265496d5487ad48f7b24eb8f68b96d39be7da1611e69b19d0fc4f385b09ce50212b89680e2359824531f69bdd2b41e4c15284e42bb49bbda36da92d34
+DIST firefox-140.11.0esr-vi.xpi 469148 BLAKE2B 2f12a9a947f4926d9cce09289d699eb6aebe84d84ec6414e2168868ee823139a6bf8cbd13072700e14872f87b98b60615a38a333f904983bdaf75f7a785e5169 SHA512 18df2ba2fe89e0bc3c746e743cd5897064a6b81fe00e5b2ca47dd4aa8b60b1e9d0ed65c48f3b4a5ac032e0af68f92a3becfbb63a95656f6d693132c290a41fec
+DIST firefox-140.11.0esr-xh.xpi 272790 BLAKE2B 3fbba37d7f2b6e08ab1bca9eda8cd0d09c5f27e7bd1dd12f1f4e54a9347388e4cb2cef9f174a5d12435a355a99b597a01809861243e26a22e4abca6b858b1290 SHA512 54002d5dc86f4ca1297ba0f04525e3187ca8d79fc1aa711d30c9f82ad5ea2d9f420ac17c44a27a392ac11687dd63293cd9ccf498c98cd8be2b601e7446494e52
+DIST firefox-140.11.0esr-zh-CN.xpi 460700 BLAKE2B 2e0f8f26db2607b4e929cf797810a38e49cec6c57125ddafae834bbb60c68f461aa2324350d0bfbb2eda39cf7d994e6e259577d2a89944cad504797ab66145ee SHA512 4a2135eccbd9453d040e545d02b989a02f4a916c672f46ba964ba75e12b7ad48a2f0c1c9c456fd910be13e901de03be5170c68a1bbc8e4f0d8d409debbb5992b
+DIST firefox-140.11.0esr-zh-TW.xpi 463741 BLAKE2B bc8f6735861320eaf8cfc6b8432c60449d01f019c2f494604fc2c76cb74127f623dec73fde387a3ea220a76d42565169f2a2839f0c338eecd2f29c896a2884ef SHA512 4d0de158ebb8137b6b9c04a41662b2f359e13a7bdd93e9d96c6c137ee540157ea43bcc14a6fc0cc7434b09f3ee0364403978c3ab85eeddf60daf4798d823e464
DIST firefox-150.0.1-ach.xpi 294918 BLAKE2B 5890e628de203a7cc7f77df3d325c5468b986f9f8765a5a04f2014e2dd41ada0b033c801dae0ecfdfe3ebb38cdaed5a2e2867f4d8230c51c1ecf284c3c6c3959 SHA512 91a39058456b3c0276396ab0aa922996c2bcea0c1db7a2b5c2cacc86fb1608c7cf739ee822d18a63160e194ac77ed8837a61f54daa682f64842c4b486456c208
DIST firefox-150.0.1-af.xpi 268380 BLAKE2B 9ca38cb1bc9c0e870bcc8511e2ed25bfbff14b75971f013a5576311c098244f27c43f40c1a0367235c82b35326a1fa307c66c08cd4b03c67bb4842f892f4d2b5 SHA512 12b1f1ed0e046e36b20547e8660c6cbbd969f6f99e8073a55399aed201eaa313899fa19725f282a11a86d6cbc875df3bdf7169ff63a07cdf633ea10598a2d540
DIST firefox-150.0.1-an.xpi 332152 BLAKE2B 41d26a935e8f38da3b3a55c383af09171652d8983ba625c4ef704d11375bb7a0ce8d7473a865047104ac984d9a1d5c3e988e6e49f85c52dd8f44e50a93da67cd SHA512 3b3e2a15b10a4984e1cb4c5db700bdc562b670baeb31161c43ecd53af939d94bf9d850b14c12b6b28f8ce63edd716295c1633967efcb6c3b1d68b15d48c29ada
@@ -483,15 +580,315 @@ DIST firefox-150.0.3-vi.xpi 506466 BLAKE2B 6cd2f55354c87d9442e69395cb384d920dcce
DIST firefox-150.0.3-xh.xpi 274408 BLAKE2B 8c1cbd81f8798441c6e8dfd114bfc591322ea7cfdffed525f8c09d89793172363434b5edfa744aacf30796973e27cd6a7b2bef39e89d4bd5c88ec71e5fd23f6a SHA512 c7a34ff8c10c28755eda05b37d88a12a7e3b221e1bcf21b86fd64dd5229337f3ad05ad03d77e9c930e4b43e5930efe2fd83f5b3c0915890e310679ae9620a98c
DIST firefox-150.0.3-zh-CN.xpi 496925 BLAKE2B dea5dfed3f372ace154f66ce6b3640207c986bf19dce1cf6d3fcf79b122344a2a1a05d3dc9572939b1b4c05f1b76aedee5b39411c6c61734364a6ce4824d1358 SHA512 91008e13701a21deedcc98a446a1b5ddda7fdd3fe9d30cd417a6a84dd6cd380852497f0ca4d7c944057e36e22ed5637c03c37ebaf2b9b2236a40594092957561
DIST firefox-150.0.3-zh-TW.xpi 500888 BLAKE2B d7cf2ec863e464ea1c77854eafc177d686046343c5b255a1496403da19fc7502108c3de6d7eaecccd4409a6847075518c30eabff7852e9a1e07c9d3f3af57d8c SHA512 1703875635a9be5af0563d18cc771e987fa66da334c7e7351eb5f1954ef88f60f83c1d2022380bf94f648bc7bca3d9a1dbdf0511127b55058a6217d1f8efb49b
+DIST firefox-151.0-ach.xpi 295671 BLAKE2B 8581588f1f5b095721a810bad2b8d67a4453c4bf32d4f4177ca7be9ffb755ab89de1487451d271b2a06ae039b51aed4345381f89c6cbe75cd0ef15f57090d029 SHA512 0c44ed4a1f393d59b30de7acf11a9eeabd9d127e7fa6dafe5913dec820184098cb7623867f28e49a09d1e15f866d812f6ae5c4c3f068a211ddbff87934951241
+DIST firefox-151.0-af.xpi 269171 BLAKE2B 184c7619eb0d0dc11e67db7c13b05b5f15965f24f07031aef2881b203dbb125dc5a60cd8a9406d7726c9a58a5fcdff065d626d5bb3b75678464ccdb56e372ca4 SHA512 c22bc94d978ddea30ba2c5ca6e6f89c30ecfe7a1367092dca1003f88483dc092cb5b4043444441885f5b85e2c4da0d219c5a7e9ec723a0a55e40f8283c1b6661
+DIST firefox-151.0-an.xpi 332680 BLAKE2B 4bfdd029b269547d28e26a983bda2c7776fcd5e3da9661945c9c15b419683c34084a15aa240ea39f0f7519b2ff966112a319a4aee3a34dea3880c94a9dcc0004 SHA512 ec262edd512003381fc8e09ade7e20950e283cef04dbc9b7e999ee4b00f255f3a01767fd8919867183604a232986283d8e59f412eadbc6c1186f175d568b91b8
+DIST firefox-151.0-ar.xpi 504990 BLAKE2B b21da56abe5c928e57063ed5ff4d574f6fd406984923691e4faec4f342a7d88f4080af1c0471e7b41f09a333242f199240763f770c7811189c126988d2ab9fc0 SHA512 6dc934c58fcb6e48faf0831b5d4ed8a03602515a996b5329a6d973ae19fc5662febda3a8d30fb17f1d98ee64fd3530dc07341f6623991df5c2770b4e62266c74
+DIST firefox-151.0-ast.xpi 313597 BLAKE2B 8d19ba8a213740c0283ee6e632a114d89a7d633485c266c092062f56a9fdb41336f880c3d24ffcf166c52a8a7f452e4558c1f6dfd3a86cb66d2ffa37a39ee464 SHA512 bc3ac5786d968e7a02cd1a9148c96f6eb4d1dada7e967fd70ba892a187bd15620b69b83e4f530a7095f8d79e33cf250c16abe8c8ce9fbea55233c82481e8f5a5
+DIST firefox-151.0-az.xpi 319348 BLAKE2B 9824defc0d030e2413ee6862284ec9be07cc6c55f43801c0ff02816cc929514d28b94ed18ce61d5217b0b1e60ebf0079118da53b56dff14318d618f62fd0ecf7 SHA512 7dcff3d4c23dcfc6e7d980808667ddb158436fc772ac935f331dbdb8bf174c9991d19bbc560a918e0a264fba9e907232614f9c41ff364c250a54266613f6fcbb
+DIST firefox-151.0-be.xpi 571024 BLAKE2B afa4f412ed0117d5bad6f75c5c1502fcbf7926b37154bd4d0b93ab1e59c61845694c8a536979c7574201520c89825542e0c216ddd768313857fe2eb24db7cd61 SHA512 bc10ebbd310be6f3fd3d54f9bdf3e52a1d8273799f5052f86c4d4c925aea3127b1ff5b34735d064a4c887b28e47f14fa7c5c1744fbab8f1ead2c8af24a6c4b80
+DIST firefox-151.0-bg.xpi 462403 BLAKE2B da1f71ca37f8f7e64f4f27d8f9500153d4c91cac52ff8e94f8082d5a8dfb683adcf956a66bc80ee86a91504ffb1f662f122866cf782e96fec4ea8f3e87c072c4 SHA512 7cb164ed78b3d6a212ad6bf1fb48d9912749c6f12ad2413c04183996b3dea39fc5d565bba29956a45469e0f33b436ebb2475e5b80db230b5a644ff9150555939
+DIST firefox-151.0-bn.xpi 413287 BLAKE2B eb4da7bc7cc67c463de615845cdef290215535897871d46bcec67e64b9b91da52c269223929c8ba25c1654e54c06b2123a8bcb04608b428a1deee7c92db650b2 SHA512 0eb8972af1e17da852e5fb52fef9d250f3987f5a0879dc9ec061e4478d5939ddac7e3856f677e14b0878ded51106d1c26508b8a2c2554e8093a3a75812e49548
+DIST firefox-151.0-br.xpi 395093 BLAKE2B fee9d61c2029fc2202d599d3c5ab3532684f1ad6f929589c90dd66b54020f893c2673aae9d6fd82667dd415e2cbc146f3503c87e220323a1db6fcd98ea3262a7 SHA512 76832c9cf2f5e339822a74430c1bf14a7ab23ad57e71857950304cdb51d99efe4c64ae35f3d620bd3332a4fbdf0815e5c8f7303845c022639315c39501ce0f48
+DIST firefox-151.0-bs.xpi 449901 BLAKE2B edc21c6a56f328d3670a5bd2fb301f746deaca1c13ed81c0d2df4dcdafa8d2688b0a19a777a6d3003fd485c8d8c016069cac4d83e9c331aa8e738e9518bdac68 SHA512 53b8cf934feb1aa7c5ca8457d2f4afd4139f92c9db6936566a988b544d1b914518a5996c50f119c0128b50b81dc0b67e348876444528a14d06888ee8b9b33812
+DIST firefox-151.0-ca-valencia.xpi 358951 BLAKE2B c4de0b22fa871bf8cc1e35852d4b61cb50cd77c4cf5556bc45c8befb6551044d17bcaf34e45632c2bf54dbc058fae58d80af8f2f50a3999880bfe65583b33bab SHA512 6b9cad45879794067f553a5572bd89499edd329e9de111d4a264e2cb3f78e2631ba50aa304912d40d9d3e7e744ad67985972ab6307cd95ca8375be9deaf78483
+DIST firefox-151.0-ca.xpi 427067 BLAKE2B 63433249cce5dcdbd295bc19a0de4e5be4fa9df61a151d80da8a61d43652b91aef90790e8009a40596c1417b97620598dbc9ffb7396272c1fbbb1813b11faea3 SHA512 9b83247aeac26bdba50b8c63156827daa42cc28409cb606adae6a81730d01e6b83aa32436826b74cead497f2932da2fa4db186b28a53ac0b610c87195758a5f3
+DIST firefox-151.0-cak.xpi 390399 BLAKE2B 94188a588645f9234dc188654b337e2fa75da2dc733cc15339787acb029375ef92f50d06153c83ac55cd6e5961e5bd063d074da1a40d36b81dbdf96725dd4867 SHA512 58b153e299278babfb51b9509b3d8c9f18cee3f002e60ffa8300f809e4e7b1f462deceb544de933289da80c3e8b263f944e99b9599d80de136e1ae43151ab426
+DIST firefox-151.0-cs.xpi 522060 BLAKE2B 0c7086226cc0bd321501108176c6e9efe91ec9a4e93906448554f2940b101d396db5f55424e26b181a08fa0fb91e0ed3b5464ebc68d867e95f8d223dd1b05070 SHA512 534e9076af590c4608a15268ab3a5aa1fc94b014f95931d9fdaeb0b5a330504b57dc3e309de78d840543e343211111b7d64aa5063b9c264f74ef84de64b5ac69
+DIST firefox-151.0-cy.xpi 483480 BLAKE2B fe7f25937750397778cf7439d74a5df49d7d50dc4d465cea1a2a7e3d5c5471e41ab1f7f3f4441a01f9794311b0bf7c2f738ebee242d81a9c174356b36da15f00 SHA512 dd9a1359d9a372f4608e69addd2114d937945121db7bebc59e6859b3e8c14354edbc87c9f9b7c3c79efa7642a2d7a5014ddb66ef0b4c52b12bd6a91aa869a1f5
+DIST firefox-151.0-da.xpi 464157 BLAKE2B 2047858f5efd0957d12a3a7f55054ff6359adfd4381c232f4bd75a1929d91e4f1af463a65c29d8979a323ce0bdbb270b0c271630562cab337206d279ed3d7018 SHA512 653ef5cf4fdbefd4d5165764758e8d9d4c0f6d4ad5a56b4a59e715cede5efe9aa2a0affad1b2f9cfc0c386c4ea88e7952a960a29bf3425127820ce3b16359fb3
+DIST firefox-151.0-de.xpi 494928 BLAKE2B 3e51453069bcec67b1f7fa09825cbadaf9a1960522571a2a43eac491ce03c532c7f9848db9e36c2856acd11ccbc4ecea85e3d01bb8cd2b256ca72be341b65e35 SHA512 5aa268d41272dbdb8232deed34753126ddd086e08d070f218b65b69467cf72ba9a798b84ef262fb58e9ff90f2c59fcb8fc7292545d6a44e67ad4f5751eda6957
+DIST firefox-151.0-dsb.xpi 508866 BLAKE2B 25f872ef79386a34a34d29cfed6f3942ad904beb8e84a1bfa7a0e199cbc6467df53fa1262a8a6f5715b35cdf399a8d6fa0deffefe8fd4c66c2e3853417268f34 SHA512 bdbe16c72e94c4247d8e8710daac351599278b7dc7e5841efc462a7c255439db65742c7e1ea6fae59f9540adfec5d9ef478b4a631e0ab3e4ebcabc05ec255c04
+DIST firefox-151.0-el.xpi 586705 BLAKE2B 83491c4f1cd7a419ce0eb6ac912313891b8863efae8860cc250c011f1bdc957b670302aca3ada4315ed619528bb6623694610c16771e5b155264a657fd98bea3 SHA512 3a222dd15f0663da38fa301aa5646be8b2bc4d6014cb83185cca3fb764e820c25fd5c4ff80bf83e96166a7807e6f5eb0582e5a2e14676d491824b476aa8320dc
+DIST firefox-151.0-en-CA.xpi 447415 BLAKE2B e839431e33722082bba3b233c5e128a8e4f7a107a730228c79f561a47f1d50efb0b334ef6ec93f0e01200f0f925122d77563517eaa705d476ee5a83edc55dec1 SHA512 56ecdd5abe52f635a4e8e0e204d5e00f01734799f0a7da833736057fcaf830281300d96463cae17c33c576a9eb367dd626eeff0a7aec8ee37f4f5aa6ea900ee9
+DIST firefox-151.0-en-GB.xpi 447725 BLAKE2B 356f7c7bc5e7a409330ee05f34c225d6f9f3e8e00c1520a411655ada8a53ab981faa61bab9e28ca518e225d7c5485c4484655d95355e4ea8e76259d4ef395daa SHA512 8b7b194581df36714a5a1e17ca79bacc7b77752682d8aeb2afa7c659ce7a3254049f874abb07d9e48cda0edf76ad1a890f7ec721a48e3555b399761debeb3c59
+DIST firefox-151.0-eo.xpi 473063 BLAKE2B 7e1ee255b9819223859a85aecf7ed8136c90ee41bfda5522d6a205202feed05cda96c39cb168eee76aced8dd02683d9e04a7ba76d0f283a98e8747838cbb0831 SHA512 c9dec1123a3119d6719c5f18aa1fe8bf064b8ec7ae51004a2c8081a59314784f351d355f675d06199cf965dd6029fdba6cc9062c4e5c3fddefec76cac0e40f7a
+DIST firefox-151.0-es-AR.xpi 485607 BLAKE2B 503904180e97e6e8444f67c3f538e49128a5f581f781d982d7ed67e62692e470c2f37322c905be3c639afa0f9d95e1f35c8378c336e666f6bdf190d42cc6e358 SHA512 dd5bc742294675914a2d15c25c8bbe98611286ff08e829b977201181542804535a5112beba14101b0145f188a63f9c956107e58d1d95a5cd3e8dd3cae8a6e543
+DIST firefox-151.0-es-CL.xpi 487106 BLAKE2B 2b9a6d0553be5aa9cdbac158e589a19ab49cf1d48aec7e0f2a43683ed7ecfe592e70bfb8816ae9001c084681a171ac6759d2dac25e1666ee2e5939e0b1d4414a SHA512 7043fe5e82d97b08f7566a7e53b6857c296182a9060a6829ab0260c903e48d0144d59a926309ee034cdefe102d4ec9901960a57d54e2f7e29378e25416608c9f
+DIST firefox-151.0-es-ES.xpi 488006 BLAKE2B 4611dda69bb4b40337de03a39b9203fee3e480da950768b07a2824aeb7404476a23fdd01fa5c925458414e1075cab1eeeb50c5916606483edd6d1ad6c4f1555b SHA512 f0ad4e4e83592c4c02f622642e059f33a1a09380217bdbb1a94d19cc45df9eb514179b9ff9a34a6cdba9b4f125b447a5da1d43fbd1f8b54bab2d8f5f785832e7
+DIST firefox-151.0-es-MX.xpi 490713 BLAKE2B 2fc75db008aec4e452f97ee3d5ae28895dcbd3986987e256d33c68731576021e437fc130a5086c4960871ee83ec9e36ff05d6615850e5e7d3e1fe932c8bbdb39 SHA512 7b735a530442df5ad8ecb539015169455134b9b4034437aa642b4f0199a605de6b71cd6b63cfab18557b2b7f9f996686ff08919da63c10a24b6b645e74a10d58
+DIST firefox-151.0-et.xpi 359449 BLAKE2B ec85856d6605a403d078e400ccbf79c31394e25603c79939694d6b7a34c896844436e24821330b631a7633472a9cd079f3fbf585af840f0aae1c5cefc2000a7a SHA512 81d5b3572ab70e870087145689b9787967eb6f1a69da6ff7cd1b5e7924d32939176da9b397977e2323ff87e540d38c2e7448d8f2e3f7e7ffed0d305f7719d4a0
+DIST firefox-151.0-eu.xpi 471747 BLAKE2B 4b109e3c9f05ed9fb91360d02ca1b5f7824c140cfb58fd3449b929a12d2f7efb13fd3d3f23c3621b946a79fb5be29399d581fcb733f5ce9211689daebb78ddd1 SHA512 9fbb469d5e13bb369ccebf45ac454fe74a06638da91a5fa88589682ae706e0666fcc7d96750ec7e21ce935c420e41dc863c6ba484cf5ea2ac6fbd31d0dc61223
+DIST firefox-151.0-fa.xpi 420511 BLAKE2B 3acda34f9e90a3d36e1403eb8be6ad282080e83eda66777609421cdb796516155a5c5b5951cc709337fb8221a83f514b01aa528855392e6c2bc459a836eaecb9 SHA512 7cf3d625b59910d5ace9dd637f420377e9060e17a1c142fffe331887536cc973a86f7b7a39436a35dab7211f7e6929b5816e943c65f4e2b5af20bca9fb9a8f30
+DIST firefox-151.0-ff.xpi 311030 BLAKE2B b61959b44dde48ed30a7b7d817c84d26741171ac22fe57867d516d227eb2599330af799a833461e274c0e9b8640bde642841990365bbc0689d5bdb18216708a0 SHA512 bc741f32b0b3e1596af009d5f4e1b56cc1f33c490b68883d7941ae189d64de871a3b0937735bbc6eb5dcbf9804f79f428463055f1b0da7b81733fe66f4b60a0e
+DIST firefox-151.0-fi.xpi 470340 BLAKE2B 5cadcfc215693b6e1f9409948bd9b346e1880b75e00774420a4059c8e8118b1b0a716981147423dc4fb962bad81ba5882a724875f4806d49787634ac12310bb0 SHA512 955a0252633305e226a922f755a651012696a2ef2ae6607a654edde3d2f08abe03b3926d79cdf76f423397c8303e9fbf4c12eacc9ca5796ade859f8ecdaaf2e1
+DIST firefox-151.0-fr.xpi 500656 BLAKE2B 89f4be5d13b0e63f54d46f10f3010360fda6031634cac7f20b9bac4f6d37ec1dd2304e0cecfd5cafcd33aadf6543d77b7bb811b452c08585224fb2e247694eae SHA512 db7eac9620a7dda4491653fc3b7a3e9ed6a8f295b936061f4110930019fa5b0c765eccd696739962c667ced22d529fda754d451e85efeb51fe75e489e0dc60f6
+DIST firefox-151.0-fy-NL.xpi 482254 BLAKE2B 336053d50bfd69fb2eaa944a4594317884247b0670cbcee411d5a6832b40386cfa50d33ad36c994d26ebb5394b7519d64f2c90506cba1c472d5faa83aa55befa SHA512 b682479c2f0bea0f566ce47f6e1ed5c81b95f5a7719b726343d2482004748a7cf33aa8c4a05e1b0f1a72b6676b9e97f73d97d606e1a4105e03aa0f37a9e49811
+DIST firefox-151.0-ga-IE.xpi 316675 BLAKE2B 3f3ec8d39722df86392861e74b4b705a647e95843a8927540c6c609c82c2bf3f3a6425f6079e348d9be9f64d53ad0ada867673633abe4adffbe7f779a8e933df SHA512 b58d9e2dd4302227d2f0008b66fa7bf907c5124547ea040a960de4e2a17c346675adc80fe0e135e72c2222b36e2d982374243eb51fc0d9cc8ed42f17975147b8
+DIST firefox-151.0-gd.xpi 410051 BLAKE2B 0d2f9aeeaf717d6321341f6c320cf561dfb91ba59cbc02688ac6579f129f4d69f6baa3f7c4187d793c82227c0dc616edddcac92d1fcd968a01d1cad753a36818 SHA512 7d1ca00d610d457b706d0d27e253c209e5dde7052d01ae7167b2eb598914716fd6e4e3dcd469f2babf439be12c9b8529bfe7c6980355080991826912bde0980e
+DIST firefox-151.0-gl.xpi 446597 BLAKE2B ab64c2dba2bacfaa45516e20e44645f025022e5e1ea25675eac2ed0d944e52e4b1234083a6f9835d14625eef95bff6108ed949a9072814163f694fc55f24e770 SHA512 dd614ad5c14f3a6c2bda8c4f7608b2410f2028d81c83c15c6cad1a6339042ccab1bf8d9a04409cd664f44a511aa7391b1b93668951089ac506a7493f7ee287a8
+DIST firefox-151.0-gn.xpi 490540 BLAKE2B fa1c668d866ced244a4a6c6c195b2818620903aa0b41b38757c00b95908867fa169f748fad42c2fc782503fb5148755ebe5055591d2dbe84e73cb952dedcfd8f SHA512 970fa723fd3f8a5bc98fbb7b67a99cc9f9ceda57530ee300a95a3474769c7190551e8ac397fb6d0c0aa5e3b2a889212b78da6d7382d61ecb898dc3cb1fa80fba
+DIST firefox-151.0-gu-IN.xpi 359210 BLAKE2B c5273acc0d90abe3a7316d7c04cad9280aa395c5231887a93d2f55d21439d0929221bd567fb4092745a4b030d57e7c6bb726b1fab39eba3daed739a259c91c44 SHA512 73353d7875755a7f94113be4651d393212a5824d9b48ee7e2dde48ed029de545873a4c9c113899462f31edb894892561da88e034d2f0960d935c0403981d33db
+DIST firefox-151.0-he.xpi 486325 BLAKE2B c0ed3decbadffb77a08b18372adc00cc595d86aa284b4768dfa0d88315c16e31da38939c4bd79395663962deb71c79547bbf55b545f99cfe3c9c0dfd38561850 SHA512 f3377b262c8de11b2de46e8438b984dd0611284dd3b3e62446b34eeae849482bfc46488998e737cf8dfe2001e64371f4417d0fe8b78272c7a8004cd5d13686d4
+DIST firefox-151.0-hi-IN.xpi 378095 BLAKE2B 60812497c156caa526142b63914241350894cfef09b0e846f1244d267a66b302499b679dab8b9bd3910b6110826683a70dd13edcb918eaf0aa007995b243b9d6 SHA512 8365d483ffd68892ea32e1ca2dc9e27349eb9369afe75ffb1ffd8cc4013c2aa3ceaeae2ef1afa0f4cd064fa559f523f6af52223b7d4012c3de38a652440e78b4
+DIST firefox-151.0-hr.xpi 472320 BLAKE2B 8a8576a8121abc1f4ebf16ac94f9e133813b1c151ce0cc7ae7f5a6f933ec6180b59ffdf58c8a41e214716fc963ff04e4c4d8b526b3328e6417a89d49c34e8d45 SHA512 c4fb1825c734da0a901d203cac8190316884801d561292195f24afa4f0f62fcf0a7e1e8bfdfcb4c23a7ba2378f8785470d61261c3a386011cdb85178d287de4f
+DIST firefox-151.0-hsb.xpi 505520 BLAKE2B 8a06797943bc07e8b59338dfdf396d14629f9307eeee12eb6e7943d2955659cc87b2b7b2c406cb94d6ed7485b503229a731c654a60559d4ec3886c1c7cfaab83 SHA512 f2f8b7a80cd6a97d42aceaf1e866536527eec0bac370e0e887c14e6171f2537dc1d4ebb578eebf499c01e4c88f9f91d1bb0ab5f3937ffa674908980b1c6fc8b6
+DIST firefox-151.0-hu.xpi 509760 BLAKE2B 04c118df2651db8b94677648eb8d2c0f46761502f2099c926ddda7a0e044caa13d5dce385efb41d0e54f4f2eba8579bc09c7ade823866bdec510aa4add513d05 SHA512 e36dea5ff1b5165af36e0338225e8711937ab68382071a7288d41f56b2fe8fc426b4617621611d656893fd5f43c448b95b482918d03fb2bd3af4e0820e02d6f7
+DIST firefox-151.0-hy-AM.xpi 486627 BLAKE2B f7dd3bf2800dbfb03051f21bfa07200a43d282e35c51dfa6fb078ed31db97389ed715ffca6a17307fbd0f993d566c47636ccce85939d5758aa4e0cb5e779531c SHA512 a0bc141ba4d39efcadb356e2ba2d340bca284bb6803a6de20ea19c5ffd1f2e6e661d88613253950bec2ac5278b9801713c45adda3b34f6c22291220635b56f63
+DIST firefox-151.0-ia.xpi 469190 BLAKE2B de183087b6e4866cc5278cb4ff650ba415219974d879accc6ad234049925eb92474ad332bfcf10bdc7b66453d54e7075c0cdb59336c9e274ff33137e0b7b99cd SHA512 286ade180e139722ac0a5cb1a191d7cd8ff8e2864a812069a0a42c565b99d776c7ca7b445a072a416c0e06cac92f90d10725f6c23bb35611002b3a02ef575a6e
+DIST firefox-151.0-id.xpi 432658 BLAKE2B cdea26f046905684abdb3612f166910b3f1791b080d3e1271fc9bafe5c5f659b42e783f5421ad7f05fc1beff7872f98ab2c73275e296bb544f8171894af732b8 SHA512 1ef56defc1b526278a33fa899e710475f85d6da7a73e17585af5614c2887f086e0ec501e8000cef70a23c8dd6f9772a3262c72cca3a6d1766927549e12be7d0e
+DIST firefox-151.0-is.xpi 440476 BLAKE2B 88b693fe8bb976434e060e7b76626333ee1eed5f0ee8844b936c2b4f2d747d6f8885f5d15dfe468c5516fe1b9f81efcbbecb4335bbfb469c4e83203ab68d441f SHA512 85beaecc75a9a47d5508746e06d0405d0f6e4b36dd9b3b9627b884cf6a8f6ed6b2f7cff9e634824d517dd5118f0b34bc6dd2c5120c5ee5bac200b2c86cfa7ba4
+DIST firefox-151.0-it.xpi 481189 BLAKE2B 61090dce99aef393dac48917d5ee8e4289ce23b4b90abe444745b1484e46efaecec02529a26257d5b192dc90b966d7ca56afaba5bb916a29fce9735c79203b17 SHA512 4a74eade67d59280c4685fa220fcd8d354c705ec85dd786de4c981b2c2bcdd20e1f2dfd2dc8c9274538986e5d716a2a42186002440ee9c5511e0719e50158f27
+DIST firefox-151.0-ja.xpi 524684 BLAKE2B a16032511aee69616a633554d35a498b7dcc78a8a2a48d0e9d5cd0d4b49f94edd7ca33f9409bb2d8af25cb6838a7aa5d411b3287d7673111f0188f99edbd5c1f SHA512 5ebe281e5d9e346f3df2db6f4c954e762d0408089c298572da70499eda75a8027797b5d739e5b387311bcfcb299632af70f1e19aa8163d61f1c7629e468af3b0
+DIST firefox-151.0-ka.xpi 543668 BLAKE2B 92e88fdefa9e5412051b441a28ab1fd46364e097382a5ba1c9af24d561387b607376f03d0e85fb0b9be7d8d7918a9606aab2ceda3a029ccbda264aee072ba4e5 SHA512 f7a53ca5dfc0df9de114a4d62414e44ee4ac0ec77b11b11ce80f5fb7cb2c1c891681c63488242a304e032d715763166a9d3576e9d218f680552a7870fe727fad
+DIST firefox-151.0-kab.xpi 426246 BLAKE2B 4f0fe2ba4fc7f2f9837e3b569b21887cdec24401d52ac969ba39eb91cf35ee8ff5999b406b6546bc388a8f65494f1352681a195a879c98c217a262e71da68671 SHA512 68f4d4e71ab64e2b80e653584a351f2d6c6518291ec0a4ef7c6efc5047953b57ce1d6ebb39fe921ed08902d0163cb3661b72db485e132cb395faf6f8c94de1ae
+DIST firefox-151.0-kk.xpi 562327 BLAKE2B 5cf0617b17b56d729e7007aa716585eeb0ad8b10c2f5f0c9beb1d5915e53ad4602469e22e8254d1992ca5a43bf0278934c322f7a961c4dfc1c3214d8264d001d SHA512 7e799005de4350671f152ba3b824dc5324597d89be468c93cb01d88306b5f366d164de7bb15dc928942d13480b7f0f35b867a6cb84d7eb014e1f2238f4b8643e
+DIST firefox-151.0-km.xpi 376362 BLAKE2B 2d4d65df35e3147502881c2e258d0684ba3251933b63d24c876746d55acbc15209104bf39f691102082be1cc460e548fcb92b1a608f97d59ab04c0d1327e501c SHA512 38bc041163e7ac00b8d3676f78cfb3d75292a39304daf8a8ae953ed15d4cd77f77eff783da6cb06799d4bab1193d34f9fd6599b303f75e2480516c0def7dad10
+DIST firefox-151.0-kn.xpi 333524 BLAKE2B 5d0a5a4ffedc911e0ee10985a9a2b33b7a10d207932ca8d74d1c36213fca0fe48081dde78a2f30e23d4b0078dabefb4c259a70273de82982e7340ae765ee4abc SHA512 724fb4586d512158d210b07a4d932ff749b6ce0dd08eb432c71680155c5ecf6aad0ef23d0420245259af3c77e642dc04e56c8a6c29f5e109ee96ba132e87b1d9
+DIST firefox-151.0-ko.xpi 509130 BLAKE2B ad2ca69aa5f203f5961e5c327a85e623bf64a1e26356cb04e70d105680bd4dc5068efe950055af56a86280338f14efa5da48e3763e8ea891284b607a96c79eee SHA512 562c93c0a571301e169ab6e1ae9a308f02e430cbaf77b2287491e3ddf4855a15e4ff932998f613c2228a02bb20555c3298efea1767a8786b26bdb9edc0b44cb5
+DIST firefox-151.0-lij.xpi 320396 BLAKE2B da9699651802561bd5567aae5d09d2333f2fb9a08c128192cd6e78c3e18f64a0ddd11a0691656f5c1f17c0fa12f441b139ce614a92413e65d93e364c0d4c1614 SHA512 815eedf43501bd07a8c12109f973cb8511d833f694e4546fb3391845d0edc907482f6c84ff6262d7050e0b5022cc23a706f68d327ab524ce473eed13f6a28541
+DIST firefox-151.0-lt.xpi 380204 BLAKE2B 4226fadc0abb41ff6f6aa531cb5175983b8aa870a1419e6fb1a544fd25822eedd6de2a11442fe0681d02881fc4f1e273c21632cf23af08c3728a338c556566cd SHA512 6449e89614c868863eef10122ea665564852cc72a1c5d9bfd58c5a76746b421abf923ec9b60492bd16b7afc852a473c3b48819fde884b853fbaffcd606b25585
+DIST firefox-151.0-lv.xpi 391290 BLAKE2B fea281612ec1dcf57558bc3c625d94d4488a2d509c1f98e7a9f79af41ee9a81edbd9f460541e4d9ba2f24d8049e869f078530093bc79610964cc5207bf9dc4dc SHA512 8126ae7877aaa71497869c9f99e8cb778a42af816743b2d853fb5e41161bd9e1e7e008a02d20a3250a3551b0f8639c94f02ab1fd4b067cb55cf2ffae5b535fcb
+DIST firefox-151.0-mk.xpi 351828 BLAKE2B fa56f9c4c1ce55f66871b34462dfa8aed847ba2ee6f1ebaa4040afcfb9c99918dfbbc77a591556087a1c57374f109a1279cd6d0b356a8130b6983ee9d609f9e2 SHA512 3161ab305034854891a765da746a66f37a73a5c8b96e0946c2b922d862ff5e1ac5c772bfd140ba6c3f4e202f0c462fe5b4fe5c73ddd699b0329076c383d40b0c
+DIST firefox-151.0-mr.xpi 357099 BLAKE2B 3fbbb1fef1a99fe1b3af2f011c59b897c57ea5cdb74b3d0157c19b08093ee554274855cf50519a19ec6917ee8915ae9eb0ff6a00e87c4a730bece8c71877db44 SHA512 656e533292fd1f3eb54faf4cdf76fd27a8751007ea10074c808f5ec5fc62e6995cdddd668264e32f07ed5f70db0e6d9b04d18929543f71ebd9a24946f94df88f
+DIST firefox-151.0-ms.xpi 296892 BLAKE2B 3e9ef6c1c8fe8bce3eabce2bc114c139198e8e8a936d2e82a784be9ed52d8ceecc180fbbd4edffe75bf8e2779daec2ce87b711d96e42d3e58f2e1c8f58cc09ce SHA512 46d98c39a7280cf76e855a694b3162c8fa6929ac33892c1f250eea4f924f5a9f66b1adb57e49565e485614ff675e1a4f56d998a227de7de299bad924efc53783
+DIST firefox-151.0-my.xpi 344103 BLAKE2B 921fbc8ba2c08617b9ddcaf474f8d941062a41f2c6217867a743997bdd9f737fc23cf63b720533a7c04f6983264be264f1557b3ce29ac0eb0edd415dac163adc SHA512 9757ae11038e905b768aa075968ef6d339fa081e81dedd9ae4f15176ace48f84aef30a2aed34ba4c7aa00159da8f2fc8d30774050fdc10a677354e4f32f0d1b2
+DIST firefox-151.0-nb-NO.xpi 468220 BLAKE2B 5427ae28b431238755bbb770722bd3acaae3858b804d867c4e5dfa3a934ecec1dcc9df8704def4e29ac8bfb3c09c9e905c69dd89b8aff0247d9d62a82ee2cf08 SHA512 b1910d73d4c0bfe17a2e3dcf073a646ce7e1a0386400b2a9de2af8a604058d7393abbcd7961f94d3ac08a9576fb3af7678741efe030c428d2b3c82c299655c65
+DIST firefox-151.0-ne-NP.xpi 349210 BLAKE2B f25945f4f415ed1057aadb39801d3a55dfd1450963d6c107adff2ed1f023970af391d01a5103c67c71fd5c426c860e0e1dcf3a3658fa4ca4dbc5464256411a3a SHA512 acd4704a50871e6b3c6e6ebdddd38087d27e32f2cfc8fbd5106692728a31f9e00e24f4b94eafe4b91db416744aead164a2852a8111494abe15c2737989d42d47
+DIST firefox-151.0-nl.xpi 475882 BLAKE2B 4e421eafa8568b7a75d37adee09e1ef889d4cfcc3250e2715702fbd9880ded5108041f7fe2e0077b810ff394bc82e9e8c9767eabb66ed60ba6f9c4c0f05fae36 SHA512 94974f36974654188324ce668a24d64a13455015ba4fa2c3cfe6ae98cc7a6414fa8cec2fa70752e087a1a5e6d42a29640e76188cc4ad8976334c9c756609ab5c
+DIST firefox-151.0-nn-NO.xpi 471568 BLAKE2B 46f56f3fd313c1bb9011edf4957667e0bb0a8da6c5d9e1a754c79297506469421428ccf815fa65c6c33e276ab6df0b1c07ab7c2615c36743047921678487b783 SHA512 d4108f0668a049e48fd0ce903475c4b3554ed243fe3ed9e8fc32f1287f6647030019d248eaba907acd67019bc1790821a1b0993b97dc5a08a03bee4f9939553e
+DIST firefox-151.0-oc.xpi 414861 BLAKE2B 897db38395024e7eb8d1171063d29052bc2352e7eb10222df26c10753b3ffb09d3725b581bca0620a9e643b73863538593a07b3a8d5950171c8c089ac8e62b3e SHA512 e589f34295631438e3b31051e8d111ea55604f4b980ea4f878e4dadbb798dcfb93d32f426b4aca5e331dce6b14206d8f98bb91bccded3373a5c827fd6d8279f8
+DIST firefox-151.0-pa-IN.xpi 542009 BLAKE2B b2d5c43ea62b0513935a1471cb0a9c61470e01f64c4f9a8c662c93ce906f4f8b9f3e16870a0f2e499e618a31dd5b7f7352019ad4c851938b1fc45d18e2491528 SHA512 ee453808d537fc02f9f76089075b540ab236d53452b7f196bdca38bdda966baf07139af9df756eb5d82e5e756c7594ad92e176bdaeddd8ab458d90a1c4671469
+DIST firefox-151.0-pl.xpi 506663 BLAKE2B a298c52c74599b33ec9286b77be60a07155534308e70eadf23f50a7c9747b488b5a3f4cb165e87a72f6cb9e47f27b2187cc2dad233a658513e601aa933fda6a9 SHA512 c07e9f4f8accc24fcd334c903626b2c95b593d27f59af50c2198c62535c10095681c62c113a48ad793d57a471e0cd9cb8869c179043f044632926538f47a8890
+DIST firefox-151.0-pt-BR.xpi 480567 BLAKE2B 99f89ca011a203b897abd9cdccb13a974f7c69dcce8926de0000be65274f58480f2689527ce7cf054be220d38fa0ac5d0b8bd14d3203041718a8881bb9c1a289 SHA512 08914e2f5a26bbd7bc68d924fbae74d12cbfffebbc5c0fc907974ddcbdf1c35942ed08a10f3f3b87dcd74b61a3822f59169e8df94a8c68fe92c7bacf5a51b4b1
+DIST firefox-151.0-pt-PT.xpi 487435 BLAKE2B 1abaa5469a4f538e41dbbb294c65f9bc344e5047007dae8d6f70029bcdcc5e195ea9ab660cb4c8fce86b09ebb06cad8bdbfc6d7962de48855b19bdb8576952a8 SHA512 680b7752700b1cd830a6ec70d4bd06db8fa6b85ab833b002e2236ed68a108db43d60af88145c7e570b995ff53dc9831683ab14ffdc9b78605eff28e2baa4f59d
+DIST firefox-151.0-rm.xpi 458384 BLAKE2B c7043cfd6d0a83c1e9e34fb1f5277f0580d5fe9db3be151860e8fd1adafd7ce601e5d9b3e569d1d8122eee9d0aba3eae421ae91a5e1e02b71b91d9a33af0f4e6 SHA512 4ab2fc04241dbe3aee46e757e900a7c08286ee886e13563450162d97d0ffbf0275d50ea79ab3274d0480aad3187bf3acb7f3d5530d6cb27540aa2062fd67e136
+DIST firefox-151.0-ro.xpi 494323 BLAKE2B 9de6c425399ab4e24e622cd51491880b60a08cfd83c6d20118827b3591c096969fc1228005706c5f0f0dcf6e1d4b028e772592fbb10ac8a8b529fa17a4fc7b6b SHA512 6cb8e871ae81b9e78f54d82b924cb201bdd390ab0d298fec385d337e134e884263fc4127a1fa65747d5a61ddcf21b1af1a1d9f46601e2994bf4d186e4feb8c5e
+DIST firefox-151.0-ru.xpi 574717 BLAKE2B f1f7a73f00a8826c8ef1fd87327435ccdf8e00905b0922e0077d65b7ab90f4e47447a78a459a8c17b14905c915dea1b3da67af8f40e52aa045bd33f55654ccb3 SHA512 1a03be17144a1938d3b95463840cb343f3ed800432dfa327b05c18d4a2476b408cb2569b4cb47457ebc5f984ef2023864ec10aa4aaf32ad439278f121f648538
+DIST firefox-151.0-sco.xpi 323577 BLAKE2B 6dd77c704767f08c37e721d95cd4b95f560ee1f0801b5877765823a9aef24ef3291698a136e1aca7a70e2c4d31014bcdbc1329dcdd0bc0db334f1e3bccec8963 SHA512 8d635051c4c0716adfbebc88c13365b2a4adc7ccd179ac7d4dc8e194b9c181fbb8ac587eaf70d60f2f9077a80f57f96e8e659d0e8d47827444695e8c9613019e
+DIST firefox-151.0-si.xpi 409779 BLAKE2B 8869804acf2f5a879657830811fa0cbb542c520e1c57ef0c5244a81352e4da2a1b156f2b3de9846bb521d5bc06e7b76c36f3f0fbb05e3a0d0795311884c1aecf SHA512 410ebd10062b8f40b08246bd8ff20011fa9a931fefb393dcf99d5227b60e320808982a068b409bb061d7b9783f1f30626405a214db93ad507239b32c419ab3cd
+DIST firefox-151.0-sk.xpi 512616 BLAKE2B f846906eb7b954ece60c5877944c6ed425aaad7f9c17aad0c20b2c3c99f6ba9dba8d36d3feebd57b8e3586b14a393c77f2fb8b9c6c3a8ef3b5c133d9b5dbcf15 SHA512 bba661c705e8de4b9030dc4f5132b0d39464451406bdc73e561c8ac581bb51c21780c26b9a09858127aac0b211850aead090ec724552fc83d3d69d5cf64685f2
+DIST firefox-151.0-skr.xpi 484960 BLAKE2B 5216bdaa0ffecbddd9f1d1f9e88d8f2876e57724bd9a1c3989ab76f33afaabc06a47cc1f807adef23c9558585f943d6f7f41c80e154afa5559578ee7fb847186 SHA512 44d499a1c0119f5b8d307bffbfaf10fa6e6faafab04bc8a5ce157189adfd6e425d44607e09fdcde1d974940b3a4e7d7216e6108fc21cb45a93da7cc96b095243
+DIST firefox-151.0-sl.xpi 479135 BLAKE2B 6d0322f5a664b37b021c6086341662c75462c44c0086e748275ad40b742baf80206878b392f2a4277c76c97d10658e5a812e6a62f33af2982764df07db1f3d22 SHA512 052c3680259e49b8b80a4591334ccc94f98ac2970a1205195f97166a5aaff1f621c51537b18bcc8164e22bdb8cc91935f987e90db41daa018b6c2d6bb899ecbf
+DIST firefox-151.0-son.xpi 275712 BLAKE2B 94cf314f93f2104563929b7982ad68ade4c6af08669886121fd31b03b5696fe4e759720871c4b7025c0db446f94daf425ddcf8cae0852fa7abae80e580cf1dce SHA512 6c728c472f90bd905abe99e7629f4dfcb6ab563c49f00ca0fd1ad8ec41fd79152f13a10c03476a30e862ffd2199f9cdd250146c616e46e87a6687d9cd404f158
+DIST firefox-151.0-sq.xpi 492979 BLAKE2B faf579d3514f6fb6373ca41f590e6ff54d43f39b1cef8105edf6d4e8b829f02f75d9f0f826d3ccdf6f0cd6d11f3b93d8f98e5e5c2c4f58730de76ccca6c0d76d SHA512 e1e769a6c8b6794c6b914e2d0de5ae53539673383e08592d86787c599d0ea04db282d27d3bd59cc84a734874bc9b858c6e7523e1585e00f95f0b669ca2c20ffc
+DIST firefox-151.0-sr.xpi 546266 BLAKE2B 922a0ac5edfa8bdb280a2097a8bc8cb3a27ba7e56d990ffa964adae8aaf9053d3fba163d8cff8bdc071cc689cbcbc4422310d378ade6deabd3322724f5ddb3a8 SHA512 8bb5d5b3b2785f4e115eb914813acabb788c6ef4c5af6c83cad7941f7d454423a5922b6dafb07a83d16d8efcd54c7502d708f37491dfb624c987b280faca6e23
+DIST firefox-151.0-sv-SE.xpi 475545 BLAKE2B e29e21ff32be585570b473a51cdf35b6d8410b374ca77bfa73715e56c177c91b4eb20a8649685b324ca2fe238784df2a32abb4eb23bb603ecbae1b330193c6c4 SHA512 29e6418befc941b81cedba44816aa660b3fb08c89fe28c96a5c04154cee293f000b1a708d032312a9d01391478c799fb6c1d7d705b428e22a8bc721bdd295810
+DIST firefox-151.0-ta.xpi 338986 BLAKE2B de64cb0942cdcc0cbe19f42a61bfa614284795a37c9d9f692e032bced4a695e840fe86a9ef5907015a4ee3d7faaa2a4640564012f8d1d675df26b6c5cf9eedd2 SHA512 658c03fe9f11acea67d6d786646770ce4e8e168bc1c88c1bd1491dc1a80f897ba08e6352cda02a73dabd504e131c31635a9fc2564c885b2069799a4c75b1a762
+DIST firefox-151.0-te.xpi 388963 BLAKE2B 88dfd0f1d292e9572645db3e5bedb1800db5845389d7332011c468c74507f79da6c295e19a3547a2ea0cb0a5f7355bb4f387cada38b08e692bb34a23b2d68993 SHA512 f7e626bf1a6087058c5124c5464af394bd6393d7a5e8d37e8cc13d0c2ae05e85fccf1ad59b6eda97bb40321a5f6293c2cef7452dd5bb19c4981018d293805eea
+DIST firefox-151.0-th.xpi 551991 BLAKE2B bf5ea2f19784f60cc90550469edd55eb3a4b4e81c788a4a4e64a8eff42d87e342eecf991cc29854ab2997ba928b320bdc80af8e20ceb536e235418323cde0b4f SHA512 ca4b08f763529182c7a237cfd4f7e127f7f4d0c69d8d9ec7173c47c87fe7827b239aa1ed4deecb64974208171d5359cc8f6eb69ed892e1b09d8358177f1bc14b
+DIST firefox-151.0-tl.xpi 356559 BLAKE2B 15f69c5384df68a47109396d93889df4f01cb82c56a5d4b09648b31998239acf62a2b4ad05a7ffee71dba5610eb7bc2427f3c6212e8db6b272b3fd65e7f0b66e SHA512 e07520f4b3755918e031fc392e633623dc6116893998ae8d137e5ccab325ed17b28da0321007885cc6056711b6994a31f9f171196255bd9fb311df8c3be5aba9
+DIST firefox-151.0-tr.xpi 490087 BLAKE2B c6a1e6cf1f0b0f436ece92d463b0aaaaa1d5f2b1e22453f21ac3a96a424b545e354dab62c437a8ac292054ed1a045130dfccec383692e7fcd25bc2dd1e146e83 SHA512 ac34006fe7d3a23cd1d3c91990f9b6af5de33857969db12baedac412286e9959522467d9c67f53803ebcbcf3e1df9af34b05bbfb35c0e26683f4b28b58a74ffe
+DIST firefox-151.0-trs.xpi 325400 BLAKE2B 76c323c1d2f021c4515529bc444290029ff3fafb1399caae1c14164f88db01a21490ec1fcbfc92fe0a0e175c312d149b466c87aa3c59d0e802b3ec80c17471c7 SHA512 294bba2f48b6d3d6b06330a2b6c29f5f79b82021b6f95fe1768079dfb886f8db57fcde5b9b60834644300fd4dce1398ddb1509f9bacd0476449c46ae1b60f5c2
+DIST firefox-151.0-uk.xpi 548809 BLAKE2B c8347fb62232c6b1012fe0cd686868de3257a234c6ff49bb9454cf2686a4e9ebf10db44fbd9ec7006aa765a6d0e845eba79cb86de4a2b657b332eaef35b62c5c SHA512 81d707a9b356602f79cee143463fe5315562525100c33c3ed7e521524a08e8f8c8dbede3dfd6367416f88eb72235d4c117cc2afa12fb9ad346eea92e4b03e310
+DIST firefox-151.0-ur.xpi 371235 BLAKE2B a6f85848342d868bf9561e48870dda33b3289f2107f92f4db0bcbac4e5d06e075df2c7568524d58059a3294a06920b8694c4495e083137db53398eee703ba9c1 SHA512 9d2c0252728d4e66b5d340fc8a031103b23b6de106731c9e94cdb05d994b30e2a4a9636a51f5cf5c52dfe3ffdc6731733aebd7a216fe7f8c2d8ffef7f5e94898
+DIST firefox-151.0-uz.xpi 305669 BLAKE2B 02a02d6608130e6cb9ac0d9e0f926ce29844c6fd2533836a97bf22b1fb859e500c1f750bc62da311a531411ca0d193f2e8357db65d5f84d25dd56fa4c9b8e40c SHA512 82bfb7e0c49aea9302f6d0244a1b1517d86bc6b3ce114a1bbc1a31ee462eaf7423fd2910cedb21ebe32e7e35a073505017bbe2a53cd9d46f05c1af9c5a967c72
+DIST firefox-151.0-vi.xpi 510960 BLAKE2B 181d9ac9d887724cfdf3a3280855e5886563793f893ee4acc03a20056698c667d834cde83be36c251257feb90116c2d08478242ae947659789448bf08c631cde SHA512 0cfbe12eea9a586a708028352041e96cf07cd5f907b63fa509c0293426bca413e149b6dfb6e6f8996f66f70dfdc01a1db6c59d6bc3aae1fece3e3bf9e5b7c118
+DIST firefox-151.0-xh.xpi 275258 BLAKE2B 9e263173a1bab242e1c5c2782aeaef3af2b8a959a30b1a1e123d4ae3703a2ea45397b5dd469e2049b46fd1f7de67ceb3cca4eda238bd9a96700c7a34189e5335 SHA512 2ab892dc97ce3dc8425d74e88a88a5f75dfde9ab0331d5e69ef770179cdca143c58ddcf0cabaca7f7a2daba44d7f13bf1f392a6acc03a0d6f44b97842e2a326f
+DIST firefox-151.0-zh-CN.xpi 501446 BLAKE2B 690f31eebac337137d930c78c101ca25feeaeb1e28afe5bb5d9faebabbbba01fbc6f4352f1d4a41b6a71a4f0f003a7c7e8bb6a3883504ce5e17a98dc226dc5f9 SHA512 4269fd9712ba4b81f9c1b4b7ebe1233709e1f7a32da5a74a7477e625e6803a931efde238f7d0350b9ff550cd1add917f3b61319724e05235a4810cd02d8765c5
+DIST firefox-151.0-zh-TW.xpi 505503 BLAKE2B d3641c246715850153f985a2008fe0f671d1b11f28070c706576b6e129f4db5a7293c693e027027e690cd307b44350bcc204ffe19ddd77cf41db76b0e14a69d5 SHA512 2e9648e41626ea3aba89dc5bc5e8479ee809d47e71a710693883c27b375675206ddd78ad5a557c8bd9a21b150167fd4eeb208f70d7c6cae3a3f910c1c57b5471
+DIST firefox-151.0.1-ach.xpi 295670 BLAKE2B b98dfa3301b672991c87da44e1f659a1e8cdae965f5b6e96fac6ec07d9040a4aa9e2c549fae4b5d2d534b77ec0d1bcac2e7540dfbc8a71ad90ccba71599287f7 SHA512 f81fcbae0d47e724f9d9da4700e6c10c3a40d542a9bdad478c3138895d9b8b0af5728cad26a05b6e96fa04b3b560c8aa53772b0123f16bb6b58fab4fbb88c880
+DIST firefox-151.0.1-af.xpi 269174 BLAKE2B 420af387a4c6d34f02d2e723d14d418335032b6fe6c0e23e1762c13499c2a97c8f05ef4f79b0d7baf6e703aef85414b3c446afd83db6928e5e62e21119c22574 SHA512 b83de033ca081b11ca10bcf1417857301d570bba512ae17aa2c5a68f2c9409141579ffafac7136c616cb2939c2b7e240515403d29839d006f86621bdc0666ea1
+DIST firefox-151.0.1-an.xpi 332702 BLAKE2B 24df5d6fd4ed7057cbaa5a8fe1f850c196c6699506bd11bfffa3973f3b877a8a07a5db875a20c414f4f9b0808c51908dc9db665c381f0000d5ae99403eca353c SHA512 46430002db901ec900e4b7055b4ac7ecd4dc8e0dd8b8d54193a77b8a6002cfe9b37c1abd67d0d422bc119bb3b6c0b5c982589a665ed544b086f96f982e1f0235
+DIST firefox-151.0.1-ar.xpi 505009 BLAKE2B acb0cd9442f98c24377e39bd7e90f7555a2e9148e5597d6a64bf44e65580bf3f3e63f353035df2c677ad17a909a5314d114ccd0d63732c361474263c466439af SHA512 1da4ebcfeb3ac045c1e9548b3a718719db4d51d453bf47ca46f181d851c1f33c0aa3b99088785ad7c00eb86e85ba4b1e8d073c2cd63f66a976b9785801431d9f
+DIST firefox-151.0.1-ast.xpi 313604 BLAKE2B abdf0dbfa7a6ff4cd35f3dd5700cce55ea7c672765c5ce5010a1c143631ec34742d4b936cd62081010c76e48ba36b816d5fc04783f2bd2b9a7129864bc1f6772 SHA512 ae33f25cc9099179bd27f4b5c8649b0a14afc3172e44e37431033c43543bf631df7ceb144550fb189921b483a08fef5541e3fbcda346a30001decaf89007f8db
+DIST firefox-151.0.1-az.xpi 319355 BLAKE2B 6527ca0cca78b78e3507ff064c42a59747326cd4b4b6a47fa5c2f3a0e6148f58afc146f7568e6501e22333ac520757acba95c222d8d2b7fb1e374cd3a3bb08dd SHA512 c8b19b0caa7aca03c894752996bc21ba590646f07c690d3721ffcd7bfa5cd2592848d5fd33cf3f2be7788e21c241fe3ec27278f39581ff7d263a35a292c6f0fa
+DIST firefox-151.0.1-be.xpi 571028 BLAKE2B b9a212c6941bdec56359ecfd9dd13efb6198807f094cb9ff77a69193c52083917dd50a711d0454c126107e53c82632f3c8411cd50a1a08cfd38a1450e7890ee9 SHA512 ac5ed63f73887f30c2d3477e28b97d2c8b2f9d1ac7cc1916ecf5c3178bcfca119fbb763e547cccb938c61fbd320db0395f9b8194eb474f525bfd2d5cbba0c68a
+DIST firefox-151.0.1-bg.xpi 462404 BLAKE2B 398e083ab27c012dc72a9377104aa8cf8156066fbcd478201fa24c03c1f6c7788f4fe7be4d727a261cd0648b92a9c348778e1419aef08ef6e89b757057c312e3 SHA512 b2314f2112e79b3ac42c383cfae57c119f6f5295fffb59116b0416b170a7030f3e40d57328cacf637769b77317dbc769c22bcf089d15427cc3131267375ced8d
+DIST firefox-151.0.1-bn.xpi 413291 BLAKE2B da98a4319cf532e833afcebdb964805c2526f5e3bf146d92cb2dadb59bab22f08a1c888b508b133e4f67008dbebcd35437d8ea59f463d223a0e2a8116294d43a SHA512 27a06b94fe24c7d6e8e0a4c829cd9625bf07ef37e87aa74d2e2b6ff8a65b1f4e1cf187a7dcdd8ab73c9d710b924ca2482227d6401ee39a04c383d781986b7d31
+DIST firefox-151.0.1-br.xpi 395102 BLAKE2B b66264705713f4e31bd62fef7e7c19d2afc034a65ff9d8e3a52db34a9cffca82ea0a645b994ac0164f8dfdd8e565939c7268a1d67f5fa2cab1de4e67ed1281c9 SHA512 f2331711c6c7595c82d6fc392e578b42ad738f9114ceb149e4895b78e5182ce2581c0ca945fb237dbb9e0b39dad80942793ece8c33e2e46542979b60fd6e8862
+DIST firefox-151.0.1-bs.xpi 449903 BLAKE2B e4da532b65e44b01401279d8b87210262799262285b5b1b7e1b01bdb24eb147e1d7bf3fe4c546acef9d549ea392096e0b7ef5e454de8b4787788093ac9b965fa SHA512 d75006adae884e438f8ced5f9edefd92b43f3bb67c672a113f8dbd8ac0831866d6b72bf2e1dcc2cb08a93af07c7dddd559ff69acfb3821605e122b3a850fe90e
+DIST firefox-151.0.1-ca-valencia.xpi 358948 BLAKE2B b72d6983532b966a0229a81fc69426100dccde25f8101789c5ae6183a411f8e5c5351966aff9bed9b4a1442442525b4224096e339de4a9c87bf81b056fb8bb2f SHA512 70e7bb433cfa07399fd9cc3db97a353314762e73c7cfe970c6de1c7c6602ab1536f3e7cf391e87b13f3c3eaa92664134ccfd7c3f489eb0e5d2f69d28b16e7ce0
+DIST firefox-151.0.1-ca.xpi 429800 BLAKE2B df9d0f9a5f42eb584a819d74dd76c7156a331a82187047d86dae7a4f60f47066bc6504db910d7f599afa07dbd7e2f8d4611e5e6be9ab87ed2646f72e0a211421 SHA512 f9a7046410d2186feee45f64127e281fdcb9559f874b6891a6e8541758f9729948a305031089d0494f9ede3fdf04f397e1f6861230bc214cc294bd437d11ec3a
+DIST firefox-151.0.1-cak.xpi 390396 BLAKE2B 38f3d7050c8ebef26a2bd6a509b5a7370e2ebc1b95e5e7a43601c3c4947b7cae3417390347ed1eb2355b40b9499c69d2dfba33bbf8b11a531c55f99b57bb7642 SHA512 c08cdde884ca62b6e83882469d81919d93392904e5184856aee2489c2bad9530e6fbdec29937c43468374979167d46ccd77f7c16645ba45c26a3b4c21a0580f2
+DIST firefox-151.0.1-cs.xpi 522054 BLAKE2B fdb0d1519254a7915e91788d781741720013c48fff295362864053acfca8f52445c7c2c220d3e2017d9d367d3d87fc06cff407bf86ccc5c8e0e0c62ae7cb0942 SHA512 6edd054b1287f2666852796a94623e2331c1fe2cff1e46fa2469e8cadc7ef0e8da47779cd693e3fb16a2cdb1151d172f0395d44ff5f91d4667b2dd3cfbc109eb
+DIST firefox-151.0.1-cy.xpi 483494 BLAKE2B 1986ac1897ee6ed5fdf786e60e139512956ba810ac3d4beff601eb96fb59249eda02e9b5aa823d9f58f652c3a4ce48a0ec71f92736668108e1ed2dc079ef97fd SHA512 4151054e527eeb976f710d5b86056bec548563347706334b80aa6754ea1411f4223e5dd61514d3e405dad89ad375d063efaaea0864843702eb9bf93376e67cdc
+DIST firefox-151.0.1-da.xpi 464154 BLAKE2B 50a33aefff59c8700f364c43a317ff8bde4513154c2e9d0b04445330a69da92361664be2e15ab6546c526356e847576acce33df0b5c7198ce6cb47220f7841b0 SHA512 aa285987479efd258d4fe06432b673dbdf0e9187167152efddc4e033df8812fc967e6acd91df12278c6616416bf4cd3f83062261c45a18a0fe85b783c9467a51
+DIST firefox-151.0.1-de.xpi 494915 BLAKE2B 0351ab758e62af311983d06c2bf296774cda142b5a004cc16475e6552cd361f21e62745d1e46242dbddc4bcdaad582273a5855c53a4cb98599a8f32935c40606 SHA512 f064525ca5d85327bc00eff47ae7360dbc6094388f0b6adf6992d5bd1f9f2fb51b840563b28dd33c9786dabead307940ae7a324ee2c5c761e68c52e35669db40
+DIST firefox-151.0.1-dsb.xpi 508871 BLAKE2B 0476a24b73b1e46a39aa36f1723030095dc38c99246e48ea2763cd1013deefd5aeff4520b3e870f32d31fd114809e6a495742b87ddaf4a8b0179d91d00423b48 SHA512 8650c8b3619ae3f401917d2591e94c919e6a2517a53fa2cea005f4afeac8bacae6746ecbaf34a6c9308a2d453d91a5b2ac495a5ba4781edbf91bc70465b4634a
+DIST firefox-151.0.1-el.xpi 586685 BLAKE2B df1de3539ae37428a9c0dcd05e41b82908284f1ab1cb46d261a00d0bb23eb3f2b4119e02f5bfddaead290c95ad139d0ea785fc7afb9a891474c0fd28f5cd2434 SHA512 9572349b9c2cb1b9b5df8ea003cfc27c95e59a7158c37956222b9d42add54194dc88695a05944bce0874b202d65207efc0a8ae96b6a38179c693b69a7e721bc0
+DIST firefox-151.0.1-en-CA.xpi 447417 BLAKE2B 390bb062f2ab49630ae45f3678244e4fab62bb6f993fcf031e54d762183ec93203d79e5a0df429b350d494c5addcacc791022d6b83ad60704993c8920b277af9 SHA512 59913e89262448454d9be2332bdfb68b97d9796bea9f4d68bae2a5b8e3c157940e46dca6acc247952e1f34f5e239cce35202b98c061618bdde2568188f5d80f0
+DIST firefox-151.0.1-en-GB.xpi 447723 BLAKE2B 40b007547f2957763e54a6fa2d8069bc0840d79b3826c2c48906b7c117a3ce4f8cb6f6c9064f489c8a6f05da84f98b9ab2faed14c98a9397987c20355afad6a6 SHA512 035c8cabaf61046540efdf60ed36f84e65be29f4e90454b0d3468db0fb4f49fe614cd5400b0954e1f523dfbdac2fdeee0093c1bad4846c6f528253d39bb878dd
+DIST firefox-151.0.1-eo.xpi 473061 BLAKE2B 4263b8b3bf133539d3ebaa32298c8143f4df0c40c0a6a05aa0c3e7683686f5c1955f3c475c21b62de8d834259d203497c5ec083549a4f646d89eef2af39a73e9 SHA512 c02b939e56a56d718502b83c678b4d29691173bb6be8a2e27f627add1a5778bfda1c42d960bc7d3d09188bd78b810093c8a36983de0eaf1c3c64df690d112a90
+DIST firefox-151.0.1-es-AR.xpi 485597 BLAKE2B 6bf5795f3706cf8f6fb0a4aacbddf51b45f2ee33e0378cba021b2c89e051cfd3240729e5dac64c91d04e9d49a173885629fc94bf0331f20c7e5c080d93a11f86 SHA512 bb6e452de3a8b60063fbb6c2090bb2bae89176b58eea7ee0d3404cb0b76b6e0e6c834972e6e21cadcf62aac34b0ce6111c321b9fd60488023bfa7c25a948f66a
+DIST firefox-151.0.1-es-CL.xpi 487114 BLAKE2B 6c24ad4dfc55cda8861ac48cdbeb7efe20ef424ddcd031191e1c4c96a33e24840d869a3eaaf134a6a29d9771d674475cdb07f69d960869a1a7a1a039d29d18b2 SHA512 fb3c21d9b645d970a9f5a2f14853f3a5fdd84b888fd728d228264bdb1329f540d7217873b3c9ebb1d708e5f7fae783b21f2f6b938a057b2d5abb493d2da94208
+DIST firefox-151.0.1-es-ES.xpi 488008 BLAKE2B f90d90be3d3101a5ac49825bb1a8dd82394b8f0d241e75be3afad7d8f903621a78c02a053000310ad0f3de3f3ea854d0308e48d5dfbf1deaa16efd69a40e9279 SHA512 02365fe94986b26f9d7aa13cf5de42a8c4c29ecea29d55084b4fd29769d1cfae5ced369939e9c99c2a47df69748aa8bf248ee07ebf55a9129cc5b97aa41cfe20
+DIST firefox-151.0.1-es-MX.xpi 490727 BLAKE2B aefd7c050fdf1f561bf2e785f2e836092ca59d1f006d12b9fc2f6e1e421ab2e80fe2d8f32bcd2dba62fbd17d6cb1fb603588716b8e16ca27222446ecfcd4f560 SHA512 b76e433a967ac7a80155ea854890d4fa076331a8d1a874cb84e2920bf0e9041819c8a17408233294efab7e2b27162f94a4d65a503ce0a931c10c8c668b6f0258
+DIST firefox-151.0.1-et.xpi 359458 BLAKE2B 238b2ddb1bb47e40fa4940b3e55f1f54bf763585ba3dfda32c422cd0811334f5372a43a6b9a3f344bbc50afdef30a8ab9b9bb9067106ec66851ce77c37a1ea02 SHA512 a24cfa8e33f399ead5b7d6b9501cdcc042a321e7da95114749907b3f3de886369e4054bb6310e4374a74ea642b1448ed44654e1d9b91cf660c16b5d67d253724
+DIST firefox-151.0.1-eu.xpi 472418 BLAKE2B ebe85bcf87b404b6a06713f5e57f05615e728f2f8c819da141bc271fed9a42b8005fcd7beadcb65bb142bf8139b34969ce2a639d5a068d71db51c142beff1042 SHA512 07144af2a78aaa756052c9e9cfad7672f0d71439abf79c5d5997ebe4ea46db2dbf40a1b7560813c207776e11f2b9f60927b1b8a3feec800f36aa9e8119f986ca
+DIST firefox-151.0.1-fa.xpi 420522 BLAKE2B e971a5bb6d3cd00ac11c3776e3ea49f6c660a75ecdb86ad295927367cc7fc7a128bafeadab5e1b57385bf715cbec84167e3765466faa2b64de9d5e532ab2c3dd SHA512 70cf6aeb0d82eb4621224e8eb397d0ba1fa034123f229b9b64d664213c999ff26f7ba520cc01a11a86d5563344b9bde87acc31c26a5bf8cef7b8304026440390
+DIST firefox-151.0.1-ff.xpi 311032 BLAKE2B a86925eed9933c49c632ba3cc7dad115ec3ffc86b5cf8dc9b89cbcd3d7111ca3b30fb5508c35f7b944de86649d0530a1f3592f5d344f1c534e426878483a7bbb SHA512 09bfeae00eea1f22b45b7119f6113fc4543ff894187a7370230e76ca0a5636b1b85e6a6963421be3dea450ee3e95fd11ebe28f2084c9fa115dd63083ebed7d70
+DIST firefox-151.0.1-fi.xpi 470440 BLAKE2B 2028491b88e5b8a42427f4fc221644d4a4425d3dc81180508694fe4f374f326f7d5f5dfb4138ecbb8c2778ff74ed2de1a62411152ca13899eb7151424b27182e SHA512 75414ba27def6d3d99989a0a0d2c788f492168041085cfab287d2267a5bc0ac5510d5ee5351c6defdadf5a3a073555c125b7483f71777d7b54b15828d00d0660
+DIST firefox-151.0.1-fr.xpi 500642 BLAKE2B cfa612cefdcbee7f0e5bbeaca82ac551487186c30602effcd74ca16007386fa2f722cb537db7f98c9252d2753b2f6fefcd39b9226f35e7553f67a1d530696919 SHA512 065529057251a7594fbc9d9d4b6c427a324c693b4040676b0d85e0fc2e77bc1b6184a624ad46c5fb28ffaaf0b0d8cbd09ba36547031647584262c51812c96915
+DIST firefox-151.0.1-fy-NL.xpi 482258 BLAKE2B 6b1e3730664cce96ace8ba7368cf09517ae313f0d0b200525a5a95379b1dd022da9a5abb88d45ea6d5e1abbe3810602015cb77213b9bcbc5accee9ef74780c39 SHA512 1aaa51cd94e0ab3574216f7ace05e460534a5866b4c04af247b08129a8f12db6ef3a8e1ec7d0d421d29763b2a5b10928ee429fa3e07d47d02222610dce8fae2c
+DIST firefox-151.0.1-ga-IE.xpi 316679 BLAKE2B 225716dd08bfc7f5c06f0efd137d3da8553e636a60ab513cbd5da03705e0bd3efb7f26df407d6b17e48f8f25ac4ad706a9ec066a85fc9f7ad47b1367cfd90a1c SHA512 c090bc184a2e0965e2abc47003aca2bfc42dc064a7a1d06818aca883a1b8f77a0ba288a64157eb777bb2e1d7714b06b79e9b2fdd073319454266e3d68c8a1ad3
+DIST firefox-151.0.1-gd.xpi 410055 BLAKE2B 1328ade245aa591484a0e72a6eecbe85a51cc85a83f069c5cc98b2939f98eec7a5925d0f8c76a30f2dc0e5563b9b3376f7037abc5cca2959e239e9a57b24cb41 SHA512 5accc309ccc59f7429d0763b8fc5efaa0b44827a395988e7fdd33605d3c00818d019ac39ded20a9229b3f7ef8c3b8df14923358d30d358f7da98b0ee68016c5d
+DIST firefox-151.0.1-gl.xpi 446647 BLAKE2B 8654314ab6f34d51055a06a94ff2f6c92dbca80b2c95569afd709ddebb56141ee3c9b6ac21d86034d5ba6a913467ea01a239e416e35b0b04dd2e8a1a4ff5fa6d SHA512 e26fe0af87484842de98937aea3e3e173d71227395ef7579b70e67abc74a06e1cfa903bbf27b846e36ecee3227f772b5a2a0125d3a6dbe1db12665940e9afb92
+DIST firefox-151.0.1-gn.xpi 490550 BLAKE2B 2e1b61153667a01edec84b69b35ead193a853ad00bedec7a7bff6a2e8362f8c5d0a309b31ddb473e1586455d8dc984e64396269f8675a5b39826380133ba71c1 SHA512 2a7230f894f240eb420c815724393a25c76bdffac44c137670de84b4bb751028677a532bde7928b3d86e3d197b682075f781c0ff4ed8ec744cb6e733605173ce
+DIST firefox-151.0.1-gu-IN.xpi 359213 BLAKE2B 685058a5965eb4c4cfacfd00e37c6f8ed37e5eca2d85cfbaa1a5ea850de4dc4a2cb03e40639615ef028dfc69c2b5f4f2c71085ffe939f4f733abdc6419f41f13 SHA512 613925bb45ffb61a18c1d353251f6b3ad39b72195a8031abba4cac51d5413fae2079a2f0c52c40b3b9f79582259fa8242c568a6a08d1718848ce581ebcd4a6bc
+DIST firefox-151.0.1-he.xpi 486345 BLAKE2B f73e0b9802bd1e126891643d09c4ac5c8eb9919534f715f8ad41bd581592fbb92a80aef3092891fbe02e9508cc712fefacba10e1c4a24d1e56a1df19fe3ca38f SHA512 530c01c3c9ecec4d6139d4003e91eb14c6950b01bb663509709aa3ad5718ef3b3070d51d2e9f745b07b52038ddc8d58399e70ead53ee898f65ce8131edde0e89
+DIST firefox-151.0.1-hi-IN.xpi 378098 BLAKE2B 6afab16190b2807890bbd5e67b20fcbfef1dec39fef9e966a1e504598ade1c9598ea2e5e792ecb63ef4d97a62aaa50ddec12ff173912b516a2977e35fe7a6a0d SHA512 13604e93179e7f922a04efb15f3cb763ded32b519ea330befe87455edb58ce424771568a72241b8ba49f7e181a22154248cc07ca332ed2419bc32152451cc827
+DIST firefox-151.0.1-hr.xpi 472568 BLAKE2B e13db2021d67ca8d8a44f59643648a802718707e5a30e7fbd417b24d739d164aea929bbbdd07699d22323ed1024ec35575ed78a546e4f8ac96e34fbff2b3d93e SHA512 79903fb55f8b35240b47adb98b7ecac6c2f2f3af653391d47ab8e7612e697d4d69f4373bfda8419e0d2db5b9cd9ec3e577dcd3b2b4e44681e34ffc0f925735d9
+DIST firefox-151.0.1-hsb.xpi 505523 BLAKE2B adeffcf8f74d9397e5680e0fb9c642a1e0f649d3460152ce8134d5ec231011c1d234fa7d16c1648ce61cf6de0a1a9959d7fe6cb708e3c3f558f15ca545fd6fd2 SHA512 7b8cf922fee363d2c1a6e47594466622c89e3405f33f552b7e966bea5570192137794660747e16cfc25ff43a765a5a2fa63e428de17144e94a63f3af4f6f2fb7
+DIST firefox-151.0.1-hu.xpi 509760 BLAKE2B fd3f8e154209cf77bed0501217eb8a79f5ca805779847e87436ce267ed5b1bb35d4c149c5466b48ea795ebb8374176fc9e06b36b5bbf3ce63325f1fdfb114bf9 SHA512 93bd5d3d5b51f7d829ac7ff73de493f7bdf7cc9859b6f14ec6f367c0b5be98915271933455b0b326893ce82accc9983710cd0500d9bb4a4b820ae1b3411c8a99
+DIST firefox-151.0.1-hy-AM.xpi 486946 BLAKE2B 6b37c5900658c1a1d1bb1138bf0660578fd1e6691b92f082a55ad386a81e5bf7030dd98177999115042e9baac757a6562f70ce9331284b88289c2ae3ec0be25c SHA512 8ea3512ad73a076ac49536a23e6b91bd9a8b3de4de894b2ac0849332a8dee852660f5f2261888f94d7b7a8cca9cfaf19d72ec6edd0e89a40ef2f075f5613405e
+DIST firefox-151.0.1-ia.xpi 469198 BLAKE2B f95ab0973394b9e32b1319292b8e35c49da8aa73ac29ee0530f2700762d60d58c0b32b1997e2f406eb775a2c990bf13ffc0749befce0056a8b5eb97da1714e43 SHA512 7b2c0c5348825042e29f929133bf590331524471551f8c9b6e20712b142ded7b83f2c0c845e113eb618875725d27cfaeecbfc4d12f99a1beefb6ed84ac0917fa
+DIST firefox-151.0.1-id.xpi 432658 BLAKE2B 921dc1d25b7e71c322bd3009dfc0c00b852c421b1c7cd9e037a3728cd703ff35a0e30c68fab53bd5296341ebb37d24293ce74d12123e405f45dbc02bb003efd4 SHA512 398b035dd3658a2859194ea6c4e707a0078a912e4fd93ae204f754ac969ab72338753862f5ff9ffa48675e6bddac275ad1600bbd38914f7e11cb6b3b30ff6743
+DIST firefox-151.0.1-is.xpi 440512 BLAKE2B e62f67b54b15b618dbec425769e9f7769c03c8ca8df88300dea448babf10e454f5fd0241237db1ac48d4ed7a8b5ede831b3961ed18589ec94f3c6f82171344d6 SHA512 7223d3756b926ad2b8e269eaefd3359cc35d4adaea3debd63a5c6c829accb98132ceec907aa69bbfc311aaeed6b6bdbe8458064de9f2052dbb38989527257aff
+DIST firefox-151.0.1-it.xpi 481179 BLAKE2B 8d17925374752b2a33946a79e63d19787a20448f0c355a1030bd59a8550854c9811930612a99c9b4255fac30b5b5654138ca6f3d77dfbf5c24a5f6bcf13b8928 SHA512 01642075f4c6c1498fef2558c263f2266a9b989d9fa5bfac11c0548138946b8442c58beafb15d0ae41af1850657f42165a6deaf8e8e88d0302caa15237da4be7
+DIST firefox-151.0.1-ja.xpi 524698 BLAKE2B e592a2ec5cf136a66750cf06e382e795d573947b5fef6160fa7cb2e03b408f7f6f523dfbcceac20fd2a091f94116b79f6a12ab2ed0c8d74a93dbd9d7831c2513 SHA512 ca7ee61ebaaefcfabff17571abb6dad42907b15e65d976e1eca7dc9515b5aa8c88e0377acfad4f8a49d5e0f612a522a6e465fcb237e95f04cae6ed53ca1c42c7
+DIST firefox-151.0.1-ka.xpi 543672 BLAKE2B 7b8b5a10aca0f222c54576235939f01d9222c815623b44b42d3a7738ef93d64bbd9378bdde37da8677db2abef2b06a951ed2161009f825b0387a9229e59da13e SHA512 8b9337751e9587913f50bb6eb368996258a843a69fc2be9da534789572882dbee6e1c302deab74db6faa0362ab0769ba39da695f767c57ab448767b38553b1f6
+DIST firefox-151.0.1-kab.xpi 426258 BLAKE2B 993bd494bb772950b37e21feeda405930d4cccd3b9f9be16bf1530304bbedd235066d5acea258532a906184f3a637678ee5e78aa99bfc2c23b189bb00414ea4c SHA512 79e958e30444956995f49d6cfa320523557ef46e160161501889210e3ee0d6a36a879f52355a7bb69de45f713fd6ce82d11ab94206e0d0f4cacd817061f7e9ff
+DIST firefox-151.0.1-kk.xpi 562331 BLAKE2B 2469126b10332e50bb03ac3502f8b4a0c66d97a1da1227b93728868ceef959387d7cbfc0cfedde1cea05a732f27c4258ae02d1541c965675d74cbf5569dbdb1d SHA512 c001f9ef0cada16f5c1bd992ebdb822ad9147640447bd14057cf33dc8caf8afbce5093715e117248194344bd7b72ca7d912de1a1b062e331a009c906a85dcc26
+DIST firefox-151.0.1-km.xpi 376360 BLAKE2B e1f9b0bc37fb521d91d6755d6206308f80914a9b3265d3eb6a0fad3347c50154725b71d23fc4c4d57887e802df9f7dea2af7d3b90c7ff27070230a3159c32e3d SHA512 4b085eaf79d336727a3ce1fd7201350ba4597f50ef6d9f1879351883784ff244f5d84ddee2d862bd4d5da9bc6901d1a253f44cce1511bda5d2cddef5df8d60d3
+DIST firefox-151.0.1-kn.xpi 333537 BLAKE2B 87a5acfb1c9b24eb03fc95aab958d956c5f1f485b20d593c453915a7599e6a5c063b1ea48ab4e52694f466fe3fe250f3cfaa757ccff36f35240f6487d5d0aeea SHA512 0ba54d8589b56010ab21c3214666cd2ef0cad8d6991edd4b2e8ea4b4d69913fc1de70f647b0c64c2103e0ec7d1bde3fa7cb61c748f1bf2bafc159f31617770f3
+DIST firefox-151.0.1-ko.xpi 509138 BLAKE2B 4143182f7b61ad12b8667bcfc904dda80bc1a68f231562d635e0889369ac399cc574bfa5c4a968c1ce2072e0cecde13199c705c0cdec2a5be197d9558b82d693 SHA512 0e683dfe3a5aa58dc278a781ce708379922b567181e44a63f9a5ffff10775651a790af0f4b0570f04bf9e0a11e7572e42a5c07193c4dad57e06983cbe15978b9
+DIST firefox-151.0.1-lij.xpi 320392 BLAKE2B 8fd3e1ed8effd62ec5c74503e5045fa7ecaf3bba7632164f478b6f01c490efec1fbc07ae57ab6bd1da526bfc1b7a78e57cb471b2da01efc8baaf8d4032067146 SHA512 fe8a0348c94b7fa0c3377b1e79b0b36fa6c6abd4d57d74bfb3a4727a8d9f5f224f9bc6013987c426e458b56501aed92a7f9dc216ae12b13b354e33fc896b9b0a
+DIST firefox-151.0.1-lt.xpi 380206 BLAKE2B 9e11e8f522d5ee7e34e9f412abaaef7607228a3c7cf8923565562df9e2d2a52c150eafe3106d8b5ab2bcedf4a1af9009ba5d6cd064cf6d1dc994f3086ee3ca02 SHA512 b38c0529492d36c1e9b3f853d5f9b1b7e7bbc3dcfeed919fd3ae27f843d8ab860f8be6226ed3a3861ecaf78e56deb666ca31a3375b956331aad483e9dbab3b0c
+DIST firefox-151.0.1-lv.xpi 391289 BLAKE2B 292a2f96c19bceeb7feadb8f6cd49d395c2909273e3522e645088e0a85d40a6c0a8494cf8df28021a147174a11ad473554777a645b4e3c94492854cc5f5367da SHA512 b74cad2ac0a1e880073e17d716144c8944c4b143c4d60aae50aa9b98d558f4f89bba7b5e577ddac95f5abc560896ce174bfa1d84316c62496ff1fe6968bdc832
+DIST firefox-151.0.1-mk.xpi 353111 BLAKE2B 303c79815701c53ec238fc528fee4f5a77a6e89bc1e5f1529df4321034b02cc9092752cf480fd2069a913cf095633f012255a85e10ba86c6faf3f1e2026f0728 SHA512 fc23a7b74726970700d83367e71094e4ec1da6b7d46038fe6cbba483acac708145553a7a842a7a0496b15ad04d648a629428e55b777e1538ab1efb24ed491d90
+DIST firefox-151.0.1-mr.xpi 357104 BLAKE2B f6ef89f659db6e62a8aa6389bbdf8644fae31ad4bf9dfa40795d8cfbedbd761aa2a921d1bb618e38d72ab27adbc9cf7538e6c65f2d4e13c62d8abda02d216c77 SHA512 c243f714650335c57153ff4e7b86f02b366347c1093bb07720c8215a31075f3cc497188ef31457389b1da35537977fa11526c3de4fd306cff160345df2c5d178
+DIST firefox-151.0.1-ms.xpi 296903 BLAKE2B caf1fb34296c5913c8981c8e24139b8c1d6acd85dbe394fe7fe5106673bb57d018cee58cef4c6bfdbbbd0b90c9450840cfd24e8858a7dad722aec170d9fa9a30 SHA512 60ff24e18480593f5edd8d121d445ebee85451f65b5dcb64e04010f10fd22d8ed65387f5c585b5665851ed64f116b884b6ff9acc514b1cc322b43dfe28cdcb1d
+DIST firefox-151.0.1-my.xpi 344105 BLAKE2B f7ae98be5cdf37d1daef6e118668f296e78d3d717961af6abba09176a54e032c0f9395aaf762dca71e6ad3d8a944d5bf5216921f01773441f05854f45830caf0 SHA512 2dcd09812e9a7fbdb872600d60ecc92cbe2fed5daf1dbf00acc38fb9ee107176f40bcf224bceb1f0ff7265a03ef8d92dcf33c3016fd86876a9235aebde6344c7
+DIST firefox-151.0.1-nb-NO.xpi 468217 BLAKE2B 211a8691136f6c35571e17400791621af8171ced28a7ae3eff290fdbc39c3c396464b53e53a8accaae410975d74fc5ec53763637ee6a6d97faafeae1a9350665 SHA512 79e8baf918a1f3e81918d7e905b2c74581737818ef88372d3c22739c89fbedc59f6bbb87a261ca85c6fc968d86bacde638ad3632afa845eeb4901fc5f96bb465
+DIST firefox-151.0.1-ne-NP.xpi 349215 BLAKE2B 5655a5ab82a3d4da20affcc2565dbc474f859222ab0edd32c0e03f797943d6ecd7666dbc64202652a38d675926da64457ca4422bc463bd2e0d6e75c190f68276 SHA512 1022dd98b2c2e69beaeb464ed79e7ea0af1741453ccd266e028934eb731a071fed8c168cca529652c51eedf783f8aec8bcc079a53cf4c7a08d59363bfe7ceb33
+DIST firefox-151.0.1-nl.xpi 475886 BLAKE2B 0ceb2bda560f0f040c4fab2750c23b29bcae691ec4fd7640f4ee358babd94b002312e346233aec4664d4c1ce0ea7abad3a7e525c62bf3ae74121f57d0a053ed1 SHA512 0761204a3aba954376c76f7e35fe28115122a33c8d7a0a27a10bb14560477a5a68b16b6b41468b73b056a7c186b9687d65f6de53fe6a0e90fe01588dae6bb929
+DIST firefox-151.0.1-nn-NO.xpi 471574 BLAKE2B 0b7e22d107b33d079fc44924efe130c553f3d70e156620d87323c07c59417e3753bb9e57a5b2b08bf7b96c26710baad8b766bbbb814c07e1e4e86388f2ddd840 SHA512 13f45f25af09228cc49733501c94d3362f9d429f36900786dcca6d1408b754498f1dbe7a61bde51345514dc3a222705429285bf17112a4616e90b477a178900a
+DIST firefox-151.0.1-oc.xpi 414858 BLAKE2B 363550935432804dd6dfa21223fff4f0b483858d39e50ac50fe99cc9966ae2ff942e73fe34928a8a71b5987b0fa6047c4f5232e8580c70b7bbd5f45e0120687e SHA512 9f59c1b40f9566d0ce818242ccc578eaded102f0aa58b6f9ba92dd4d625cc9432f792a664cae001d673212c2a9243bccc1084ff586359c1e66e292225f16fe01
+DIST firefox-151.0.1-pa-IN.xpi 542013 BLAKE2B 9c6d5349b7315030cb381e6a7f7cdd81d214c8c9680ef34a6cec12f5aa2092555a57f1f40b497063e0f83dd83e4ef7883ec1586b251aeecd1bfedc32dbcde03d SHA512 bb6849ae6fbb8b8bb0dbd5d712a1e891d7669109af83fe2a3fc168e6b81c1bed1b2b1b4e02ddb71bbe3f78e9d9f5938fc5ad84f2329ef7a3ddd25681d110819b
+DIST firefox-151.0.1-pl.xpi 506672 BLAKE2B 28b306085dadbbea7bc8b61839bd64037ccf577c7f2884a69a500f150005a405268de039ec6edfaf817cc524ba0b6aa7dbbe7d16fb32f8dba23221eff9f1b3d0 SHA512 ea680c690dee9cdc63fde8d7d509825ef7027e700b54ddace4aaf64ab0d3219f0f11957d8fb4be387d13baba1cad05a557ed88b99abd08f71f0cf5d5ed01e535
+DIST firefox-151.0.1-pt-BR.xpi 480576 BLAKE2B 35803eee114ae90c57eda9157012cbfaf68f14598716884213528f31849f2fae8ff2bb656c492d10e56decc7cb6f9a6a8b3823a1d4cefc2d420fdcb09d526d7f SHA512 305326a18def69308173c8ad806443826cbbdaa97bd7bbf7cfb3321ceb14f41495ef1bee54792f8136660ff701121c23d24df9bcb3e2857068bda577ebc82ac8
+DIST firefox-151.0.1-pt-PT.xpi 487430 BLAKE2B feb1de2e29ba35adf6932536a938cb4b159dadd1131fc8d062be0ca69aa672486a6d12b259651382cf273f3cc6f626ee40e560f4ae62be1a7b912a50df126731 SHA512 e54a113a470f19975437172761a5681e62515c555520f7bd9098946decf4f90e651994383ffa4877885f9b3a2f1d0c365445b6acc2189a1d7a66d87f0914ddd0
+DIST firefox-151.0.1-rm.xpi 458391 BLAKE2B 5079129870743f0735be7a28bff41c192f59a34f7b7ae11214afbdb87a9157a0957e86532eb7c3fe8109f7f026d0dab77f367069adb607e89eb504c3b5d22aed SHA512 5187add80ee1f360b8fce28834700ffdef324f0c7a6d0b2f43f6a365dd5836eb4e4a1bb079effaa8ea92db8ebfc75b89d837b379b481b36e5301328bf26f1340
+DIST firefox-151.0.1-ro.xpi 494343 BLAKE2B 4e46a0ab942a374cd3c438f1f1b3fb6400e0f3934cf59650957aaa2f20b8f4dc09aa1996ea3f0e32419cf215907dfdd6f9bae18473cb495a674204a687202185 SHA512 fc2be896132bb8fae31a640c60c82d56abf5434922e75f6894f1a51e5f66bb84a2357131665fd37fdb43bf1d8235ca028128ced2f0fb6e201b3584c0e8ad4f88
+DIST firefox-151.0.1-ru.xpi 574703 BLAKE2B 5326a5ce2d1662c67d9c07e4d98f8baa90e850fbe70cb9748a35f0a2f7f77cf5705550806c2cd7aca6c399b08388f8a377322e4c85f8664112c4216ea1dd059e SHA512 61a9f12163cf425f36a142af3f6add9cbfd6da2713c118c506111decf434ecedc21629415a50608eb7cef5531afa27b41490871fb4cb9ced550f3b23394787ff
+DIST firefox-151.0.1-sco.xpi 323584 BLAKE2B a1b7b43ec6801f427506f9bb6cf7684be64d07d52b2a12cd5effa40f74b35a7cf9fcfbb6ea2c8cc269eeb7a10b5880e440dcd4f268aa8a1b1edbf0ec32e38830 SHA512 a24485031193b5ec60ebf8d8355770cc32163d633b5d21fee8c9c48dcad7c15739632384dcc108eaa3fd09463fb0cfcb4fd404391fea1cb1117680b0bd06a0e6
+DIST firefox-151.0.1-si.xpi 409772 BLAKE2B c249b6013091e3cb8f483a19b34a8178bbb931ae144262f0fa63205644c0edffc646665890dc83f32a7ab3171d5b40e6b3a83a611687c26f9f10cada6f3c91a3 SHA512 451fea670838696a272d66eaf277e50ac3eabd63d6232443beb75ca77d1834a2b2e067ba965f288c9259c7b116456db13b544d0c8f80bd4c0a91f840e80f1a23
+DIST firefox-151.0.1-sk.xpi 512574 BLAKE2B 2ed94fcb548c9db7f2b951c5af788b83a6db3d29ea6b5b921b65649923c1ac10ed35239dfcb58e6efd25851d2d39e6cb176308149b79478f548721b9a7ed8697 SHA512 eafedc3b55aacb132c4fb4906f1e8a417a62633e2eb02de3a85bf4908f1938c155a87d242505183cd41dfde0b6a7882714942785e842e9e8e40fbba05a0f7dd9
+DIST firefox-151.0.1-skr.xpi 484960 BLAKE2B cd83bc31ad25648ef2ddfc9c662a76fd981473db04c1165fecde1a83ff03f5d8230cc3fa056394cb206ded9b0e5bd733c0427fb2ebed344dd9fe4358856c1826 SHA512 5c26c2e6eae279ff14dc272a318fe0cc90329631c82f780be51740b057cdaf5958ddbbe7550001d39eda65ab013e5b6820238d79dd9342b1a541e980d333287e
+DIST firefox-151.0.1-sl.xpi 479139 BLAKE2B f7bbd3cfeef01a7a6479004b0731cd250e7a2543373caf105a7dd83d07431446af64018a7fa50d263a40787d04ccd4d24d2c5ccd12f48ec565316d6dd95ec9eb SHA512 6c46970b6a6d392c43dbbf8dc930aea829aad66f6455522b79c8556b5fd845a24a6d2e06bbb961040555ff1c7abf1f45e8c6a48748924a6959a37a807513220a
+DIST firefox-151.0.1-son.xpi 275710 BLAKE2B 23c8d30b716bea29486b16ffd9a8e2924d17b1df853b0d35c992f55c141f7e45b958c556e7ab0f1c99e9000893d6e4eabc3e0035e6d0c6014de0dbe095cecae1 SHA512 09bf595509e5630bff6a5e92c2546aed21526d48e17d662d1edc343cf6dc2ddfb2094553264a8ae69ed611a9c49b2d5a3a847e1bd225da059952c91ee2adf117
+DIST firefox-151.0.1-sq.xpi 492981 BLAKE2B 49371e415d5b258c74001313754140095a541c16b53f502c73dcee1a4aaff8352f21e110c4d45c59d132b0ce75be913db440354c0f42129c8f8ede06ebbf14c4 SHA512 645d9eb5da13a13046b9d9f2be6e673dfc4b2fbcdf4f8aa722bc4def97b37ee1e37c62a780a555d071760cadc0970d66703b10890d0be971f91976d48a3ca2d3
+DIST firefox-151.0.1-sr.xpi 546274 BLAKE2B 709b945b779f0ab93798fe59192318054ffbb368ee8fbe11f1e84f3bc0e73e308eb466d9004784e945b50f0975464d6e6b243bb7560b6586012b2b996ddfa668 SHA512 d958511b00dff7432fb5a87cfc7bb4bf4641c98ed3519058ed06d56f4836102bb77b7fffeedd59795c60ba5bd5292a437a29e95fec9b47d73b08ee39d1088b19
+DIST firefox-151.0.1-sv-SE.xpi 475546 BLAKE2B 900e2ab26965177759885cdaa3f0b5f3cb7c01d51fe229fc3bbd5a44fe56b916d32be02eae5fc99b0753177da2a88f7a7ce200aace3beef85732ae87150d5fbb SHA512 5a538185bd66757baaf0e68a4d8d35468830a0b28c61b8f022372beb170a0d6981ccd9e7ca1fef6a57f6ae2cbd8aaaffa6ba69cd18b03b3ae129bc2327abfb75
+DIST firefox-151.0.1-ta.xpi 338983 BLAKE2B 2d150b41270e2feb8bba9b4ab236d6330407fa243f4c7b8ec50e057fed3b58f5c801bc5506f035a76f6bca1e73d134de856feecff4bb4640b742982f5925b60b SHA512 5debf494ee8b8cc25d8b26ab73a25ea53413ba477038cc68439dc6b85099a3a6dabc461d77f1f150d564f2d63aa69a34bd50408b1b778018c16c7e39a20d2d01
+DIST firefox-151.0.1-te.xpi 388956 BLAKE2B 206462ed4d8cc1c0fda1c2bfdae3a0db8b8dfc1b187b92525e81db542303401526a5f92dc3a6915f3498e05fd0b7af8d3604e6071a41a775e083d887ed678a4b SHA512 a2587941954aa43d0188f1e12ae7fd78134aa84a27ae75ba84fe0811b33c602fb98ea36d8c2860c411c80b04fc09dcb3edfd1a835ed2df1b326a59734c70ccc4
+DIST firefox-151.0.1-th.xpi 552176 BLAKE2B cd4cef61389fad8d20bf8c883c574391c19f9c6a5bbcb738485a8a5bfe34961f91908f1cb7c80365038fc3c4487365970ecffd666650e09878299c8becbe2618 SHA512 b77352c4e71330b1a9b1b5764a6c684a1617e0ef90d9be211b45ee6b212aa4c77f579492c30279591fbd8c6bf186c27e154a8b8699838668099f10867ff28e30
+DIST firefox-151.0.1-tl.xpi 356559 BLAKE2B 96b9430cd197fd8ecf5ce77e6f2b747f1c10f67c4d4bc9d195497c37c56b2be9fc9be29f2eb9cd15017376880c17808573f4adadf089bfbf27396d54fe0cf0f5 SHA512 f2489849a973634e96cd95d3f5ff2ed495b8846972ac0f760cc6c9501b1eab4d9beab531039650716ec2fd66cecf01b852d4368645c68c0cff997fad4b4e408c
+DIST firefox-151.0.1-tr.xpi 490093 BLAKE2B 2cf66d8698c7df0d1565f30dd99de7f106e239fcd57228985f74790339f8e2b1c8ff9f140294fb022a0f8ea2b39e94dff84ee4af7ca4a6dcf3db92b666a2ca4c SHA512 16298b08506640123374398a7476087432fe2429f3cf806440f7ca5040fe5f272caeeb15f1ccc335078b713fb1996645487968384c209509dcdbeb3bcdf0b04d
+DIST firefox-151.0.1-trs.xpi 325412 BLAKE2B c2e517878c1c9cf0125f322c5ce3e336ed1e8fb535c4dc7e7c5e4916e82e28322b9026f76f8fdebfdb59e52c0e65737e93fe7810a7da017e5fffc8c422c8a159 SHA512 41f9fa085ebf6a601eeb50bdf682bf6ebb64c11af1becd4ab7cdf70ab411477078edbac0013ab45a16f7c513ab2bb79e36efe125204e6214c7d473d5beae94c1
+DIST firefox-151.0.1-uk.xpi 550584 BLAKE2B b9951840bc023615f9b43e2989f77239160395f7fdba648e345b1e3254b64801a42c3ad06851c9926d7b841c658ec5d030a8b7979fb0cbad08417dc8a8b2c5a4 SHA512 a308886b00b463100a5df25219ff0d7f6657a86608ca51b5263746a39486eec781296e5743c31c9b82c850b3665127835ac74caa6030d231f33bd00121289005
+DIST firefox-151.0.1-ur.xpi 371228 BLAKE2B 44c152d3d737c246e5ad1bcfb2ae909699a49e10fec8a43d1a1dac9bf30737c3fdca6661e7ee3b47f3303092300672b9afb5cf36be5538b2346495bf94ba4d94 SHA512 526e1787aa6f637ac6be32a6cb4a37ea0493dcce2a684ef027bbb0841b3ebfd3751d9ff05025d5bd5f52d5141ebdff812a18c7734e9245a7896b56be8160ba1c
+DIST firefox-151.0.1-uz.xpi 305666 BLAKE2B 172e0cc8386f75a6a9136d6f0c4b88dd68921de7922c587df19762438d0acbfadf7d04d4fa63db9d57c4441d8087ab2408f26b80e9c09a91a42f7306f4ff0be0 SHA512 602d03f56852db616a784329fc9a76576faaea7d4391914c18bc86e15317178dae6b45f0848936f98f72500ad8d48451513c7de61799d403775312ff6feacbb1
+DIST firefox-151.0.1-vi.xpi 511080 BLAKE2B f1f15826a3cd9c46c635036c398d19f2d527bce70292d549331583cd5c8d9f32364dc51996aca49b3265d1b505bc08b69bd7a03b0d4573a23bf5b473e0f8ad66 SHA512 469f218d6629b73aceb81fd17066729a3c6b5150748f0d49cdf381f67f2c91a3fda7d39a0784579534e50f70de70cf38d50b7881158a9b797f5dcf85520b864c
+DIST firefox-151.0.1-xh.xpi 275260 BLAKE2B 9012885bbfc3e6cdcd46bbe5eb1d7cd2f4bb1e10c2b9b9ea3342ef006bc60351db351750bf7c7a0857741591c5d6b1aa00d74ffaf6f6632b6c8ed37ffed08160 SHA512 b2b7a756c70d54aeca1665bd836436bff68333475840ecfe0b796547deb5c67e9948b98efcf0de93452280ee1d96b0900eeb26c2f4b6cf7f5b9b19d549bf089b
+DIST firefox-151.0.1-zh-CN.xpi 501447 BLAKE2B f18b602af6f73172e7ae6297e2662c74300f13e9aed39cc7196d8bf9111e85335ae2e68a2fc44ac5b97c646cb6291a53d766479b002cc99420ed1e10e61e9a56 SHA512 f98c3c28bed7460b72458f87f6face0875f3ca63be0259483d313713497f49cea1babbbe7d0c9bed006f345f44ee104150d44a7df9e0504954e3a1f2121141c8
+DIST firefox-151.0.1-zh-TW.xpi 505505 BLAKE2B 015f159e4d55cac7fbac2ad804477f7008b8fc86f7a707086ad359f7e140159404e47f2e1e162fd0748a2ddc7346eb16212d028d182804fa28a6cc7848b43e90 SHA512 abcb5ba9eb39e0581f6cde34345ee69e91fc519ea130ee63bd68c73722d782a603665649022f34a332e6383f27ef4814fe35b069e4f8fe1150418fc3b337719d
+DIST firefox-151.0.2-ach.xpi 295732 BLAKE2B 15148ecb6b193655ed071ba44d682a2dfa538c43641e4b60d25c88efdb43a8c72a02686239a76bca9490be8099df19aa7fd2d34306627d84a3e049d103aa823a SHA512 10c858bf1bbde8f0d6056914c78b995d4768a38308d87d7cb4a21b4cabc44864ba9e2fb86bea901be5ef84e929b7322c007e79a883cd71f528778b7d5e93e2ff
+DIST firefox-151.0.2-af.xpi 269246 BLAKE2B 814c9b986f02e27b6fe015ee8e50adcd17e36a9631bbc1f9e43ffd95d2303664d738069421c79175270cd02df20648cd075814470834e38db138ccec0964cba8 SHA512 505617b52e5c9d46f272ade716184c8bacd3dc2860e73b34e69a071f3799ae4cf7eb621957920220c87c38a3d61dab8f0e2853fb895bdef62ebf284a6b85debf
+DIST firefox-151.0.2-an.xpi 332755 BLAKE2B 9a6f186ee9768c575b30c7a5bda104d69899ae2e027fc187169b98290d49819e7d6f508280d10532e4e1129d0273bdb68d2edf88a2bfbbdc6197754225393f92 SHA512 72f9634dad5c2ce95b8aae2f813d1cc4fbc493cc2aa6a85d600a8a25ca2b715bb23e2151ac7decf958f9b1c3dfffdb5eaad61d4ec48fbb973b0bfd967ee8d754
+DIST firefox-151.0.2-ar.xpi 505070 BLAKE2B 7f83b97278f22afa5c7b42ca1052f07909028c36245c48b5154ebc466472aa555f47e9e2484671a3c648030757e167c24ead2292513c16b5de194e4030fed3bc SHA512 c81de4f62a04d66c8be8ae85454615d64b2bff3ba689dd65355b640afbefe3c63220a5a59ba82a3c0737f499c3db52917e0f360dbf963b9dce2b553647b8f203
+DIST firefox-151.0.2-ast.xpi 313667 BLAKE2B a4180633db22e1d3189154f10989501029124203cd964d549c6187196a075eae91408e1d422bbdf04a4a1eccf8a926605df187e157f6e10a0f016670814dfacf SHA512 9cf3baa5096c6d47cce8e92490067eff9f5d839c2396d27959d6087b3910a83a157f3167bd4ff87831129ac51fbdb07d3f6156b4095072f639a47b9665de44e2
+DIST firefox-151.0.2-az.xpi 319410 BLAKE2B f642277c91b5caae7c667392ed5d66c191017284e2c0f71a23e1ded63edfc804793e379a864c7bd9610237d5424d2a5ca1009f2754bc39d3b1163ab2c97f31a9 SHA512 fa38c27a572258721d0d8b1fac926ba571f65771d72099e4fed17003099bfa12c4c05899741760d42b72d3a3ab7725f5bc689125d9a6393f1dc868c6beca856b
+DIST firefox-151.0.2-be.xpi 571091 BLAKE2B 4e29bd8136b2c9a147a941e3112578f980be6d2423ad39503843e7b352b013592977218c293265ce896180a8c58a28d47c28d13804ae38e8bd96778b56c00e1b SHA512 6aba77235cade5eacf56dbda44e34d6eeee42995c5f98f932a887358b5d027736b8a554215f32481badb3afe877ecdd8c2ab2721f4f2db5fcfc80cbb249fa3f1
+DIST firefox-151.0.2-bg.xpi 462502 BLAKE2B f16cf9a4e1c893034c6dda46b886dc6b9ee3ad036ae6b95c35c41cd4c2106d1660f6ceae4ba3d17080e7797a5b3c1fbedad9bc104e2a0c49aca47298a46f7665 SHA512 675fc3906bc6c8a91af9570ab09e6025924abe0381ef9bbd4db2e40a0972ea841f2333f6e0385dac0b5157e3e2c2023d115ef9951f9f1460dcd7ddc296b2d71d
+DIST firefox-151.0.2-bn.xpi 413363 BLAKE2B 71bfb1aa196f2eedbc5a73c16b475e8c58b819f57373d8080568931f39e2b89d0840c482d711b2304d915038cdbf27caf51ffd474682587caa9a8a08b3b7b79a SHA512 17b8b82299bfc7f7a04d84860abfcd188b909dcd49af83cee33deb2027c8598c61058e99bfbb6a87e220aab561cbd60af0b3a28b372f38ee14c587431d1bc116
+DIST firefox-151.0.2-br.xpi 395342 BLAKE2B 49f539607c375b4e0637079967b1d08ee3d5127a816bc60fdaead2aaca881dc8d0383d6d6d9fa712b6a6d3751b173189d0fe1aa5a4d4247e063520a4af986f9a SHA512 a89511fd7dd77f1d5e30bd04107930b46237c3385339ac92fff88d383875a853edda451e32658eb4e2213f6606d206e107b46121869ca7dc0c2111bebb200266
+DIST firefox-151.0.2-bs.xpi 449968 BLAKE2B 0cc4b3aa2fed807afffc965931d1712f54884015b47f7ed87abc3b65cc1681c3659cc401092e5e50369dfd69f2b84816ad3e28530cc696a74f8bc083b5b80c62 SHA512 06f555dc4e22379f4f62bbe95b76bb37a6d3e1bbf26e29f5e1cedbec9b8ce49b6637b57fc98cd02f4a06469fd12908c47c1a2c13ab4a6b99339a887f25b84f17
+DIST firefox-151.0.2-ca-valencia.xpi 359019 BLAKE2B 15f109202a38805635ab6e8cb83fe5e8d0c5b9a2744db18af9b356f0c7681dd4e7985683976a942222130529e710591a3d58a40e44a22272eba28f810e6d70c6 SHA512 e670a7a61aabc9aba6208063ba045041522942b198e27a712bb5e36eff265d988fd5e314b18ceb260b44858fe1520f826f1ae0d5eba0b229b28a2cfced0adbd4
+DIST firefox-151.0.2-ca.xpi 430442 BLAKE2B be0a21baf34edf6b26e50763f5028dd7e29c62a2e67cdf3ff7e8668998f05f8e81576c886708615002b8f682a6fd4a508053863e9dd6b2d18c16dbde10bed6fd SHA512 6d32597ad3aa3e9df6e4247d1364b69684db362467f1fd6bbeb3df4a7efc1682eddf9cfb325c01d6a8e7ad184037eaec144b8f3a70e3a8d6a1f22834830af8fa
+DIST firefox-151.0.2-cak.xpi 390460 BLAKE2B 8e2b1268293f875fadb7e94e16fe70fa481802ee03f443d99393a8fb92c4c4c60926aa90b6647542598165f9cccb833f39e1c23d4b8ae53fd1cef7b71b9f2e4f SHA512 6a4b23a1eefa052eeb5ae45a4a94873e626dc02cb5d476602d33468f777ce6c7f5a6396a030890ee965d6cf5ecb11c2662c7905037be1adda8006ca9850a9d8e
+DIST firefox-151.0.2-cs.xpi 522131 BLAKE2B 04f13e9a91da886d6d0c75ca79591a417ad7762ebdbcd02b2378d40a4da4f6f52a80817149ff98e2fed00b2de7a225c02ee12e87a85bf5844b0b2f57f0f05c9a SHA512 46613661ed0091fe3595d5cca9800f566f5de43248e16600487b33a7c7c036d1307e1f0c2c8cdab1835a729d873acdd39c88de0bc614ebacce45c38abd4167d8
+DIST firefox-151.0.2-cy.xpi 483563 BLAKE2B 2c66ff88142a94d68299ac7893370bea3e76116faf22490f605450303d0c4311d4292bc7a0da0c67826ce7a22f238c798223472ad19e317de2f0ae0535e89196 SHA512 4a9d2cc024e3eb1c13c845cab7efbfb4d5cc67ffd50e0e6bea72e2b1976cc395b33ce9b26a9b2097cf70b5cb8743f818ad67f6b2cbf6e946cba8ade800040355
+DIST firefox-151.0.2-da.xpi 464215 BLAKE2B 6390578dce77cc076009b08d2a323cd2364009b5f2bba8013c04aa516c3651daabe8049d4e9e90894572ef6e0e21e51b995b1c41c7c4a7eb3937b28fd6cdaabb SHA512 9eab875e1b7a17508fe25571bba44cd7ebdb1ee60693dd47cdda0f5dd136a1c0bf9830909112f811f99f27d7372e47c9d1c43a9b41916da062a73fb7e5388e79
+DIST firefox-151.0.2-de.xpi 494991 BLAKE2B c4124452c332d192ef632a0aa577e159d66f1ed34802803ceecb8bb43f3f1499ff056852beaf072f06ffe56944eafeadde571c6622d23bfadc7ffa72da6aa780 SHA512 29763a2764319d848dd740558047b6a61660c58d41e40bf092fe280c40cc7f8599b33297cf03143b5aae830a5923f2737e5389f68bf9963caa16a27c2fc551b5
+DIST firefox-151.0.2-dsb.xpi 508929 BLAKE2B 0f05d22abc5886167ae2c3c21c6e780b0753edafbe713f18532dd85418693e5166a843e5bf8c5ad897843b5833d6a11c0601d9716459138e6746e64c2fe40324 SHA512 7bf4b95701de5bbedc6e67214c20e51087f460af2527c070e421e91df737eaa248d24041f36e15a5a60de69c6fb4071f04921a3c610d14a18cfad4023b05e7f4
+DIST firefox-151.0.2-el.xpi 586724 BLAKE2B 39f8c25afa5472acaccca1362c9408569b4acc9e5e59662d0bf9093d51160a94bdaaff2aa8d87f31fb558b13ca557e22f60d49b25498a9c3b5bc353a8389e6d0 SHA512 e3bf257955b4668e8fef7c8132e423c7987e9f7cd1faa05a3acc41d096944449f3decd1cff71abf557c9efe0c888c7e137a4f9d727293c98c1624e0f9d3d104d
+DIST firefox-151.0.2-en-CA.xpi 447478 BLAKE2B e42bd439d6db33f9ca8a8b01845182a271a26bcdad1534254abc8b9b4b83b3fffa042129b0f3c57047f19b2c1053d70afb5f4adfe087beb022a8e582c0029673 SHA512 869542c54015c090e8698aca3b5ec4322266d9c10df01f6b33542ac33aa66682d31b775b983eee6b50362c2badde1c939989e0f78c9520229d9dbb768fea300c
+DIST firefox-151.0.2-en-GB.xpi 447792 BLAKE2B f69c555d2726d88fc9b6ba624c4c6281ce0030a13c80a7d04e8e0e5b0b273a1fc6eba4a2e2c237e73ec58c8394c1cc7bcff7eabc37e481ba3e20e75d71108969 SHA512 e54f1a1a14573bdd86248e7c246c5d7a4f51fd91436c9160faee50d597408be32c59f0633e6e1eb6afe93bea039ec7531580853398d59e3fa558cc11eaeb2899
+DIST firefox-151.0.2-eo.xpi 473137 BLAKE2B 33a0334e31bea78afc8e95fac11bfdd15c07d35ffa0a7e9d4f03bfc822a76f616a3074459e854c87c36f67764d057346d01f98c085e2f2a64a6d133581dcc208 SHA512 abe47c7687bd36aedb7989e0c671d9ddce2bb68b854be71ae347ffa57f38570e879399c796ea7bd1ec168499b7c9d12bb5af5bca2d650eb880fd832f89bd9a9b
+DIST firefox-151.0.2-es-AR.xpi 485656 BLAKE2B bac123444e5e02a8cb13ff42ae9d746da0e3f77470f792d7b8687ac61d89b6cde49337e04450204260487738b6130ed390c6a09f5cad5cbe6684f3aefa0a4d58 SHA512 15956073475a02c8ee82fcc98aef622c71ec67648b48e9f3c9b6c5ecda3149a7cda743c550f4ff1eac86378b65e7d753dabf93c6ccffc2f4c610508207bc8679
+DIST firefox-151.0.2-es-CL.xpi 487164 BLAKE2B f76a21ba18e462875a01e99f564d0b1af1c48cb15e058e3de62daeeb44799ef7d895447c082eec78f9bea2f4605fb18ecf74c04ed2ff5e89bf626b9a2b0a55a7 SHA512 33a28606535ce509a87b61eb2edfe41bfcdc2544bf915fb428e2824a91f42dc8372d0a9831e1d255756d923fdbfc7d11d5035bd363a56c5210ee88fa0a82180b
+DIST firefox-151.0.2-es-ES.xpi 488070 BLAKE2B 9cedae0568d8724ad36f791785b2c10e3ba5b9a1933cd2f90f1b51eb7240fd3d47938e50528c74b4b662fe77a9b1c641a233a7817c84495cd8046072d05c2315 SHA512 07973b4579dcc4b54a35b4df68f26cd58dbd82bc75cf9b9d74e0ec0fd92037c235963f86e2f35cee2efbfa81666195e5ebf5a751cd8a420862f067dee9897f00
+DIST firefox-151.0.2-es-MX.xpi 490781 BLAKE2B 9294a6ffbdabf242fe3848a63aea6ece3d9fd35e0376efddaaa8d95531b0e9f29205e1b7da7d5a0c5a76511f85396243b506ef22dcc64bc35f2967c457d39301 SHA512 0fc7f37890b46a94a2d866c79b4249f3a8e29d95dea22ea443312c3a2c24cde248604cb6a84f7214582b491ec8774de53e6df196c33eecab957df616c48507e9
+DIST firefox-151.0.2-et.xpi 359518 BLAKE2B efc1ac48d51505fe74c097cc4779a005cf1e83554c24e008d9754f24200f294283bd0346511b4a2de2bb22cfed10a2269c37ceb8d5d3c6071511b0093c4de7d7 SHA512 d2e3dd67207f5f07e0310302b201ea77cf833a41f617c4251815d30bf4823f592bf5930236d6e4cbd071cf33a2e49242483e901b69bdeafca0d70bd0a84fabcd
+DIST firefox-151.0.2-eu.xpi 472488 BLAKE2B 81fadb66e2291fffa76579f52540cde6025070abb7cda71cb928e0ccc6e7a2268d0739aaa523e23eae498764b2a874d14b64450d382f9ccc6f1c6c3e6fcc1650 SHA512 26cd4f647c61cee89979e18e8927df9ee7171dace56ce0a028446401f868519ab1a5fb1d58884743cde3e6e083e74acb774e526264bb0f6238cad315f2cfc6f4
+DIST firefox-151.0.2-fa.xpi 420582 BLAKE2B 6e36139de90e0a036f4a3eeefa2cb59afb38c27dbeac75e9468d0600df79c0d5ce3562c4ed21a447290d8d4f03d12d607d489a035ae3466866e3c7dd764ed684 SHA512 eff0f1c1b0ed0c58d5662605b3dcccce2f9b17bbf958dec9602ddb656bb09def57b89d162c1ca72fa5bb20925eb6663d2b6d05748bae4dc3de95291da3b2fc09
+DIST firefox-151.0.2-ff.xpi 311095 BLAKE2B 7de5616e0644b9f0825e3de2cf0c0bdd93dfacec8444af5f06d8a5da95cc30d8bdd54598c3fe380698f799289e23847b852092613de9842efac240343c357f66 SHA512 d665f98317adc925b21972dd067afd424343030b9e23f84d0b3c37c0c1efee391eb9afbd0e2e5728059d67b4968ceb785a85080eda1ffd9bbb14bcef1ff346a0
+DIST firefox-151.0.2-fi.xpi 470499 BLAKE2B e3f66530987fef89cacde2470930a968921a56d6e4493ceab9864d9fcee2cce28e9a21d0227c098d3488d74e64adc413467ba557c8f3e47396a3cfa2d27d6d57 SHA512 3ce77510efe0d36c7c27aec1e754b23535cafc6ce7303e3088eff35ea543965aa3f2c9b7253b867c02eb362398661e9d9511d966beb5496a5c23016003123f67
+DIST firefox-151.0.2-fr.xpi 500724 BLAKE2B 8d7bacbe13b72630be99a2142f369c5d675a197683336779dd518ac990c5c4b204df16fe2b678ebacba0d28ac2a438ebc648509133af97fcb720d6fa36ab41ea SHA512 02f2e92283f6859f4ed071ab1fad1298bab997a9327bfc302239eff64cd3049f6e6537d2dfe3dff36d0a5d91156f17201f11077a584d8398bca20a635f9aea1e
+DIST firefox-151.0.2-fy-NL.xpi 482318 BLAKE2B c6c90b6e90260984e858b158468212d399cd154192591e722a663997ca951e38ffa4cfa867cfa80d9ab713eb31db970188e3b9a949ca85f050f5be8f2f2d84c8 SHA512 f076186ef21dbcc31bf90c0c7ef5260a35e875c09414d7ef1e5136ac71d477847245c8cb8fba496254e1ff14ad165e800de58986a39918ca114269e26dbc76b8
+DIST firefox-151.0.2-ga-IE.xpi 316738 BLAKE2B a1025e12da0d32f4a1f623d5cb4aa41dac793e86a18dde93f1d71912c1d24f3936577e6d61b215a2269d45bbe20b719348da085e985c6b63af62f5a91668cb43 SHA512 05b6981e98152eeca7c278156d395bfa5c78dfc006629bc2b68e03d17d443fb4c42dda1ae42c9fb6301feb337405abd60aa074ae46b29dfdbae34cca2cdefa4b
+DIST firefox-151.0.2-gd.xpi 410120 BLAKE2B 73f4340a0c1f71edc3317c1305bf10934013bd5d1327cae95912774d38e10cf49cc571f4530850f087ad74e7625a3061b4a0051bbb2dfa5a00a6fb43588b78d1 SHA512 56d8ccc61a84dec88e6b0e927a3e863ec632b214ff1b564fa86417bd6f1242675598014a0efedc1833641687159b274e2e86f37a5a664beb1621ca5acfe586a1
+DIST firefox-151.0.2-gl.xpi 446723 BLAKE2B 1ba2670580b40ad95bf617e2fa66087f26b9007b597408b3c6199360ab54a1607824fb6f5bfa3be15ce304ac0839247c772cdb8c870635bef5262deb97071a44 SHA512 4570f68d54528c56081d3c343ba9e1dd872205e54df041012f43bbae8960d1a4cf0c9f76c78bb6d02a7847412040e9c490e6f7392d2bdae70c5e17040d2faaf6
+DIST firefox-151.0.2-gn.xpi 490612 BLAKE2B cb857efa9dfb42de4ff9f97809ccae7942f5c4a65239ce8c5c6b665d83a06bd28ed48fd78663872c242517f018432b27e8abd262f8da7f36e4a2ea36b24915df SHA512 13dd0d6acad836ccd15f502825b2074370f8f2e22b20f352e1df11b5d6a3b3ef6e23db4420e8263bacfc8f910f7c267b826b975cfa8b725c5ecb86c8f79c26dd
+DIST firefox-151.0.2-gu-IN.xpi 359272 BLAKE2B 12589dd7c37c984895025da93faafe766d1e1711b4ab5e52807c477265eab6399787dfd8fe9ff839d1c7806f1c6432bb6fb4ca219565a342202118db271d28f6 SHA512 4828e832c59010323c1485c710454899c436fc26dd738a5c3231cb9695bf35fffffc41228ebb786e96e30b66d07fc39fc56e41bc2b1bd63547576ee8e0fc1d14
+DIST firefox-151.0.2-he.xpi 486416 BLAKE2B c5234741a57aa561d795dde0553d331ce1a0b501e78e15d518c91db75fa923cae565a25eb021733d7def36e1d2ad703cbe94aa3e67035ab2ffb499ca5d352e4e SHA512 189ce1304fc32accb55075817e7fbc30d065bbf6e3c41cd1361bdf30ebf7dbf3e6b4dff4b9f6128d174b1b06f2293640c98e208d109f4950d9f319cf88b6e7ca
+DIST firefox-151.0.2-hi-IN.xpi 378156 BLAKE2B b4063ba5bbf969c8cafa015e4dae9d5d76e8d28b3b432ae0152c594deb1224b6332fac29511d3c688077c0f41b1bde2a33e1d356fa1f18e1ff7ed05b5774f979 SHA512 d05b7b7e3a2ca0301c568c2cafd959522e45a4f21be1f3c243d9099a1f6285af2cb4470751eac8d8518d1087e02a14cabd080d4272e4dd4feea83b63a54e121d
+DIST firefox-151.0.2-hr.xpi 472639 BLAKE2B 2924b699ec87663570278597f9075cff32cc41ba70cc6d41c00140b48d2879beda24ddfeeee78d1ba98164ea67e197d734db46a740c366e5c0759238eba23331 SHA512 6e50d7ace1a96609cf051c3ad0adc598836d6f133f2607e79acbdd094ac1c451db1defdb0c081dfdf6efbd79ac94334234968e08dc3019eb597e6e2ac5554384
+DIST firefox-151.0.2-hsb.xpi 505587 BLAKE2B b1464898a26164adc20c331208820efdd2bffa55bb8736edbf5006d13c878d0e2619dd391ef4919e1c9e7bb476a68f8dbb9250e227ca21a7d874d188114dac58 SHA512 909d03f7580417abe67b645ba318a696dff061b57dcc121dbec311a11413f0989c28bb15f1a763a9b1b8ea9577d5027922bde172d6bf347aa07d4e1e90513f32
+DIST firefox-151.0.2-hu.xpi 509821 BLAKE2B 4f3bc7fa21920e297fd31329b7c52df5c6e0a7ac65864565e53eee6c664a0edb03dff1791b038aa8a6c61c140a542536547da24ad2ea195d7a644e9af2fb5779 SHA512 95aac6ca7f43cbd2043541b44ddccecfbfef809539fd3b3757a9650ac1d4d70cdc9102405a1269ba7dc87d1352bf33228e6765951e1623e4f7f848064a758c1b
+DIST firefox-151.0.2-hy-AM.xpi 489021 BLAKE2B da94e40d2a85b4cf3c734ac0f6a0c351084674053f0a1df795ee9dbff9e2b5de339d5cdff4fe16a7910c2e486e8077a4fcdd15be63bd9cf284a18406a198b59a SHA512 69aa24fcbf58472625a3ed121d26414d3795bffa1eb40490eb8f27d302024cbd13f4a2ac38b77f89ccd59e79093ccc66753c5eead9a0031e5bd4ed0ae8ec67aa
+DIST firefox-151.0.2-ia.xpi 469271 BLAKE2B ba806a477f5f913824c9619d1ccbaa048c3a8d09344fb4ed8a0e00215ed51554d8400f552fcd0d638f1b7bf7e78d4e357a9fa637c85d2c21b5b84d15137c8ae2 SHA512 325a37a73305c5cf44570a17bf5a5469dededa1fe1d2147cd7b929c98be2948af8cd956b701dedbc020365f520d201f0e9769264347dd4ca46a549b57609b736
+DIST firefox-151.0.2-id.xpi 433177 BLAKE2B 77b349307db6bd7eb164cf5492521ec3d0c1b6142d674032ce727bad1f7b8a76887e40025188b462bd668d18e5f0195a4375309d03b36e63cfadf0a640995035 SHA512 28ba02f17071e65231028f7c2bf95c0e1a9de38c59d10fd5e9b2c44ee81f5fe99738c21b77b783a26ad8435e18d97efd96a54cd8120eede36088bdc88968b553
+DIST firefox-151.0.2-is.xpi 440579 BLAKE2B 6f4a50faaaa965d699bf3ec34a39e11fb391200f761a1332ff7b4116187511712321366f0264387819bcae024d39e11372eb400e09b7d24f2617d3fdad39f815 SHA512 d823e3ab20a2a89a213b542104a3326668cb9c9bd1e0174c98ca17f4eaf2988994f543061409e35eb7e7ba490e74b5a22b36824e6bd4f2d467cb58f02ed1ec2c
+DIST firefox-151.0.2-it.xpi 481241 BLAKE2B 6056687629e6de3356cda3886699a31843466768a5ac02c8f97814219190f2790333442e4a3f798daf2a5dc92006cd86647a4c318c8c9d1ac3914577caf7c5c2 SHA512 b91c4d91eb1d10414eefa7b0b04753023be389e9ddbebd89495b319d518fc2ee87ac3106a26e2e4e1c0cf831673fd80bbd456a1627592830aed9d6e284da468e
+DIST firefox-151.0.2-ja.xpi 524600 BLAKE2B a9be00d0be7a4bd85db8aead69efdb75f6dfb3f8aa62a1b7688e1865f3b6eb175940d3052513d91aaae2852f4ef26b287bb8a128a314234312e7eb0c03a49911 SHA512 d41e8d0322be3c2c3d85f9d51511f4d608059bca4a4b1e88a83d15cb414800d54898c8e137f1f0b978e11118a6add6f1c8e8db4a499ca779213446810fc12fef
+DIST firefox-151.0.2-ka.xpi 543756 BLAKE2B 5454837d2cc3b36c8f766ec68db5485f47700049b12203ce0b8efcbee64631a967d6936dc2ed4d7cc72715ae21bc7fb17edcdf26b8c83d7b3635f6af2744b099 SHA512 df85e2a16cdb402ea1779c5739ae90eea47b1de2770269bbcd0cf80a25516bfff45ea28d9a7536cf83ae6c751ee4caec88db80aed54beba19a9026b7a38d015a
+DIST firefox-151.0.2-kab.xpi 426310 BLAKE2B 58fbfac1d57ea86c29a262be3f84cbad99a69b018b542f59eca006ff93aeeb4d75d1c03a362ef707adbf760d42017564265d9f42885c86bffa411555c954c547 SHA512 9b454bf4f4833a271674f37d4581fc0b9448eda638284f2d5a8dddf75d83adc6ff09a7ec9df8c08123b6b26897361069af7eb98d889ca40050089c42a961c457
+DIST firefox-151.0.2-kk.xpi 562385 BLAKE2B e5ea659e9f09538b3e691b7bd4536cc7f3e2195d1b6a32b5afd519d34d81226e0286038dc749523e0deb4f4671a3bd44ab1b9b37e20d34ca74b567cb80895fec SHA512 ada389b699a03845f336b062f3d2c3d42c4d0936a50c9e987aa29c795e1a72795beaba6bbc7f7fc77d7ab8646ef32328e0857c70962c54f3d0a8f062196aec97
+DIST firefox-151.0.2-km.xpi 376413 BLAKE2B c6316ece816cab468be2e6f13525701f2d1a1266b5a68df5db186fd18995b7dcabdc229607f35eabd1eee55f2c26b9a9901ef762564bffb8d271fb1a36bfb045 SHA512 ab50b727ac51f28790093c2747851ae261474698bc670581ff0019f763e01f2a98d8ec86319efc1c5b048f7a7de57ec32635d4554288d3949ea6bf7f23122b80
+DIST firefox-151.0.2-kn.xpi 333588 BLAKE2B 4e0919045f70433b190883209137e8b889db09cee28cb151395a1148bd93c4902364fbb2e02bd1283618582e7891e98bde5c43f3be95e044d55e2d6f5532cba8 SHA512 3914034742312e1e0556ab900e4505c51e80416f8f54087c55af49a93821fac8ce3f5d93e1857139639de83a913972554ffd19e3f7a7f144f61d40387f39c779
+DIST firefox-151.0.2-ko.xpi 509216 BLAKE2B 5a44d1f9e33e8c0e021543962287ba59e088eeb7c4030db7a54ef94d470032b69cbaa1457d377436c12f4445b72ccfa5931e2a236c74da2e33a7b88ff8bfeb13 SHA512 c180ece3ea0c236d629193981104566dfc1b4672c44964a4f239263ff45b26e9180c0cb964bde4e5f331df71de11e892433a4569aa44d595dd4cdcc228082c9e
+DIST firefox-151.0.2-lij.xpi 320449 BLAKE2B 6ef778dac3cad4e7f30a0fba50a8942708b99593981a288b85bbcf8220ed9e49a31740167a5e671289d6f32d25bab3c42c66bc662980bd91b3d426f6bf219daa SHA512 9f721526430e296dc28e5a74b38dc5e042e87db0380aa26762eed4635350143506251c67991ba863992996dea3544bd43f33947d3f0431ace9df3c99ce63e896
+DIST firefox-151.0.2-lt.xpi 380265 BLAKE2B 04a590c3ff6ab6b9499d07496fe60f4ff10718dd04d97c52e97c6eb4f90616316745089057e36d0a15f1adcd4fe0d39d12cf9e6aca28c538ef9400677814590b SHA512 6b48b1d32cea53ac2324466c1bdbbcf28bd1d9cef15c19c65da42fa341cccdd3102d91b10579cefebcb2d492c34dba56781ba9fe5dbe90215e9332f66680012a
+DIST firefox-151.0.2-lv.xpi 391358 BLAKE2B 83a787d34ce3b57d4a072b3cccc6a30997f1050bc93720a7f162b59bfb61caa22671811310501a1858c093727fdb6dc1212d44fe7060ac9ebce4c02596c521bb SHA512 9805cc284c11ab869b1be6255cc1e2d5da98d2b05feb29a020918fe1a9cd7c9cf38d768a86b800e01cf5f0db205bd7c1bb5395a630deb124d8b96298d72b7b2d
+DIST firefox-151.0.2-mk.xpi 360512 BLAKE2B 9e61b49721c9de83255d0e629ac0363d43779a3b2f81b53ffdfe1891323166c698b2948ab28631ed8c200e34498d0303bab9c79a1b9f93970acd359d61a74f87 SHA512 068be5771052c4996872038eb7b131f597bbae081fe59495400732b1c39e1200ba47dd31b0ab70e9cce1630e7eb90a36993e6c4688e12026c29d04e11156dc6f
+DIST firefox-151.0.2-mr.xpi 357169 BLAKE2B 22c955a744d2ed37a79459699e2a6bde2ef92305f21f7d9db6a7ce7761dc1f99cadec679d21ab4a7d9b81fc169121f73fc38977e806d037afd3e83eb4510ff2e SHA512 dc92760bc454e93e0f3ad78e023ff0d331f1400878127911e3d72987b6c08939f682d9eca5803d623f223298a28d3fd87328637213cc3cafcdb8df536c24d857
+DIST firefox-151.0.2-ms.xpi 296982 BLAKE2B 9db80cc6036625799e53c5ad43a66041eb852f45fe04e337eab746fb785447098fe6a354f7fff276ffb1fee043e0bcc2b5adbc5014ae7ddd2068e074e93bef34 SHA512 765d1061f31a83a6b3f8bada030965438b6ad4737be22ea1c17e174563c01779bca1f6bd96b2df0922912298415a5e480fd9e60f2f239ea22cf01fdd6c56fa21
+DIST firefox-151.0.2-my.xpi 344147 BLAKE2B 90669790b3a65d4b16fbb99ed8774add92cbe8d2bf7140720197b7bf608655904ee9324531a26178bfc888c2be6cbef074fe4e684270e4e2d38f66951090a19f SHA512 2c4968c6206adc2a5c0ec08c1d45acf883044402c5dc88f0447e6b8c5f048b7e658adc55ae03e99a403891f10e51ff8032fc7964e5cd6f9aee2f42f18e72f17b
+DIST firefox-151.0.2-nb-NO.xpi 468289 BLAKE2B d07da809aad8c6a2ca75e471c24eff6a3129518c54d4254afd905155445f90b0fb5c5d74dbdbe1d0d240c18611d11236603e1fcfae49315cb69f480067771906 SHA512 02b7d07a9adc8fdcbff5cc943d3adf27fd724e65e66bbad81173390d831bbf019ada76d47cdbaab946a772f04b8794c716bb7a1a2223b45478786ea4f4b3c89d
+DIST firefox-151.0.2-ne-NP.xpi 349278 BLAKE2B 95100e2f3387586332bc705822c220f59f87a1601c66693946b2ea7837538c653ff0cb98d7c30f63798f89ab70513d561ed106c2277b4cf918e4826afc88beb7 SHA512 8e31dfa2e6e6309167663df4ca96998f4700ceed3d6d6a02fb6907ad787237a64ee83ca220d309d2527c9a6beaec344725965df8a58fc94d5c73d748c9e47cd2
+DIST firefox-151.0.2-nl.xpi 475939 BLAKE2B 75bc377b37f0ed3905fe9321e8084b9ea0144387f3246dc1f7db945c922434874be6a045c55b585e49a5ffe89dcf60fb770670d27832e97e2bd061ae78df70a5 SHA512 6526d841c0ea2ec77a335b0f82d5d01ada7c0a577785623c39d385cf04d5207db8fa28d280eeabd48087ae65e0ef107ed838a3568de5fcd61fdadbd3618a48b8
+DIST firefox-151.0.2-nn-NO.xpi 471623 BLAKE2B 0bb23f18e3e5c81c3597edf12d09996f5f21792ac7769c1550560a8a88ea8762d5ce58d068b1ba572ee62162df5c8b91ae2c8a346d444573d33d6f39372eb65e SHA512 6cfa7fbaa9c063b32856961c73dca7f9f2dbf68f4ccf8c93a5c28de59f7ce74f65c71279bba938f958453084359decf96cc834f79c4d20b7e4d3b83965f6d981
+DIST firefox-151.0.2-oc.xpi 414931 BLAKE2B 48d0b89c398d8872c46aaed3b8ef88762dd3e9974d556641c3ad902ba7636bf10f500970ea90611389046b6427d8d84ee2e305d439fcf68c06653cffaf3703a6 SHA512 a6c56efb9dcbccc4047191902b809e9a07d9cc7da1eebbd27ecaf237682f8e144d314e698eac0dafbba22c81e82bf40dd7fa89293e040705b81dbc3dd8918a99
+DIST firefox-151.0.2-pa-IN.xpi 542074 BLAKE2B 497cfe307116c0cf3a84f7213307fb860beb97cbc37910c385c39297e9c652c425c6af77dd41f02428d669e5fe3b2787f83be59c09248aac6eebc34e0a9930f3 SHA512 15b7f1bf63bb8d3d1e87e6d9fa831bf44e68902c8ebf4dff9f9927cbc4b0c84d21af22284e59472d3d40142fc3c9b889933d86765161f96a92ed268b002ef5f9
+DIST firefox-151.0.2-pl.xpi 506740 BLAKE2B c9185a7a3398238c4b1592282a7946f950126886a1482a5755a0325063aeaf762d74affcee1bbc3be2b0c34062417c9a7eed580b9055e6db83c2f3ba64549036 SHA512 2b041e45f4b6e70c0513e6890e5b2c0853204306a8397b19df06a872eb8f5fdee28cfaa2159e5865974dba5b269d7cafe30c4026d0626046e8645dbe2e17d915
+DIST firefox-151.0.2-pt-BR.xpi 480653 BLAKE2B 5bcfaa43efb9a234242592885308ef9813cf9c72a6e76d4f19714bccd54509cba2f62a8764d1b1d6401902b19662bab07b6d6514c476ea00ea4b24182d28a577 SHA512 7f78dcb0945a9f9306f727aaec624b8974a5eaf648ee8a08ab95cff64e131bf186268b54e321c6ade9532db5e1031ebed9f3c45996ce6ad45a278b906b8d4d69
+DIST firefox-151.0.2-pt-PT.xpi 487492 BLAKE2B 64662ca4e8c6c76ab1c2df0761c2b878a4e76ccecd557fc33095bd94926b81d084deb6e092c004b9079934b4ccb3318e0849de964d77198e2f0b79af9b182bc2 SHA512 12da966cb3430fbc120a15331f44b3c175ce309faa6fae0cee7eb54b5adf2213fb5901c326f712e9d4dc33a0d04cc400eae0b3afb7b80d4894c4358e270974ef
+DIST firefox-151.0.2-rm.xpi 458465 BLAKE2B 9583721d8d0f8aca5bbe2221055d1d01fa14fbc176666e9681e97c71a79865130e6ea8533239bb9bf9683f5ef62cbe14b7b072d013ab11b70649242cff3a2ed3 SHA512 804e0f30c55e40f9cd3be6dd4969ff9260d8eda88e261a0d5d8d74ef29c213adc1e1a82b2053094b86323bdb1b4a88de3c8e4e0ba3c6bf4d3c14c89584e54091
+DIST firefox-151.0.2-ro.xpi 494406 BLAKE2B 4a694d39400afde6a36cf122314bb5c9a2295f07d1803c1aa1d7c3c8ac6c7c92da3f994b2741d5df76a56903ec43ac1267deb9fe4de649bb27466a36ec3a3583 SHA512 b5286a91e22f95d12af4d09152e3ade9484229743184f95191401994d9e55db8d6e6884832ad7652bdf6a616a0fa7634335be6e81e0de3b6ef7020f27b7525f1
+DIST firefox-151.0.2-ru.xpi 574762 BLAKE2B 49099b50fddcc2a1f8a9538933cdadd9c3f098b2d5032018e327ff1b875bd73facb0a321d1d0be148cc258783544df82a5cc1fc19dd8919122a5167170c9561b SHA512 66b0f8a376c1fbf0319b8418173a0a7efcf0322d9da58758d0514f8b31e6070ef0dae57ffa02df2fb989e269692259800cf9360688401150b588b98c9391b0ce
+DIST firefox-151.0.2-sco.xpi 323635 BLAKE2B 954d1d75b3514ab98cd9cabda39190b7386e08a3338e139e1dc4932c99c48ef68d2ac3379ad7f49f98bba747ec9d179d5184619f3f95f51ae498e3adca11fd35 SHA512 df342cd9fd4121ac299ca0882b71d740bb92819d1187577f00e93da690e8a5345207815e8e4225fd506b3503f0eb4013e6acfbebe2df8c31ed2cca231efd59d5
+DIST firefox-151.0.2-si.xpi 409833 BLAKE2B 9119202d3be10870100d2d95a1d3783142693776b5d3ce0ebb8116ba18e54d183bdaa9701eb9c229ed489cb91eee50462ed602c377ce324efc7fd10dd20a0425 SHA512 fce031dbd2b4fd6a99641dbb99fcc7aabea63fdd6c85db04b77cd3c2dcd708937ac23bf9bca15ad74637530a0f6241a4ec4be1a4c98e0b0608509bee966e329f
+DIST firefox-151.0.2-sk.xpi 512634 BLAKE2B 017851d966cdaa711920f0b48481d965736b8fbc3b108bb95384742b47f47942c4a9817e7fe17de838790a42ccf4d424f0b557df976a591fbe674aaa06f62021 SHA512 809c9159f3cb9d1ebda2441fecd2ce587ac92b95cf3c3fda4b49762d0e00a8cc66c7e35452fe95355a397b8e64964961aa878facb3af3f47844f13044998ea40
+DIST firefox-151.0.2-skr.xpi 485037 BLAKE2B 3c1dbd70e0a1660401dfc8be573a6815d557b029b49e9ac2ba129892ecfd954ca1822558c0b2e9f49278a8bfaa58ea2afbe546860ecc19ea575483e35ab2d18c SHA512 9d484c5a1850c6bcb04373cd4dd987db59e9b39399ff9b43ab05e68aafb9d8a019104146f3a20abecae5a2d3836074b7b52ecaa11f170a8ad94c94e1cefa110a
+DIST firefox-151.0.2-sl.xpi 479198 BLAKE2B 4be751958bb443bdad7c0a4ea2f733a4d0f07da6ddb967443ae21aff5df281ae81df44e09410c3f875692a001800cfe98faef90ad13f50be899c8edc7810b4ef SHA512 3095e6b22831d9503061602f47b1f99b44a0d3fae5f3862c4154d083c523c45bc1de2e22adb5913150d6a1f0da427e7eb77d7f2118ecbd4a8e8f8f91c1c431a1
+DIST firefox-151.0.2-son.xpi 275777 BLAKE2B 4af269bb8afadc2883884071deafa6e749a99138cf9418350ef72609cbf1deaaa05c18e59ca3b511e587fe10079a88451c0a73a955e1b003a247c0485c97775b SHA512 d0df44c75367aea40c0a719b685a0f73651572f0ad8d5350e612f2e49df939e006504f0422b9aac94817dc2f810a0119e8acee9826a8a7de87efaee103dff82f
+DIST firefox-151.0.2-sq.xpi 493041 BLAKE2B 0a022edfa42a0dda4264bea45819614b0de40cce7dd22dda6f333581dc4f97306f2ec54bd210b15e2542457421ade4fd5a357667eef1fec1b3453fbebac0f4e4 SHA512 66b681ec3296e2adb27e3d2c4586065708c6b21d783d6485194ec85be9c244e2a61bacef814ef9896ec323b72aaeb179f06cc491379dbc8ebe7d9e2b90810ddf
+DIST firefox-151.0.2-sr.xpi 546339 BLAKE2B febcf6146830f934f5001ae599f94a24add67d38141faf839858d5755527f94cb9252e5a3a536a97be526d5e64107f201c90011f2985a296e75b4e3fe13add27 SHA512 c3b60977200f78c16472ed688d61239dc513da91dadcf95b67e40f46e95f28b6735439817258a03f2e11b5e7e6fbb590c4b99231e70889969d951311b650ec4e
+DIST firefox-151.0.2-sv-SE.xpi 475615 BLAKE2B 1c06ed3a0e77ede8fc44435fcb85b4086e0d588b9a6bc99805b00a74979e9b29825152ef6ad39cd5ec650281432dd2ee86701723c3b49f4cafb10987dcd0fc07 SHA512 705a26b4a545deed96ae7eb40155c913bc425299ecc5cec8e82d0ea9e65dbda8a67c6cd38e9726b20abe8616b5e577c216a1d655a23a9d6165d523bc3318741f
+DIST firefox-151.0.2-ta.xpi 339050 BLAKE2B 1f4b5d9af593eed60959e7f2ec3c0ae520d5ca4818cd66a2339960945ead71031d3d20ba680c9b7f3e566fed0d50ef3737df0700205e9973ff87e939ecafd89c SHA512 713f962f8e0799c7df4e2af21f0f7adde6b880188b3d2f314a8ccd9f7f1d1652fb34b90b9ef2afd4d7e289374894c67feba91f6f398eb682f2b213d18d09ff53
+DIST firefox-151.0.2-te.xpi 389029 BLAKE2B fc89f10dd73141c707d25939d9e9a320e5eeffbd8f803b5fbcc49f13e179c09e19d53aa0fb2d5e85e0806d874f511e21b1dca8955d0199d57b496b374d29be44 SHA512 a82adfc1c59eb2577f488ab90c799c3fb31a7f7acbec332bf0f81984a1616aaa851eba04dea20f87e48ef9b50707a7972a2ece510aa251919af65fbdc89fc124
+DIST firefox-151.0.2-th.xpi 552246 BLAKE2B c2182cbc5050da493557090fc4cd325c8feaa56822e2ac3358d04aef155978827c1d89d970b36f69a819038cc249b34fa0b82a956a7ecbd132489e55e96d5042 SHA512 0a59141ae848c1a10f9388f11016967d0d4453c8471ed777fbff946cbd70d691fad2484cc4bd0025b1bdad2c5e1bf5930c04faf5b598ace6021d8a901d4a2f34
+DIST firefox-151.0.2-tl.xpi 356609 BLAKE2B 66bdfc70da4b1718e0f115b5fcc6156b2d368df56148a60bb59946fbb0a804c1b732b84da367b33de5d4dea40c3533af0dcc0260af7137529adbf272b1b754cf SHA512 cea75a7fa6da1ff89441611190ceb854b08503e28255cf5855d0002b2f613013ae237e1ecda3aa554f47296a466dcc0d671f15467775f73cd2850f33bb76d4ab
+DIST firefox-151.0.2-tr.xpi 490146 BLAKE2B dcd994fa052c580427c69edba4e9a92b3a37ef3cc83d9e7434491c36e22dea6311ff097ab51ff520bf137d9392d5ee0e6984316e21912e33126f8dfb96497401 SHA512 fe72ef3de4ef0cf7b1b7a307eb2f5ebd4413b96d42094fc411a3b326400b4e8c36e4fc3ac7befbf3db79ebbc46e8c6b1eb1b676e6214edb564cc48875da98513
+DIST firefox-151.0.2-trs.xpi 325477 BLAKE2B 287293369e9fe27ef2fa4834067106e5c376acdf0751cea2680bc798ddcc5b535562dfad0edababa90ab01f1c1345d0441f5a4adb74b8643088412a5ce35523e SHA512 dfd81971c18c06cfbea4e950ab48f0d49bec9f80527cb96c0d6ae6fcad35cce9828a828581d46d350fba82e47dd724c427ea0a8bd446c3d86a231e22717e1b45
+DIST firefox-151.0.2-uk.xpi 552131 BLAKE2B 5b67c443cf6e0b15bc68440f7d6ef313ff23ad2e32839f3c50c73b0e9cedb00eac8c681c804a698777d570973180274bab307c530f9512f496f97e30c54d5408 SHA512 b9838e123cf459e1b1e68fee8804f5051077a8fcdb174f5c6c13f85ed5cdc467823bdb81628668197cddda2b61782255b52b47423813f3e162263557b4cc1c0c
+DIST firefox-151.0.2-ur.xpi 371291 BLAKE2B a86ee5ad59de3dbdb3897a1714b27ae6d0f82911cdc5151efeae283bc57638a2b5a9763f0345647d17569b34c25c40d7385276b3545a4a37625d1e42b393758d SHA512 9efd8a0b8367397d5754a695a77c034a3ea275384f02159d408fa3f75b14d6dbeb723fc35963fc874e88cb95bceee2c839e7dbab4e7809ef0897d3bc8f5a6802
+DIST firefox-151.0.2-uz.xpi 305737 BLAKE2B afd70aa2ee29e3615ab89083d4d1b44b3742c79e6442cd89bd1806d406fe1c05163bd28fb87405ee0254a7253577b8c4e9401643a1918b2b58612faa4de9bfef SHA512 da6729fe972a5a7fe7a7817cc60732ed6fb99be07fa7e637ac91bde39c07ba4699dc466435a94c9dae8735b9fcdd305cce919ac3bc681a1774492714f5a10ad1
+DIST firefox-151.0.2-vi.xpi 511303 BLAKE2B f35997021e3066855ce5cebf00bbee120642fa850d07f32ebff6c0d4dd9d6fc8012f88998430334c349f48b457eb30c1ed162fa1ae90a415e40b699ac64a8d3c SHA512 2f194505e2c17bd230b41133bcb050638e9a51f8eeb635bbd4b63073f874d251eca0e301447d2fbcf188540a196cac8b7f8f9d3a6b82242451b656c4d3fa2bc7
+DIST firefox-151.0.2-xh.xpi 275311 BLAKE2B 865384de24cdfc70de994e04937bd2dfc223db24f43aef56d75db44feb72b1902989f9165a0f6fcee87daaee4132564e708c7d9e7df6ca1a2164e067bfbed7fb SHA512 3f6daf98093e7342a98ed21b7ac95ac0c97c07a49ea519ca3cd2726c2421a1ff76963dbda0a19de4f2553a9cac6a753ace054efad380d54325c2e9e9e26ee224
+DIST firefox-151.0.2-zh-CN.xpi 501515 BLAKE2B a973ada3db5232c5cf743cfae9233a224d906b8d4cc835d5e2094206f707aba9c42d7ae0dcf80c14c7316fe215b6147e11547f17c725c529672aa6cf2606689f SHA512 95d0861ef0cf2c31a0bbb03af7733b302187fb6f8f20e43f82ca290e652fed354245f4e4b5e5d392abe43ed85a54d58489f64ea786da0c5a0422587a4e69a79e
+DIST firefox-151.0.2-zh-TW.xpi 505574 BLAKE2B ad4cdf25b691637b8eb72f051e39a774b3abeb5861f2617c98f7e9a40b55c6e5a20d56877aaef2761eecbe41957560ba5276b18f2954125b072f25cedab1faaf SHA512 403bc218c4583e3002e6c6c3bdd7294b74995b80a29a36fced69f82c590c45eab0c4afb31cfbee3393e82fb6b6004655ee5628e136fb727f06dfa83c6323772c
DIST firefox-bin_aarch64-140.10.1.tar.xz 66474888 BLAKE2B 27b0dde55ebcd82ef8281a27acb9c6ebb502cd835889f07f5d95ef8959b8e7825d49e94d969fea0598d7cc82ca1ae71964eb7b75b3e9eb74a3386c251f2d718f SHA512 c69c1bed048f367f919843e927866986bfa71afcbc3de7a52c5426d076b7a5b9e1490d55e2147a6500f21bf7cc31b73c9b0eaeb279b9df25050215c13fb915b2
DIST firefox-bin_aarch64-140.10.2.tar.xz 66450524 BLAKE2B ed089670555ff4fe45abdb8f4761ce7f75c45f262402b1298de8248abe53e7d9d64e579a4a8ccf165aa8cc3a0b8f388e5bcaf8bdf3f3ce9f07abb88ccf4837a2 SHA512 573b635289b15b2ba79044bcaf612e7d703350dfc074bbf838291049fe1a34672d6a8d8d4a1d2e83fe04c7aa8b764e91161ef852fba44adb39e20ec635977756
+DIST firefox-bin_aarch64-140.11.0.tar.xz 66424572 BLAKE2B 59c25eccc76fd045128b7bfa5bd6612934a7c6b43cfbb603fb94f0e7f0f155959a7b14b857e9d4ce9c3a791fab4b4f3ca70bbf2f2df00e66481d37e105a1820c SHA512 6c7fb7f3ebc143bbe1618971e883c90dd4155b468a2cf04468a87033f4be9413f2fb1ac7c16b260a846f3882d0263bcb918c64397e1c35ad23e0c047daebedb6
DIST firefox-bin_aarch64-150.0.1.tar.xz 71397520 BLAKE2B e6d5915e9d202c241d2d1304bc31c98d1c03e8a05b63ea6e7764f6967c53a30d5e02751bd60ed6dbe1c130916ee59e1cb8987b1241cf61317ea02bbccf2b86f7 SHA512 6ae6a10a6b471c5be2f5a3cef7ffca6668fc2b99fb1cef99253cc6d8c4aab46cea91e02928c300f2c76f3211703031fe8b09bcfa8720722de34b8fdbdf556418
DIST firefox-bin_aarch64-150.0.2.tar.xz 71485700 BLAKE2B 901295c57b235a620b738b606702b8f9e9dd4edb70a1ea9b0d927f614ea65aacd54fe92bf04e0ac3ddf6d759c850e3455147993bb6561aa2a6680a3505bacf5e SHA512 33c63fd1fd50392df2fae2efdcd5fcf7e253d011e1cfd5eb5dd5115c6c71e72c5fb997e13c41f9100588c98b816b4b23452c4598920436ea73f6c8f5116ed922
DIST firefox-bin_aarch64-150.0.3.tar.xz 71461112 BLAKE2B 92dc565899009cb3e21efdb8656fed447c070052f4c0eaefef7d3d5b33f5c4616ff3f664fda5ddc30601d221faa17aaea2c54e490a359fee6388264ec1f1bb95 SHA512 c515aeb102dbbeffa3f08f4a165aef7aab65f095b0b7fab5b73888dc8247372f0cdf9285763b719b3789225676684024f6d7f3d35651073388e403a62af2f4f1
+DIST firefox-bin_aarch64-151.0.1.tar.xz 71821900 BLAKE2B c133a9fe6e43a21bac15cf62fcd48f01e2f3d013bb9680a6bdb83192629a61da8443ea7e727fb908b10bedfd310578d357933f186aebcc50bbabb6465bb93003 SHA512 febc268b50e4ee446e5a62cecb0e8a1b591deb9c6d22dff5b152616997f0c048a1d4739792d2e825efffd6ec2c2820469455dc1395c5b023ed8e34789c8ab689
+DIST firefox-bin_aarch64-151.0.2.tar.xz 71943320 BLAKE2B 3654344cabd29ae4e369cd484261cbe17bdcfde1d2808e8d0e1b337a34d09242636f9c4d171cf09b515406ec2adac114119071d77cf40e720e69d30781b16f0e SHA512 2ed63fdeb633dbdf5ebed6e7fa455f566b98fbed7aa659f4182c9703127d00e29f7b66c61d9e6c52b346f1eb5e5e5377d9f7231b0845ddb768fc7a709f13298b
+DIST firefox-bin_aarch64-151.0.tar.xz 71952992 BLAKE2B a3bad7906a6d4a1aa3f6af022e6a761f804c390ab32c7bf4b14c2855f946db32c3987fd698ede29a875afed942000f416ac898a507b5a33a6feccfccde60367d SHA512 0203fe9946010b52d242ef01f7ce9bde5b01795fedb1e49b6e3782d9345e831203f7110fc66269e94f25c149846512d343cebcf059bfd4b47b0aea036c278feb
DIST firefox-bin_i686-140.10.1.tar.xz 78599480 BLAKE2B 8a69f493d5745772a742403c3ca3ebd3f857d683a6526e48a943993ee8b17a0d641984b504b3a1801bf362c8343eeefe013b19f7368841cd31883bd4c36c3809 SHA512 c82dea03dd9681d875b50c3fcd77070873bf7582cdd62d9649985d219ccc0c4906c4e1c884a27287a14e2d5e11c9d3a64172e579216d2b72cdfc9de484dd2463
DIST firefox-bin_i686-140.10.2.tar.xz 78739756 BLAKE2B f125820081080ce057cf5c08c5902242be09dbf3845070111b9d55455bd12affbfd4ea80599c07b82daf97adb70f3ca16d7dc497a42afa52f23429c1d202e710 SHA512 6ffc0a981119ae1623bcfaef1e835b70a845fdd00dba5d9cd12e6efbea28f2eb11f4599c7665f617018bc9a074fa3b7dd767cc4eb4e361c20a3e8cc46bad2dc9
+DIST firefox-bin_i686-140.11.0.tar.xz 78645840 BLAKE2B ce4696a848d625e587053f3d8d3294bf38d18993255803c4ef67182c565a61cc8595444d498ec7931de73a55ca9a137ba1f5742a3e183a807c7ba0d31129d71b SHA512 b740af8fc3a6328c30819ececa44002a90354b37e44640702076b64e047ea9a546d51a5793e6e494be59073e8c2410deab48b28b8d4b95e9b1daa7f954c61b98
DIST firefox-bin_x86_64-140.10.1.tar.xz 75892956 BLAKE2B 25f3051dc050bb103aa893c97e30d2b6d5ae29b7c4f7acb85a133474cd32226ec932b96741ef90e3fc3edb944d00cecd700fa3e3e75601a6cefc8b7db615d7f7 SHA512 f4c08c587cae67402df3d7b303776bce5f4fad11d928bdc3368b835600af0aeef3446659c9950283020f1666752ffed0d4b6ee415cddadf783385c71b8219ed1
DIST firefox-bin_x86_64-140.10.2.tar.xz 75354040 BLAKE2B 63d573beeedc824dfcbe2937a89a55a20d99c314dede37a3e1e16276e504a917a311854be7389ed7c27c18bb736164eb13ffcc286a8ff7b6a8e13ae4270c9dd0 SHA512 4c930744f6fc8bada9e06de700a2c949bc5c36ed43fef4c355f6792433171246821b15f4687ac69961c8188c12d61cce0249cea554d7da1a564d0fd10019ac1d
+DIST firefox-bin_x86_64-140.11.0.tar.xz 75512600 BLAKE2B e5a3a7deea13955cf4fd07f195f00a187d8b4622b83756623d496a952fc2521887e451f05ba0ffc237a4653673ef336d4c07d8a642deac438f4f514bab544fdb SHA512 c9553b121fc434cc45792c49377603aa3c2fa8954655f1b7b8f8b0b298e48acb55dab88410efe0b8378918d48b9e2ecb95bc063051d73267032bfbaf89c4e3d0
DIST firefox-bin_x86_64-150.0.1.tar.xz 83562372 BLAKE2B e21f9afea086856451647bd13b6ff67354b97be4d0e211a3b3b64653b4f42653eef77ba26c668375aa65424fce0052aaceb9f16bd1fce0fe7cdef48c3543d8ea SHA512 a2d9b68b4cb54134513c07a298fc1d5bff4af77b6fd6b2984d455422b2c577d36602b8a37e2432416c63f9fcd24ba859131be6fb567aabef5084d9a6f3fb8fc5
DIST firefox-bin_x86_64-150.0.2.tar.xz 83510504 BLAKE2B 48e4bd94c248f68ce584f62491bd24213ca2384e25eeeaba5fc79c9dda75c468455646fe2ea1b1e07f38e2c54c807a02b6186693e5b008d91feb468c85f3a7e8 SHA512 673123c1fd0540fe18424189b4fd4975a8f1011a000056263a90e7350a700764ad86321db7a2b224c6fbaa8c46d80b030f7532f62df237440ad3745d9d867f8a
DIST firefox-bin_x86_64-150.0.3.tar.xz 83662580 BLAKE2B a463647d98f7b68b85aa0d7dc3cd5347be53e90e469a0c17877dad7f11680ccfa8c9343b321d4f4e779972b1162bf20f7b0a4604b951e6c095cde1e070adae44 SHA512 ee0b8c85a81c49ad314d80f2f5b0ebaf1a5c9aca1cadb7308203de6ccd04214d3aa18d9a5511f0ec2a4447b3c277dfc278377f9b50ee745d6106c1d0c9ff5b6a
+DIST firefox-bin_x86_64-151.0.1.tar.xz 83929868 BLAKE2B 73decdecc5bb5b09d584bc794cb47c6e1f32c31cca89d6f7a15cf910428cba742525a3ba674d3eb2914af43aa1af446d9c74e0ff8721a9097d94fdc54fd3be1b SHA512 fb71de30f233a783f251494cdf1dd3d51df022f815d8e723356caa65f01e898dda7c3ac4bc5f646d6020a28de8a1564142f7f0b1112047de5e95169d657e7895
+DIST firefox-bin_x86_64-151.0.2.tar.xz 83840764 BLAKE2B a3b7ea4b0d0e940c2996d80f066ea392477c76706f55bcc3f0f3b7df81401252b92ea41c1a84ab44c0d85abf5fd54949ad4a306eb6da9d36edd2a8dd149fbdfa SHA512 e423fffe8b6fb9d0f5e9c8804e4dca5c2d709e8c4c998bd42eaf949a0f4c42a2c1679e9d6c8ba0b171354023b68cba9fefcea7269352bd3ea7b28d8e1dc792fd
+DIST firefox-bin_x86_64-151.0.tar.xz 84210712 BLAKE2B 0dd6e72e90a7f0cbff6979329efb89838ac65ae14178fdd0d20385130e8feb3b8f4899c8626c98026042c20ab0df185cea05dffcee974d0e47d578ce8f02a670 SHA512 adeacfbc56b555c3e8a04f220e22f4a1a2dd9e223795dc81a4f25ffd4096be5cceee63d6870dbaa6b0f7327c96428d17b703bbfa55882a266580a6b62c43d382
diff --git a/www-client/firefox-bin/firefox-bin-140.11.0.ebuild b/www-client/firefox-bin/firefox-bin-140.11.0.ebuild
new file mode 100644
index 000000000000..40ceaf125a65
--- /dev/null
+++ b/www-client/firefox-bin/firefox-bin-140.11.0.ebuild
@@ -0,0 +1,361 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+MOZ_ESR=yes
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+ SLOT="esr"
+else
+ HOMEPAGE="https://www.firefox.com"
+ SLOT="rapid"
+fi
+
+MOZ_PN="${PN%-bin}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+inherit desktop linux-info optfeature pax-utils xdg
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+SRC_URI="amd64? ( ${MOZ_SRC_BASE_URI}/linux-x86_64/en-US/${MOZ_P}.tar.xz -> ${PN}_x86_64-${PV}.tar.xz )
+ arm64? ( ${MOZ_SRC_BASE_URI}/linux-aarch64/en-US/${MOZ_P}.tar.xz -> ${PN}_aarch64-${PV}.tar.xz )
+ x86? ( ${MOZ_SRC_BASE_URI}/linux-i686/en-US/${MOZ_P}.tar.xz -> ${PN}_i686-${PV}.tar.xz )"
+
+DESCRIPTION="Firefox Web Browser"
+
+KEYWORDS="-* amd64 arm64 ~x86"
+LICENSE="MPL-2.0 GPL-2 LGPL-2.1"
+IUSE="+gmp-autoupdate selinux wayland"
+
+RESTRICT="strip"
+
+BDEPEND="app-arch/unzip"
+RDEPEND="${DEPEND}
+ !www-client/firefox-bin:0
+ || (
+ media-libs/libpulse
+ media-sound/apulse
+ )
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ >=dev-libs/glib-2.26:2
+ media-libs/alsa-lib
+ media-libs/fontconfig
+ >=media-libs/freetype-2.4.10
+ media-video/ffmpeg
+ sys-apps/dbus
+ virtual/freedesktop-icon-theme
+ >=x11-libs/cairo-1.10[X]
+ x11-libs/gdk-pixbuf:2
+ >=x11-libs/gtk+-3.11:3[X,wayland?]
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXcursor
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXi
+ x11-libs/libXrandr
+ x11-libs/libXrender
+ x11-libs/libxcb
+ >=x11-libs/pango-1.22.0
+ selinux? ( sec-policy/selinux-mozilla )
+"
+
+# ESR and rapid dependencies.
+if [[ -n ${MOZ_ESR} ]] ; then
+ RDEPEND+=" !www-client/firefox-bin:rapid"
+else
+ RDEPEND+=" !www-client/firefox-bin:esr"
+fi
+
+QA_PREBUILT="opt/${MOZ_PN}/*"
+
+# Allow MOZ_GMP_PLUGIN_LIST to be set in an eclass or
+# overridden in the enviromnent (advanced hackers only)
+if [[ -z "${MOZ_GMP_PLUGIN_LIST+set}" ]] ; then
+ MOZ_GMP_PLUGIN_LIST=( gmp-gmpopenh264 gmp-widevinecdm )
+fi
+
+MOZ_LANGS=(
+ ach af an ar ast az be bg bn br bs ca-valencia ca cak cs cy
+ da de dsb el en-CA en-GB en-US eo es-AR es-CL es-ES es-MX et eu
+ fa ff fi fr fy-NL ga-IE gd gl gn gu-IN he hi-IN hr hsb hu hy-AM
+ ia id is it ja ka kab kk km kn ko lij lt lv mk mr ms my
+ nb-NO ne-NP nl nn-NO oc pa-IN pl pt-BR pt-PT rm ro ru sco
+ si sk skr sl son sq sr sv-SE ta te th tl tr trs uk ur uz vi
+ xh zh-CN zh-TW
+)
+
+mozilla_set_globals() {
+ # https://bugs.gentoo.org/587334
+ local MOZ_TOO_REGIONALIZED_FOR_L10N=(
+ fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE
+ )
+
+ local lang xflag
+ for lang in "${MOZ_LANGS[@]}" ; do
+ # en and en_US are handled internally
+ if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then
+ continue
+ fi
+
+ # strip region subtag if $lang is in the list
+ if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then
+ xflag=${lang%%-*}
+ else
+ xflag=${lang}
+ fi
+
+ SRC_URI+=" l10n_${xflag/[_@]/-}? ("
+ SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi"
+ SRC_URI+=" )"
+ IUSE+=" l10n_${xflag/[_@]/-}"
+ done
+}
+mozilla_set_globals
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+pkg_setup() {
+ CONFIG_CHECK="~SECCOMP"
+ WARNING_SECCOMP="CONFIG_SECCOMP not set! This system will be unable to play DRM-protected content."
+
+ linux-info_pkg_setup
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ mkdir "${S}" || die
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ MY_SRC_FILE=${_src_file}
+ fi
+ done
+}
+
+src_install() {
+ # Set MOZILLA_FIVE_HOME
+ local MOZILLA_FIVE_HOME="/opt/${MOZ_PN}"
+
+ dodir /opt
+ pushd "${ED}"/opt &>/dev/null || die
+ unpack "${MY_SRC_FILE}"
+ popd &>/dev/null || die
+
+ pax-mark m \
+ "${ED}${MOZILLA_FIVE_HOME}"/${MOZ_PN} \
+ "${ED}${MOZILLA_FIVE_HOME}"/${MOZ_PN}-bin \
+ "${ED}${MOZILLA_FIVE_HOME}"/plugin-container
+
+ # Install policy (currently only used to disable application updates)
+ insinto "${MOZILLA_FIVE_HOME}/distribution"
+ newins "${FILESDIR}"/disable-auto-update.policy.json policies.json
+
+ # Install system-wide preferences
+ local PREFS_DIR="${MOZILLA_FIVE_HOME}/browser/defaults/preferences"
+ insinto "${PREFS_DIR}"
+ newins "${FILESDIR}"/gentoo-default-prefs.js all-gentoo.js
+
+ local GENTOO_PREFS="${ED}${PREFS_DIR}/all-gentoo.js"
+
+ if ! use gmp-autoupdate ; then
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ einfo "Disabling auto-update for ${plugin} plugin ..."
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable autoupdate for ${plugin} media plugin"
+ pref("media.${plugin}.autoupdate", false);
+ EOF
+ done
+ fi
+
+ # Install language packs
+ local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') )
+ if [[ -n "${langpacks}" ]] ; then
+ moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}"
+ fi
+
+ # Install icons
+ local icon_srcdir="${ED}/${MOZILLA_FIVE_HOME}/browser/chrome/icons/default"
+ local icon_symbolic_file="${FILESDIR}/firefox-symbolic.svg"
+
+ insinto /usr/share/icons/hicolor/symbolic/apps
+ newins "${icon_symbolic_file}" ${PN}-symbolic.svg
+
+ local icon size
+ for icon in "${icon_srcdir}"/default*.png ; do
+ size=${icon%.png}
+ size=${size##*/default}
+
+ if [[ ${size} -eq 48 ]] ; then
+ newicon "${icon}" ${PN}.png
+ fi
+
+ newicon -s ${size} "${icon}" ${PN}.png
+ done
+
+ # Install menu
+ local app_name="Mozilla ${MOZ_PN^} (bin)"
+ local desktop_file="${FILESDIR}/${PN}-r3.desktop"
+ local desktop_filename="${PN}.desktop"
+ local exec_command="${PN} --name=firefox-bin"
+ local icon="${PN}"
+ local use_wayland="false"
+
+ if use wayland ; then
+ use_wayland="true"
+ fi
+
+ cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die
+
+ # Add apulse support through our wrapper shell launcher, patchelf-method broken since 119.0.
+ # See bgo#916230, bgo#941873
+ local apulselib=
+ if has_version -r media-sound/apulse[-sdk] ; then
+ apulselib="${EPREFIX}/usr/$(get_libdir)/apulse"
+ ewarn "media-sound/apulse with -sdk use flag detected!"
+ ewarn "Firefox-bin will be installed with a wrapper, that attempts to load"
+ ewarn "apulse instead of pipewire/pulseadio. This may lead to sound issues."
+ ewarn "Please either enable sdk use flag for apulse, or remove apulse"
+ ewarn "completely and re-install firefox-bin to utilize pipewire/pulseaudio instead."
+ fi
+
+ sed -i \
+ -e "s:@NAME@:${app_name}:" \
+ -e "s:@EXEC@:${exec_command}:" \
+ -e "s:@ICON@:${icon}:" \
+ "${WORKDIR}/${PN}.desktop-template" \
+ || die
+
+ newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}"
+
+ rm "${WORKDIR}/${PN}.desktop-template" || die
+
+ # Install wrapper script
+ [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}"
+ newbin "${FILESDIR}/${PN}-r1.sh" ${PN}
+
+ # Update wrapper
+ sed -i \
+ -e "s:@PREFIX@:${EPREFIX}/usr:" \
+ -e "s:@MOZ_FIVE_HOME@:${EPREFIX}${MOZILLA_FIVE_HOME}:" \
+ -e "s:@APULSELIB_DIR@:${apulselib}:" \
+ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \
+ "${ED}/usr/bin/${PN}" \
+ || die
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+
+ if ! use gmp-autoupdate ; then
+ elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"
+ elog "installing into new profiles:"
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ elog "\t ${plugin}"
+ done
+ elog
+ fi
+
+ local show_doh_information show_normandy_information
+
+ if [[ -z "${REPLACING_VERSIONS}" ]] ; then
+ # New install; Tell user that DoH is disabled by default
+ show_doh_information=yes
+ show_normandy_information=yes
+ fi
+
+ if [[ -n "${show_doh_information}" ]] ; then
+ elog
+ elog "Note regarding Trusted Recursive Resolver aka DNS-over-HTTPS (DoH):"
+ elog "Due to privacy concerns (encrypting DNS might be a good thing, sending all"
+ elog "DNS traffic to Cloudflare by default is not a good idea and applications"
+ elog "should respect OS configured settings), \"network.trr.mode\" was set to 5"
+ elog "(\"Off by choice\") by default."
+ elog "You can enable DNS-over-HTTPS in ${PN^}'s preferences."
+ fi
+
+ # bug 713782
+ if [[ -n "${show_normandy_information}" ]] ; then
+ elog
+ elog "Upstream operates a service named Normandy which allows Mozilla to"
+ elog "push changes for default settings or even install new add-ons remotely."
+ elog "While this can be useful to address problems like 'Armagadd-on 2.0' or"
+ elog "revert previous decisions to disable TLS 1.0/1.1, privacy and security"
+ elog "concerns prevail, which is why we have switched off the use of this"
+ elog "service by default."
+ elog
+ elog "To re-enable this service set"
+ elog
+ elog " app.normandy.enabled=true"
+ elog
+ elog "in about:config."
+ fi
+
+ optfeature_header "Optional programs for extra features:"
+ optfeature "speech syntesis (text-to-speech) support" app-accessibility/speech-dispatcher
+ optfeature "fallback mouse cursor theme e.g. on WMs" gnome-base/gsettings-desktop-schemas
+ # optfeature "ffmpeg-based audio/video codec support, required for HTML5 video rendering" media-video/ffmpeg
+ optfeature "desktop notifications" x11-libs/libnotify
+}
diff --git a/www-client/firefox-bin/firefox-bin-151.0.1.ebuild b/www-client/firefox-bin/firefox-bin-151.0.1.ebuild
new file mode 100644
index 000000000000..1ff8b0e28522
--- /dev/null
+++ b/www-client/firefox-bin/firefox-bin-151.0.1.ebuild
@@ -0,0 +1,360 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+ SLOT="esr"
+else
+ HOMEPAGE="https://www.firefox.com"
+ SLOT="rapid"
+fi
+
+MOZ_PN="${PN%-bin}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+inherit desktop linux-info optfeature pax-utils xdg
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+SRC_URI="amd64? ( ${MOZ_SRC_BASE_URI}/linux-x86_64/en-US/${MOZ_P}.tar.xz -> ${PN}_x86_64-${PV}.tar.xz )
+ arm64? ( ${MOZ_SRC_BASE_URI}/linux-aarch64/en-US/${MOZ_P}.tar.xz -> ${PN}_aarch64-${PV}.tar.xz )"
+
+DESCRIPTION="Firefox Web Browser"
+
+KEYWORDS="-* amd64 ~arm64"
+LICENSE="MPL-2.0 GPL-2 LGPL-2.1"
+IUSE="+gmp-autoupdate selinux wayland"
+
+RESTRICT="strip"
+
+BDEPEND="app-arch/unzip"
+RDEPEND="${DEPEND}
+ !www-client/firefox-bin:0
+ || (
+ media-libs/libpulse
+ media-sound/apulse
+ )
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ >=dev-libs/glib-2.26:2
+ media-libs/alsa-lib
+ media-libs/fontconfig
+ >=media-libs/freetype-2.4.10
+ media-video/ffmpeg
+ sys-apps/dbus
+ virtual/freedesktop-icon-theme
+ >=x11-libs/cairo-1.10[X]
+ x11-libs/gdk-pixbuf:2
+ >=x11-libs/gtk+-3.11:3[X,wayland?]
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXcursor
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXi
+ x11-libs/libXrandr
+ x11-libs/libXrender
+ x11-libs/libxcb
+ >=x11-libs/pango-1.22.0
+ selinux? ( sec-policy/selinux-mozilla )
+"
+
+# ESR and rapid dependencies.
+if [[ -n ${MOZ_ESR} ]] ; then
+ RDEPEND+=" !www-client/firefox-bin:rapid"
+else
+ RDEPEND+=" !www-client/firefox-bin:esr"
+fi
+
+QA_PREBUILT="opt/${MOZ_PN}/*"
+
+# Allow MOZ_GMP_PLUGIN_LIST to be set in an eclass or
+# overridden in the enviromnent (advanced hackers only)
+if [[ -z "${MOZ_GMP_PLUGIN_LIST+set}" ]] ; then
+ MOZ_GMP_PLUGIN_LIST=( gmp-gmpopenh264 gmp-widevinecdm )
+fi
+
+MOZ_LANGS=(
+ ach af an ar ast az be bg bn br bs ca-valencia ca cak cs cy
+ da de dsb el en-CA en-GB en-US eo es-AR es-CL es-ES es-MX et eu
+ fa ff fi fr fy-NL ga-IE gd gl gn gu-IN he hi-IN hr hsb hu hy-AM
+ ia id is it ja ka kab kk km kn ko lij lt lv mk mr ms my
+ nb-NO ne-NP nl nn-NO oc pa-IN pl pt-BR pt-PT rm ro ru sco
+ si sk skr sl son sq sr sv-SE ta te th tl tr trs uk ur uz vi
+ xh zh-CN zh-TW
+)
+
+mozilla_set_globals() {
+ # https://bugs.gentoo.org/587334
+ local MOZ_TOO_REGIONALIZED_FOR_L10N=(
+ fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE
+ )
+
+ local lang xflag
+ for lang in "${MOZ_LANGS[@]}" ; do
+ # en and en_US are handled internally
+ if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then
+ continue
+ fi
+
+ # strip region subtag if $lang is in the list
+ if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then
+ xflag=${lang%%-*}
+ else
+ xflag=${lang}
+ fi
+
+ SRC_URI+=" l10n_${xflag/[_@]/-}? ("
+ SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi"
+ SRC_URI+=" )"
+ IUSE+=" l10n_${xflag/[_@]/-}"
+ done
+}
+mozilla_set_globals
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+pkg_setup() {
+ CONFIG_CHECK="~SECCOMP"
+ WARNING_SECCOMP="CONFIG_SECCOMP not set! This system will be unable to play DRM-protected content."
+
+ linux-info_pkg_setup
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ mkdir "${S}" || die
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ MY_SRC_FILE=${_src_file}
+ fi
+ done
+}
+
+src_install() {
+ # Set MOZILLA_FIVE_HOME
+ local MOZILLA_FIVE_HOME="/opt/${MOZ_PN}"
+
+ dodir /opt
+ pushd "${ED}"/opt &>/dev/null || die
+ unpack "${MY_SRC_FILE}"
+ popd &>/dev/null || die
+
+ pax-mark m \
+ "${ED}${MOZILLA_FIVE_HOME}"/${MOZ_PN} \
+ "${ED}${MOZILLA_FIVE_HOME}"/${MOZ_PN}-bin \
+ "${ED}${MOZILLA_FIVE_HOME}"/plugin-container
+
+ # Install policy (currently only used to disable application updates)
+ insinto "${MOZILLA_FIVE_HOME}/distribution"
+ newins "${FILESDIR}"/disable-auto-update.policy.json policies.json
+
+ # Install system-wide preferences
+ local PREFS_DIR="${MOZILLA_FIVE_HOME}/browser/defaults/preferences"
+ insinto "${PREFS_DIR}"
+ newins "${FILESDIR}"/gentoo-default-prefs.js all-gentoo.js
+
+ local GENTOO_PREFS="${ED}${PREFS_DIR}/all-gentoo.js"
+
+ if ! use gmp-autoupdate ; then
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ einfo "Disabling auto-update for ${plugin} plugin ..."
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable autoupdate for ${plugin} media plugin"
+ pref("media.${plugin}.autoupdate", false);
+ EOF
+ done
+ fi
+
+ # Install language packs
+ local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') )
+ if [[ -n "${langpacks}" ]] ; then
+ moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}"
+ fi
+
+ # Install icons
+ local icon_srcdir="${ED}/${MOZILLA_FIVE_HOME}/browser/chrome/icons/default"
+ local icon_symbolic_file="${FILESDIR}/firefox-symbolic.svg"
+
+ insinto /usr/share/icons/hicolor/symbolic/apps
+ newins "${icon_symbolic_file}" ${PN}-symbolic.svg
+
+ local icon size
+ for icon in "${icon_srcdir}"/default*.png ; do
+ size=${icon%.png}
+ size=${size##*/default}
+
+ if [[ ${size} -eq 48 ]] ; then
+ newicon "${icon}" ${PN}.png
+ fi
+
+ newicon -s ${size} "${icon}" ${PN}.png
+ done
+
+ # Install menu
+ local app_name="Mozilla ${MOZ_PN^} (bin)"
+ local desktop_file="${FILESDIR}/${PN}-r3.desktop"
+ local desktop_filename="${PN}.desktop"
+ local exec_command="${PN} --name=firefox-bin"
+ local icon="${PN}"
+ local use_wayland="false"
+
+ if use wayland ; then
+ use_wayland="true"
+ fi
+
+ cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die
+
+ # Add apulse support through our wrapper shell launcher, patchelf-method broken since 119.0.
+ # See bgo#916230, bgo#941873
+ local apulselib=
+ if has_version -r media-sound/apulse[-sdk] ; then
+ apulselib="${EPREFIX}/usr/$(get_libdir)/apulse"
+ ewarn "media-sound/apulse with -sdk use flag detected!"
+ ewarn "Firefox-bin will be installed with a wrapper, that attempts to load"
+ ewarn "apulse instead of pipewire/pulseadio. This may lead to sound issues."
+ ewarn "Please either enable sdk use flag for apulse, or remove apulse"
+ ewarn "completely and re-install firefox-bin to utilize pipewire/pulseaudio instead."
+ fi
+
+ sed -i \
+ -e "s:@NAME@:${app_name}:" \
+ -e "s:@EXEC@:${exec_command}:" \
+ -e "s:@ICON@:${icon}:" \
+ "${WORKDIR}/${PN}.desktop-template" \
+ || die
+
+ newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}"
+
+ rm "${WORKDIR}/${PN}.desktop-template" || die
+
+ # Install wrapper script
+ [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}"
+ newbin "${FILESDIR}/${PN}-r1.sh" ${PN}
+
+ # Update wrapper
+ sed -i \
+ -e "s:@PREFIX@:${EPREFIX}/usr:" \
+ -e "s:@MOZ_FIVE_HOME@:${EPREFIX}${MOZILLA_FIVE_HOME}:" \
+ -e "s:@APULSELIB_DIR@:${apulselib}:" \
+ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \
+ "${ED}/usr/bin/${PN}" \
+ || die
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+
+ if ! use gmp-autoupdate ; then
+ elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"
+ elog "installing into new profiles:"
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ elog "\t ${plugin}"
+ done
+ elog
+ fi
+
+ local show_doh_information show_normandy_information
+
+ if [[ -z "${REPLACING_VERSIONS}" ]] ; then
+ # New install; Tell user that DoH is disabled by default
+ show_doh_information=yes
+ show_normandy_information=yes
+ fi
+
+ if [[ -n "${show_doh_information}" ]] ; then
+ elog
+ elog "Note regarding Trusted Recursive Resolver aka DNS-over-HTTPS (DoH):"
+ elog "Due to privacy concerns (encrypting DNS might be a good thing, sending all"
+ elog "DNS traffic to Cloudflare by default is not a good idea and applications"
+ elog "should respect OS configured settings), \"network.trr.mode\" was set to 5"
+ elog "(\"Off by choice\") by default."
+ elog "You can enable DNS-over-HTTPS in ${PN^}'s preferences."
+ fi
+
+ # bug 713782
+ if [[ -n "${show_normandy_information}" ]] ; then
+ elog
+ elog "Upstream operates a service named Normandy which allows Mozilla to"
+ elog "push changes for default settings or even install new add-ons remotely."
+ elog "While this can be useful to address problems like 'Armagadd-on 2.0' or"
+ elog "revert previous decisions to disable TLS 1.0/1.1, privacy and security"
+ elog "concerns prevail, which is why we have switched off the use of this"
+ elog "service by default."
+ elog
+ elog "To re-enable this service set"
+ elog
+ elog " app.normandy.enabled=true"
+ elog
+ elog "in about:config."
+ fi
+
+ optfeature_header "Optional programs for extra features:"
+ optfeature "speech syntesis (text-to-speech) support" app-accessibility/speech-dispatcher
+ optfeature "fallback mouse cursor theme e.g. on WMs" gnome-base/gsettings-desktop-schemas
+ # optfeature "ffmpeg-based audio/video codec support, required for HTML5 video rendering" media-video/ffmpeg
+ optfeature "desktop notifications" x11-libs/libnotify
+}
diff --git a/www-client/firefox-bin/firefox-bin-151.0.2.ebuild b/www-client/firefox-bin/firefox-bin-151.0.2.ebuild
new file mode 100644
index 000000000000..dea9320c7c9c
--- /dev/null
+++ b/www-client/firefox-bin/firefox-bin-151.0.2.ebuild
@@ -0,0 +1,359 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+ SLOT="esr"
+else
+ HOMEPAGE="https://www.firefox.com"
+ SLOT="rapid"
+fi
+
+MOZ_PN="${PN%-bin}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+inherit desktop linux-info optfeature pax-utils xdg
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+SRC_URI="amd64? ( ${MOZ_SRC_BASE_URI}/linux-x86_64/en-US/${MOZ_P}.tar.xz -> ${PN}_x86_64-${PV}.tar.xz )
+ arm64? ( ${MOZ_SRC_BASE_URI}/linux-aarch64/en-US/${MOZ_P}.tar.xz -> ${PN}_aarch64-${PV}.tar.xz )"
+
+DESCRIPTION="Firefox Web Browser"
+
+KEYWORDS="-* amd64 ~arm64"
+LICENSE="MPL-2.0 GPL-2 LGPL-2.1"
+IUSE="+gmp-autoupdate selinux wayland"
+
+RESTRICT="strip"
+
+BDEPEND="app-arch/unzip"
+RDEPEND="${DEPEND}
+ !www-client/firefox-bin:0
+ || (
+ media-libs/libpulse
+ media-sound/apulse
+ )
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ >=dev-libs/glib-2.26:2
+ media-libs/alsa-lib
+ media-libs/fontconfig
+ >=media-libs/freetype-2.4.10
+ media-video/ffmpeg
+ sys-apps/dbus
+ virtual/freedesktop-icon-theme
+ >=x11-libs/cairo-1.10[X]
+ x11-libs/gdk-pixbuf:2
+ >=x11-libs/gtk+-3.11:3[X,wayland?]
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXcursor
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXi
+ x11-libs/libXrandr
+ x11-libs/libXrender
+ x11-libs/libxcb
+ >=x11-libs/pango-1.22.0
+ selinux? ( sec-policy/selinux-mozilla )
+"
+
+# ESR and rapid dependencies.
+if [[ -n ${MOZ_ESR} ]] ; then
+ RDEPEND+=" !www-client/firefox-bin:rapid"
+else
+ RDEPEND+=" !www-client/firefox-bin:esr"
+fi
+
+QA_PREBUILT="opt/${MOZ_PN}/*"
+
+# Allow MOZ_GMP_PLUGIN_LIST to be set in an eclass or
+# overridden in the enviromnent (advanced hackers only)
+if [[ -z "${MOZ_GMP_PLUGIN_LIST+set}" ]] ; then
+ MOZ_GMP_PLUGIN_LIST=( gmp-gmpopenh264 gmp-widevinecdm )
+fi
+
+MOZ_LANGS=(
+ ach af an ar ast az be bg bn br bs ca-valencia ca cak cs cy
+ da de dsb el en-CA en-GB en-US eo es-AR es-CL es-ES es-MX et eu
+ fa ff fi fr fy-NL ga-IE gd gl gn gu-IN he hi-IN hr hsb hu hy-AM
+ ia id is it ja ka kab kk km kn ko lij lt lv mk mr ms my
+ nb-NO ne-NP nl nn-NO oc pa-IN pl pt-BR pt-PT rm ro ru sco
+ si sk skr sl son sq sr sv-SE ta te th tl tr trs uk ur uz vi
+ xh zh-CN zh-TW
+)
+
+mozilla_set_globals() {
+ # https://bugs.gentoo.org/587334
+ local MOZ_TOO_REGIONALIZED_FOR_L10N=(
+ fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE
+ )
+
+ local lang xflag
+ for lang in "${MOZ_LANGS[@]}" ; do
+ # en and en_US are handled internally
+ if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then
+ continue
+ fi
+
+ # strip region subtag if $lang is in the list
+ if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then
+ xflag=${lang%%-*}
+ else
+ xflag=${lang}
+ fi
+
+ SRC_URI+=" l10n_${xflag/[_@]/-}? ("
+ SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi"
+ SRC_URI+=" )"
+ IUSE+=" l10n_${xflag/[_@]/-}"
+ done
+}
+mozilla_set_globals
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+pkg_setup() {
+ CONFIG_CHECK="~SECCOMP"
+ WARNING_SECCOMP="CONFIG_SECCOMP not set! This system will be unable to play DRM-protected content."
+
+ linux-info_pkg_setup
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ mkdir "${S}" || die
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ MY_SRC_FILE=${_src_file}
+ fi
+ done
+}
+
+src_install() {
+ # Set MOZILLA_FIVE_HOME
+ local MOZILLA_FIVE_HOME="/opt/${MOZ_PN}"
+
+ dodir /opt
+ pushd "${ED}"/opt &>/dev/null || die
+ unpack "${MY_SRC_FILE}"
+ popd &>/dev/null || die
+
+ pax-mark m \
+ "${ED}${MOZILLA_FIVE_HOME}"/${MOZ_PN} \
+ "${ED}${MOZILLA_FIVE_HOME}"/${MOZ_PN}-bin \
+ "${ED}${MOZILLA_FIVE_HOME}"/plugin-container
+
+ # Prevent auto-updater from popping up.
+ echo "This installation is managed by Gentoo's package manager." > "${ED}${MOZILLA_FIVE_HOME}"/is-packaged-app
+
+ # Install system-wide preferences
+ local PREFS_DIR="${MOZILLA_FIVE_HOME}/browser/defaults/preferences"
+ insinto "${PREFS_DIR}"
+ newins "${FILESDIR}"/gentoo-default-prefs.js all-gentoo.js
+
+ local GENTOO_PREFS="${ED}${PREFS_DIR}/all-gentoo.js"
+
+ if ! use gmp-autoupdate ; then
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ einfo "Disabling auto-update for ${plugin} plugin ..."
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable autoupdate for ${plugin} media plugin"
+ pref("media.${plugin}.autoupdate", false);
+ EOF
+ done
+ fi
+
+ # Install language packs
+ local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') )
+ if [[ -n "${langpacks}" ]] ; then
+ moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}"
+ fi
+
+ # Install icons
+ local icon_srcdir="${ED}/${MOZILLA_FIVE_HOME}/browser/chrome/icons/default"
+ local icon_symbolic_file="${FILESDIR}/firefox-symbolic.svg"
+
+ insinto /usr/share/icons/hicolor/symbolic/apps
+ newins "${icon_symbolic_file}" ${PN}-symbolic.svg
+
+ local icon size
+ for icon in "${icon_srcdir}"/default*.png ; do
+ size=${icon%.png}
+ size=${size##*/default}
+
+ if [[ ${size} -eq 48 ]] ; then
+ newicon "${icon}" ${PN}.png
+ fi
+
+ newicon -s ${size} "${icon}" ${PN}.png
+ done
+
+ # Install menu
+ local app_name="Mozilla ${MOZ_PN^} (bin)"
+ local desktop_file="${FILESDIR}/${PN}-r3.desktop"
+ local desktop_filename="${PN}.desktop"
+ local exec_command="${PN} --name=firefox-bin"
+ local icon="${PN}"
+ local use_wayland="false"
+
+ if use wayland ; then
+ use_wayland="true"
+ fi
+
+ cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die
+
+ # Add apulse support through our wrapper shell launcher, patchelf-method broken since 119.0.
+ # See bgo#916230, bgo#941873
+ local apulselib=
+ if has_version -r media-sound/apulse[-sdk] ; then
+ apulselib="${EPREFIX}/usr/$(get_libdir)/apulse"
+ ewarn "media-sound/apulse with -sdk use flag detected!"
+ ewarn "Firefox-bin will be installed with a wrapper, that attempts to load"
+ ewarn "apulse instead of pipewire/pulseadio. This may lead to sound issues."
+ ewarn "Please either enable sdk use flag for apulse, or remove apulse"
+ ewarn "completely and re-install firefox-bin to utilize pipewire/pulseaudio instead."
+ fi
+
+ sed -i \
+ -e "s:@NAME@:${app_name}:" \
+ -e "s:@EXEC@:${exec_command}:" \
+ -e "s:@ICON@:${icon}:" \
+ "${WORKDIR}/${PN}.desktop-template" \
+ || die
+
+ newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}"
+
+ rm "${WORKDIR}/${PN}.desktop-template" || die
+
+ # Install wrapper script
+ [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}"
+ newbin "${FILESDIR}/${PN}-r1.sh" ${PN}
+
+ # Update wrapper
+ sed -i \
+ -e "s:@PREFIX@:${EPREFIX}/usr:" \
+ -e "s:@MOZ_FIVE_HOME@:${EPREFIX}${MOZILLA_FIVE_HOME}:" \
+ -e "s:@APULSELIB_DIR@:${apulselib}:" \
+ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \
+ "${ED}/usr/bin/${PN}" \
+ || die
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+
+ if ! use gmp-autoupdate ; then
+ elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"
+ elog "installing into new profiles:"
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ elog "\t ${plugin}"
+ done
+ elog
+ fi
+
+ local show_doh_information show_normandy_information
+
+ if [[ -z "${REPLACING_VERSIONS}" ]] ; then
+ # New install; Tell user that DoH is disabled by default
+ show_doh_information=yes
+ show_normandy_information=yes
+ fi
+
+ if [[ -n "${show_doh_information}" ]] ; then
+ elog
+ elog "Note regarding Trusted Recursive Resolver aka DNS-over-HTTPS (DoH):"
+ elog "Due to privacy concerns (encrypting DNS might be a good thing, sending all"
+ elog "DNS traffic to Cloudflare by default is not a good idea and applications"
+ elog "should respect OS configured settings), \"network.trr.mode\" was set to 5"
+ elog "(\"Off by choice\") by default."
+ elog "You can enable DNS-over-HTTPS in ${PN^}'s preferences."
+ fi
+
+ # bug 713782
+ if [[ -n "${show_normandy_information}" ]] ; then
+ elog
+ elog "Upstream operates a service named Normandy which allows Mozilla to"
+ elog "push changes for default settings or even install new add-ons remotely."
+ elog "While this can be useful to address problems like 'Armagadd-on 2.0' or"
+ elog "revert previous decisions to disable TLS 1.0/1.1, privacy and security"
+ elog "concerns prevail, which is why we have switched off the use of this"
+ elog "service by default."
+ elog
+ elog "To re-enable this service set"
+ elog
+ elog " app.normandy.enabled=true"
+ elog
+ elog "in about:config."
+ fi
+
+ optfeature_header "Optional programs for extra features:"
+ optfeature "speech syntesis (text-to-speech) support" app-accessibility/speech-dispatcher
+ optfeature "fallback mouse cursor theme e.g. on WMs" gnome-base/gsettings-desktop-schemas
+ # optfeature "ffmpeg-based audio/video codec support, required for HTML5 video rendering" media-video/ffmpeg
+ optfeature "desktop notifications" x11-libs/libnotify
+}
diff --git a/www-client/firefox-bin/firefox-bin-151.0.ebuild b/www-client/firefox-bin/firefox-bin-151.0.ebuild
new file mode 100644
index 000000000000..1ff8b0e28522
--- /dev/null
+++ b/www-client/firefox-bin/firefox-bin-151.0.ebuild
@@ -0,0 +1,360 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+ SLOT="esr"
+else
+ HOMEPAGE="https://www.firefox.com"
+ SLOT="rapid"
+fi
+
+MOZ_PN="${PN%-bin}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+inherit desktop linux-info optfeature pax-utils xdg
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+SRC_URI="amd64? ( ${MOZ_SRC_BASE_URI}/linux-x86_64/en-US/${MOZ_P}.tar.xz -> ${PN}_x86_64-${PV}.tar.xz )
+ arm64? ( ${MOZ_SRC_BASE_URI}/linux-aarch64/en-US/${MOZ_P}.tar.xz -> ${PN}_aarch64-${PV}.tar.xz )"
+
+DESCRIPTION="Firefox Web Browser"
+
+KEYWORDS="-* amd64 ~arm64"
+LICENSE="MPL-2.0 GPL-2 LGPL-2.1"
+IUSE="+gmp-autoupdate selinux wayland"
+
+RESTRICT="strip"
+
+BDEPEND="app-arch/unzip"
+RDEPEND="${DEPEND}
+ !www-client/firefox-bin:0
+ || (
+ media-libs/libpulse
+ media-sound/apulse
+ )
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ >=dev-libs/glib-2.26:2
+ media-libs/alsa-lib
+ media-libs/fontconfig
+ >=media-libs/freetype-2.4.10
+ media-video/ffmpeg
+ sys-apps/dbus
+ virtual/freedesktop-icon-theme
+ >=x11-libs/cairo-1.10[X]
+ x11-libs/gdk-pixbuf:2
+ >=x11-libs/gtk+-3.11:3[X,wayland?]
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXcursor
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXi
+ x11-libs/libXrandr
+ x11-libs/libXrender
+ x11-libs/libxcb
+ >=x11-libs/pango-1.22.0
+ selinux? ( sec-policy/selinux-mozilla )
+"
+
+# ESR and rapid dependencies.
+if [[ -n ${MOZ_ESR} ]] ; then
+ RDEPEND+=" !www-client/firefox-bin:rapid"
+else
+ RDEPEND+=" !www-client/firefox-bin:esr"
+fi
+
+QA_PREBUILT="opt/${MOZ_PN}/*"
+
+# Allow MOZ_GMP_PLUGIN_LIST to be set in an eclass or
+# overridden in the enviromnent (advanced hackers only)
+if [[ -z "${MOZ_GMP_PLUGIN_LIST+set}" ]] ; then
+ MOZ_GMP_PLUGIN_LIST=( gmp-gmpopenh264 gmp-widevinecdm )
+fi
+
+MOZ_LANGS=(
+ ach af an ar ast az be bg bn br bs ca-valencia ca cak cs cy
+ da de dsb el en-CA en-GB en-US eo es-AR es-CL es-ES es-MX et eu
+ fa ff fi fr fy-NL ga-IE gd gl gn gu-IN he hi-IN hr hsb hu hy-AM
+ ia id is it ja ka kab kk km kn ko lij lt lv mk mr ms my
+ nb-NO ne-NP nl nn-NO oc pa-IN pl pt-BR pt-PT rm ro ru sco
+ si sk skr sl son sq sr sv-SE ta te th tl tr trs uk ur uz vi
+ xh zh-CN zh-TW
+)
+
+mozilla_set_globals() {
+ # https://bugs.gentoo.org/587334
+ local MOZ_TOO_REGIONALIZED_FOR_L10N=(
+ fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE
+ )
+
+ local lang xflag
+ for lang in "${MOZ_LANGS[@]}" ; do
+ # en and en_US are handled internally
+ if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then
+ continue
+ fi
+
+ # strip region subtag if $lang is in the list
+ if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then
+ xflag=${lang%%-*}
+ else
+ xflag=${lang}
+ fi
+
+ SRC_URI+=" l10n_${xflag/[_@]/-}? ("
+ SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi"
+ SRC_URI+=" )"
+ IUSE+=" l10n_${xflag/[_@]/-}"
+ done
+}
+mozilla_set_globals
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+pkg_setup() {
+ CONFIG_CHECK="~SECCOMP"
+ WARNING_SECCOMP="CONFIG_SECCOMP not set! This system will be unable to play DRM-protected content."
+
+ linux-info_pkg_setup
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ mkdir "${S}" || die
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ MY_SRC_FILE=${_src_file}
+ fi
+ done
+}
+
+src_install() {
+ # Set MOZILLA_FIVE_HOME
+ local MOZILLA_FIVE_HOME="/opt/${MOZ_PN}"
+
+ dodir /opt
+ pushd "${ED}"/opt &>/dev/null || die
+ unpack "${MY_SRC_FILE}"
+ popd &>/dev/null || die
+
+ pax-mark m \
+ "${ED}${MOZILLA_FIVE_HOME}"/${MOZ_PN} \
+ "${ED}${MOZILLA_FIVE_HOME}"/${MOZ_PN}-bin \
+ "${ED}${MOZILLA_FIVE_HOME}"/plugin-container
+
+ # Install policy (currently only used to disable application updates)
+ insinto "${MOZILLA_FIVE_HOME}/distribution"
+ newins "${FILESDIR}"/disable-auto-update.policy.json policies.json
+
+ # Install system-wide preferences
+ local PREFS_DIR="${MOZILLA_FIVE_HOME}/browser/defaults/preferences"
+ insinto "${PREFS_DIR}"
+ newins "${FILESDIR}"/gentoo-default-prefs.js all-gentoo.js
+
+ local GENTOO_PREFS="${ED}${PREFS_DIR}/all-gentoo.js"
+
+ if ! use gmp-autoupdate ; then
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ einfo "Disabling auto-update for ${plugin} plugin ..."
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable autoupdate for ${plugin} media plugin"
+ pref("media.${plugin}.autoupdate", false);
+ EOF
+ done
+ fi
+
+ # Install language packs
+ local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') )
+ if [[ -n "${langpacks}" ]] ; then
+ moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}"
+ fi
+
+ # Install icons
+ local icon_srcdir="${ED}/${MOZILLA_FIVE_HOME}/browser/chrome/icons/default"
+ local icon_symbolic_file="${FILESDIR}/firefox-symbolic.svg"
+
+ insinto /usr/share/icons/hicolor/symbolic/apps
+ newins "${icon_symbolic_file}" ${PN}-symbolic.svg
+
+ local icon size
+ for icon in "${icon_srcdir}"/default*.png ; do
+ size=${icon%.png}
+ size=${size##*/default}
+
+ if [[ ${size} -eq 48 ]] ; then
+ newicon "${icon}" ${PN}.png
+ fi
+
+ newicon -s ${size} "${icon}" ${PN}.png
+ done
+
+ # Install menu
+ local app_name="Mozilla ${MOZ_PN^} (bin)"
+ local desktop_file="${FILESDIR}/${PN}-r3.desktop"
+ local desktop_filename="${PN}.desktop"
+ local exec_command="${PN} --name=firefox-bin"
+ local icon="${PN}"
+ local use_wayland="false"
+
+ if use wayland ; then
+ use_wayland="true"
+ fi
+
+ cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die
+
+ # Add apulse support through our wrapper shell launcher, patchelf-method broken since 119.0.
+ # See bgo#916230, bgo#941873
+ local apulselib=
+ if has_version -r media-sound/apulse[-sdk] ; then
+ apulselib="${EPREFIX}/usr/$(get_libdir)/apulse"
+ ewarn "media-sound/apulse with -sdk use flag detected!"
+ ewarn "Firefox-bin will be installed with a wrapper, that attempts to load"
+ ewarn "apulse instead of pipewire/pulseadio. This may lead to sound issues."
+ ewarn "Please either enable sdk use flag for apulse, or remove apulse"
+ ewarn "completely and re-install firefox-bin to utilize pipewire/pulseaudio instead."
+ fi
+
+ sed -i \
+ -e "s:@NAME@:${app_name}:" \
+ -e "s:@EXEC@:${exec_command}:" \
+ -e "s:@ICON@:${icon}:" \
+ "${WORKDIR}/${PN}.desktop-template" \
+ || die
+
+ newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}"
+
+ rm "${WORKDIR}/${PN}.desktop-template" || die
+
+ # Install wrapper script
+ [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}"
+ newbin "${FILESDIR}/${PN}-r1.sh" ${PN}
+
+ # Update wrapper
+ sed -i \
+ -e "s:@PREFIX@:${EPREFIX}/usr:" \
+ -e "s:@MOZ_FIVE_HOME@:${EPREFIX}${MOZILLA_FIVE_HOME}:" \
+ -e "s:@APULSELIB_DIR@:${apulselib}:" \
+ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \
+ "${ED}/usr/bin/${PN}" \
+ || die
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+
+ if ! use gmp-autoupdate ; then
+ elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"
+ elog "installing into new profiles:"
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ elog "\t ${plugin}"
+ done
+ elog
+ fi
+
+ local show_doh_information show_normandy_information
+
+ if [[ -z "${REPLACING_VERSIONS}" ]] ; then
+ # New install; Tell user that DoH is disabled by default
+ show_doh_information=yes
+ show_normandy_information=yes
+ fi
+
+ if [[ -n "${show_doh_information}" ]] ; then
+ elog
+ elog "Note regarding Trusted Recursive Resolver aka DNS-over-HTTPS (DoH):"
+ elog "Due to privacy concerns (encrypting DNS might be a good thing, sending all"
+ elog "DNS traffic to Cloudflare by default is not a good idea and applications"
+ elog "should respect OS configured settings), \"network.trr.mode\" was set to 5"
+ elog "(\"Off by choice\") by default."
+ elog "You can enable DNS-over-HTTPS in ${PN^}'s preferences."
+ fi
+
+ # bug 713782
+ if [[ -n "${show_normandy_information}" ]] ; then
+ elog
+ elog "Upstream operates a service named Normandy which allows Mozilla to"
+ elog "push changes for default settings or even install new add-ons remotely."
+ elog "While this can be useful to address problems like 'Armagadd-on 2.0' or"
+ elog "revert previous decisions to disable TLS 1.0/1.1, privacy and security"
+ elog "concerns prevail, which is why we have switched off the use of this"
+ elog "service by default."
+ elog
+ elog "To re-enable this service set"
+ elog
+ elog " app.normandy.enabled=true"
+ elog
+ elog "in about:config."
+ fi
+
+ optfeature_header "Optional programs for extra features:"
+ optfeature "speech syntesis (text-to-speech) support" app-accessibility/speech-dispatcher
+ optfeature "fallback mouse cursor theme e.g. on WMs" gnome-base/gsettings-desktop-schemas
+ # optfeature "ffmpeg-based audio/video codec support, required for HTML5 video rendering" media-video/ffmpeg
+ optfeature "desktop notifications" x11-libs/libnotify
+}
diff --git a/www-client/firefox-bin/metadata.xml b/www-client/firefox-bin/metadata.xml
index 46f7168bc339..fe42a666f874 100644
--- a/www-client/firefox-bin/metadata.xml
+++ b/www-client/firefox-bin/metadata.xml
@@ -14,5 +14,5 @@
downloaded and kept up-to-date in user profiles
</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/firefox-l10n/Manifest b/www-client/firefox-l10n/Manifest
index c04d0af5d75b..c88949c18bea 100644
--- a/www-client/firefox-l10n/Manifest
+++ b/www-client/firefox-l10n/Manifest
@@ -298,3 +298,303 @@ DIST firefox-150.0.3-vi.xpi 506466 BLAKE2B 6cd2f55354c87d9442e69395cb384d920dcce
DIST firefox-150.0.3-xh.xpi 274408 BLAKE2B 8c1cbd81f8798441c6e8dfd114bfc591322ea7cfdffed525f8c09d89793172363434b5edfa744aacf30796973e27cd6a7b2bef39e89d4bd5c88ec71e5fd23f6a SHA512 c7a34ff8c10c28755eda05b37d88a12a7e3b221e1bcf21b86fd64dd5229337f3ad05ad03d77e9c930e4b43e5930efe2fd83f5b3c0915890e310679ae9620a98c
DIST firefox-150.0.3-zh-CN.xpi 496925 BLAKE2B dea5dfed3f372ace154f66ce6b3640207c986bf19dce1cf6d3fcf79b122344a2a1a05d3dc9572939b1b4c05f1b76aedee5b39411c6c61734364a6ce4824d1358 SHA512 91008e13701a21deedcc98a446a1b5ddda7fdd3fe9d30cd417a6a84dd6cd380852497f0ca4d7c944057e36e22ed5637c03c37ebaf2b9b2236a40594092957561
DIST firefox-150.0.3-zh-TW.xpi 500888 BLAKE2B d7cf2ec863e464ea1c77854eafc177d686046343c5b255a1496403da19fc7502108c3de6d7eaecccd4409a6847075518c30eabff7852e9a1e07c9d3f3af57d8c SHA512 1703875635a9be5af0563d18cc771e987fa66da334c7e7351eb5f1954ef88f60f83c1d2022380bf94f648bc7bca3d9a1dbdf0511127b55058a6217d1f8efb49b
+DIST firefox-151.0-ach.xpi 295671 BLAKE2B 8581588f1f5b095721a810bad2b8d67a4453c4bf32d4f4177ca7be9ffb755ab89de1487451d271b2a06ae039b51aed4345381f89c6cbe75cd0ef15f57090d029 SHA512 0c44ed4a1f393d59b30de7acf11a9eeabd9d127e7fa6dafe5913dec820184098cb7623867f28e49a09d1e15f866d812f6ae5c4c3f068a211ddbff87934951241
+DIST firefox-151.0-af.xpi 269171 BLAKE2B 184c7619eb0d0dc11e67db7c13b05b5f15965f24f07031aef2881b203dbb125dc5a60cd8a9406d7726c9a58a5fcdff065d626d5bb3b75678464ccdb56e372ca4 SHA512 c22bc94d978ddea30ba2c5ca6e6f89c30ecfe7a1367092dca1003f88483dc092cb5b4043444441885f5b85e2c4da0d219c5a7e9ec723a0a55e40f8283c1b6661
+DIST firefox-151.0-an.xpi 332680 BLAKE2B 4bfdd029b269547d28e26a983bda2c7776fcd5e3da9661945c9c15b419683c34084a15aa240ea39f0f7519b2ff966112a319a4aee3a34dea3880c94a9dcc0004 SHA512 ec262edd512003381fc8e09ade7e20950e283cef04dbc9b7e999ee4b00f255f3a01767fd8919867183604a232986283d8e59f412eadbc6c1186f175d568b91b8
+DIST firefox-151.0-ar.xpi 504990 BLAKE2B b21da56abe5c928e57063ed5ff4d574f6fd406984923691e4faec4f342a7d88f4080af1c0471e7b41f09a333242f199240763f770c7811189c126988d2ab9fc0 SHA512 6dc934c58fcb6e48faf0831b5d4ed8a03602515a996b5329a6d973ae19fc5662febda3a8d30fb17f1d98ee64fd3530dc07341f6623991df5c2770b4e62266c74
+DIST firefox-151.0-ast.xpi 313597 BLAKE2B 8d19ba8a213740c0283ee6e632a114d89a7d633485c266c092062f56a9fdb41336f880c3d24ffcf166c52a8a7f452e4558c1f6dfd3a86cb66d2ffa37a39ee464 SHA512 bc3ac5786d968e7a02cd1a9148c96f6eb4d1dada7e967fd70ba892a187bd15620b69b83e4f530a7095f8d79e33cf250c16abe8c8ce9fbea55233c82481e8f5a5
+DIST firefox-151.0-az.xpi 319348 BLAKE2B 9824defc0d030e2413ee6862284ec9be07cc6c55f43801c0ff02816cc929514d28b94ed18ce61d5217b0b1e60ebf0079118da53b56dff14318d618f62fd0ecf7 SHA512 7dcff3d4c23dcfc6e7d980808667ddb158436fc772ac935f331dbdb8bf174c9991d19bbc560a918e0a264fba9e907232614f9c41ff364c250a54266613f6fcbb
+DIST firefox-151.0-be.xpi 571024 BLAKE2B afa4f412ed0117d5bad6f75c5c1502fcbf7926b37154bd4d0b93ab1e59c61845694c8a536979c7574201520c89825542e0c216ddd768313857fe2eb24db7cd61 SHA512 bc10ebbd310be6f3fd3d54f9bdf3e52a1d8273799f5052f86c4d4c925aea3127b1ff5b34735d064a4c887b28e47f14fa7c5c1744fbab8f1ead2c8af24a6c4b80
+DIST firefox-151.0-bg.xpi 462403 BLAKE2B da1f71ca37f8f7e64f4f27d8f9500153d4c91cac52ff8e94f8082d5a8dfb683adcf956a66bc80ee86a91504ffb1f662f122866cf782e96fec4ea8f3e87c072c4 SHA512 7cb164ed78b3d6a212ad6bf1fb48d9912749c6f12ad2413c04183996b3dea39fc5d565bba29956a45469e0f33b436ebb2475e5b80db230b5a644ff9150555939
+DIST firefox-151.0-bn.xpi 413287 BLAKE2B eb4da7bc7cc67c463de615845cdef290215535897871d46bcec67e64b9b91da52c269223929c8ba25c1654e54c06b2123a8bcb04608b428a1deee7c92db650b2 SHA512 0eb8972af1e17da852e5fb52fef9d250f3987f5a0879dc9ec061e4478d5939ddac7e3856f677e14b0878ded51106d1c26508b8a2c2554e8093a3a75812e49548
+DIST firefox-151.0-br.xpi 395093 BLAKE2B fee9d61c2029fc2202d599d3c5ab3532684f1ad6f929589c90dd66b54020f893c2673aae9d6fd82667dd415e2cbc146f3503c87e220323a1db6fcd98ea3262a7 SHA512 76832c9cf2f5e339822a74430c1bf14a7ab23ad57e71857950304cdb51d99efe4c64ae35f3d620bd3332a4fbdf0815e5c8f7303845c022639315c39501ce0f48
+DIST firefox-151.0-bs.xpi 449901 BLAKE2B edc21c6a56f328d3670a5bd2fb301f746deaca1c13ed81c0d2df4dcdafa8d2688b0a19a777a6d3003fd485c8d8c016069cac4d83e9c331aa8e738e9518bdac68 SHA512 53b8cf934feb1aa7c5ca8457d2f4afd4139f92c9db6936566a988b544d1b914518a5996c50f119c0128b50b81dc0b67e348876444528a14d06888ee8b9b33812
+DIST firefox-151.0-ca-valencia.xpi 358951 BLAKE2B c4de0b22fa871bf8cc1e35852d4b61cb50cd77c4cf5556bc45c8befb6551044d17bcaf34e45632c2bf54dbc058fae58d80af8f2f50a3999880bfe65583b33bab SHA512 6b9cad45879794067f553a5572bd89499edd329e9de111d4a264e2cb3f78e2631ba50aa304912d40d9d3e7e744ad67985972ab6307cd95ca8375be9deaf78483
+DIST firefox-151.0-ca.xpi 427067 BLAKE2B 63433249cce5dcdbd295bc19a0de4e5be4fa9df61a151d80da8a61d43652b91aef90790e8009a40596c1417b97620598dbc9ffb7396272c1fbbb1813b11faea3 SHA512 9b83247aeac26bdba50b8c63156827daa42cc28409cb606adae6a81730d01e6b83aa32436826b74cead497f2932da2fa4db186b28a53ac0b610c87195758a5f3
+DIST firefox-151.0-cak.xpi 390399 BLAKE2B 94188a588645f9234dc188654b337e2fa75da2dc733cc15339787acb029375ef92f50d06153c83ac55cd6e5961e5bd063d074da1a40d36b81dbdf96725dd4867 SHA512 58b153e299278babfb51b9509b3d8c9f18cee3f002e60ffa8300f809e4e7b1f462deceb544de933289da80c3e8b263f944e99b9599d80de136e1ae43151ab426
+DIST firefox-151.0-cs.xpi 522060 BLAKE2B 0c7086226cc0bd321501108176c6e9efe91ec9a4e93906448554f2940b101d396db5f55424e26b181a08fa0fb91e0ed3b5464ebc68d867e95f8d223dd1b05070 SHA512 534e9076af590c4608a15268ab3a5aa1fc94b014f95931d9fdaeb0b5a330504b57dc3e309de78d840543e343211111b7d64aa5063b9c264f74ef84de64b5ac69
+DIST firefox-151.0-cy.xpi 483480 BLAKE2B fe7f25937750397778cf7439d74a5df49d7d50dc4d465cea1a2a7e3d5c5471e41ab1f7f3f4441a01f9794311b0bf7c2f738ebee242d81a9c174356b36da15f00 SHA512 dd9a1359d9a372f4608e69addd2114d937945121db7bebc59e6859b3e8c14354edbc87c9f9b7c3c79efa7642a2d7a5014ddb66ef0b4c52b12bd6a91aa869a1f5
+DIST firefox-151.0-da.xpi 464157 BLAKE2B 2047858f5efd0957d12a3a7f55054ff6359adfd4381c232f4bd75a1929d91e4f1af463a65c29d8979a323ce0bdbb270b0c271630562cab337206d279ed3d7018 SHA512 653ef5cf4fdbefd4d5165764758e8d9d4c0f6d4ad5a56b4a59e715cede5efe9aa2a0affad1b2f9cfc0c386c4ea88e7952a960a29bf3425127820ce3b16359fb3
+DIST firefox-151.0-de.xpi 494928 BLAKE2B 3e51453069bcec67b1f7fa09825cbadaf9a1960522571a2a43eac491ce03c532c7f9848db9e36c2856acd11ccbc4ecea85e3d01bb8cd2b256ca72be341b65e35 SHA512 5aa268d41272dbdb8232deed34753126ddd086e08d070f218b65b69467cf72ba9a798b84ef262fb58e9ff90f2c59fcb8fc7292545d6a44e67ad4f5751eda6957
+DIST firefox-151.0-dsb.xpi 508866 BLAKE2B 25f872ef79386a34a34d29cfed6f3942ad904beb8e84a1bfa7a0e199cbc6467df53fa1262a8a6f5715b35cdf399a8d6fa0deffefe8fd4c66c2e3853417268f34 SHA512 bdbe16c72e94c4247d8e8710daac351599278b7dc7e5841efc462a7c255439db65742c7e1ea6fae59f9540adfec5d9ef478b4a631e0ab3e4ebcabc05ec255c04
+DIST firefox-151.0-el.xpi 586705 BLAKE2B 83491c4f1cd7a419ce0eb6ac912313891b8863efae8860cc250c011f1bdc957b670302aca3ada4315ed619528bb6623694610c16771e5b155264a657fd98bea3 SHA512 3a222dd15f0663da38fa301aa5646be8b2bc4d6014cb83185cca3fb764e820c25fd5c4ff80bf83e96166a7807e6f5eb0582e5a2e14676d491824b476aa8320dc
+DIST firefox-151.0-en-CA.xpi 447415 BLAKE2B e839431e33722082bba3b233c5e128a8e4f7a107a730228c79f561a47f1d50efb0b334ef6ec93f0e01200f0f925122d77563517eaa705d476ee5a83edc55dec1 SHA512 56ecdd5abe52f635a4e8e0e204d5e00f01734799f0a7da833736057fcaf830281300d96463cae17c33c576a9eb367dd626eeff0a7aec8ee37f4f5aa6ea900ee9
+DIST firefox-151.0-en-GB.xpi 447725 BLAKE2B 356f7c7bc5e7a409330ee05f34c225d6f9f3e8e00c1520a411655ada8a53ab981faa61bab9e28ca518e225d7c5485c4484655d95355e4ea8e76259d4ef395daa SHA512 8b7b194581df36714a5a1e17ca79bacc7b77752682d8aeb2afa7c659ce7a3254049f874abb07d9e48cda0edf76ad1a890f7ec721a48e3555b399761debeb3c59
+DIST firefox-151.0-eo.xpi 473063 BLAKE2B 7e1ee255b9819223859a85aecf7ed8136c90ee41bfda5522d6a205202feed05cda96c39cb168eee76aced8dd02683d9e04a7ba76d0f283a98e8747838cbb0831 SHA512 c9dec1123a3119d6719c5f18aa1fe8bf064b8ec7ae51004a2c8081a59314784f351d355f675d06199cf965dd6029fdba6cc9062c4e5c3fddefec76cac0e40f7a
+DIST firefox-151.0-es-AR.xpi 485607 BLAKE2B 503904180e97e6e8444f67c3f538e49128a5f581f781d982d7ed67e62692e470c2f37322c905be3c639afa0f9d95e1f35c8378c336e666f6bdf190d42cc6e358 SHA512 dd5bc742294675914a2d15c25c8bbe98611286ff08e829b977201181542804535a5112beba14101b0145f188a63f9c956107e58d1d95a5cd3e8dd3cae8a6e543
+DIST firefox-151.0-es-CL.xpi 487106 BLAKE2B 2b9a6d0553be5aa9cdbac158e589a19ab49cf1d48aec7e0f2a43683ed7ecfe592e70bfb8816ae9001c084681a171ac6759d2dac25e1666ee2e5939e0b1d4414a SHA512 7043fe5e82d97b08f7566a7e53b6857c296182a9060a6829ab0260c903e48d0144d59a926309ee034cdefe102d4ec9901960a57d54e2f7e29378e25416608c9f
+DIST firefox-151.0-es-ES.xpi 488006 BLAKE2B 4611dda69bb4b40337de03a39b9203fee3e480da950768b07a2824aeb7404476a23fdd01fa5c925458414e1075cab1eeeb50c5916606483edd6d1ad6c4f1555b SHA512 f0ad4e4e83592c4c02f622642e059f33a1a09380217bdbb1a94d19cc45df9eb514179b9ff9a34a6cdba9b4f125b447a5da1d43fbd1f8b54bab2d8f5f785832e7
+DIST firefox-151.0-es-MX.xpi 490713 BLAKE2B 2fc75db008aec4e452f97ee3d5ae28895dcbd3986987e256d33c68731576021e437fc130a5086c4960871ee83ec9e36ff05d6615850e5e7d3e1fe932c8bbdb39 SHA512 7b735a530442df5ad8ecb539015169455134b9b4034437aa642b4f0199a605de6b71cd6b63cfab18557b2b7f9f996686ff08919da63c10a24b6b645e74a10d58
+DIST firefox-151.0-et.xpi 359449 BLAKE2B ec85856d6605a403d078e400ccbf79c31394e25603c79939694d6b7a34c896844436e24821330b631a7633472a9cd079f3fbf585af840f0aae1c5cefc2000a7a SHA512 81d5b3572ab70e870087145689b9787967eb6f1a69da6ff7cd1b5e7924d32939176da9b397977e2323ff87e540d38c2e7448d8f2e3f7e7ffed0d305f7719d4a0
+DIST firefox-151.0-eu.xpi 471747 BLAKE2B 4b109e3c9f05ed9fb91360d02ca1b5f7824c140cfb58fd3449b929a12d2f7efb13fd3d3f23c3621b946a79fb5be29399d581fcb733f5ce9211689daebb78ddd1 SHA512 9fbb469d5e13bb369ccebf45ac454fe74a06638da91a5fa88589682ae706e0666fcc7d96750ec7e21ce935c420e41dc863c6ba484cf5ea2ac6fbd31d0dc61223
+DIST firefox-151.0-fa.xpi 420511 BLAKE2B 3acda34f9e90a3d36e1403eb8be6ad282080e83eda66777609421cdb796516155a5c5b5951cc709337fb8221a83f514b01aa528855392e6c2bc459a836eaecb9 SHA512 7cf3d625b59910d5ace9dd637f420377e9060e17a1c142fffe331887536cc973a86f7b7a39436a35dab7211f7e6929b5816e943c65f4e2b5af20bca9fb9a8f30
+DIST firefox-151.0-ff.xpi 311030 BLAKE2B b61959b44dde48ed30a7b7d817c84d26741171ac22fe57867d516d227eb2599330af799a833461e274c0e9b8640bde642841990365bbc0689d5bdb18216708a0 SHA512 bc741f32b0b3e1596af009d5f4e1b56cc1f33c490b68883d7941ae189d64de871a3b0937735bbc6eb5dcbf9804f79f428463055f1b0da7b81733fe66f4b60a0e
+DIST firefox-151.0-fi.xpi 470340 BLAKE2B 5cadcfc215693b6e1f9409948bd9b346e1880b75e00774420a4059c8e8118b1b0a716981147423dc4fb962bad81ba5882a724875f4806d49787634ac12310bb0 SHA512 955a0252633305e226a922f755a651012696a2ef2ae6607a654edde3d2f08abe03b3926d79cdf76f423397c8303e9fbf4c12eacc9ca5796ade859f8ecdaaf2e1
+DIST firefox-151.0-fr.xpi 500656 BLAKE2B 89f4be5d13b0e63f54d46f10f3010360fda6031634cac7f20b9bac4f6d37ec1dd2304e0cecfd5cafcd33aadf6543d77b7bb811b452c08585224fb2e247694eae SHA512 db7eac9620a7dda4491653fc3b7a3e9ed6a8f295b936061f4110930019fa5b0c765eccd696739962c667ced22d529fda754d451e85efeb51fe75e489e0dc60f6
+DIST firefox-151.0-fur.xpi 476224 BLAKE2B cd7f5b5246fa92e6128cf9ee318481abd7ee36098891a786216af1b4f9efc3361c599f44df5aca7e3065c4822e5298e6f18c70a479f59b48aa2427fde5e5d0ab SHA512 3533a4f302abb567e626bfc08cb62cceec30634fbce9f27d3bf62990b961731293ede50f28cd1997624615c0cc797111c0b026980db3401256147d9304f7fa88
+DIST firefox-151.0-fy-NL.xpi 482254 BLAKE2B 336053d50bfd69fb2eaa944a4594317884247b0670cbcee411d5a6832b40386cfa50d33ad36c994d26ebb5394b7519d64f2c90506cba1c472d5faa83aa55befa SHA512 b682479c2f0bea0f566ce47f6e1ed5c81b95f5a7719b726343d2482004748a7cf33aa8c4a05e1b0f1a72b6676b9e97f73d97d606e1a4105e03aa0f37a9e49811
+DIST firefox-151.0-ga-IE.xpi 316675 BLAKE2B 3f3ec8d39722df86392861e74b4b705a647e95843a8927540c6c609c82c2bf3f3a6425f6079e348d9be9f64d53ad0ada867673633abe4adffbe7f779a8e933df SHA512 b58d9e2dd4302227d2f0008b66fa7bf907c5124547ea040a960de4e2a17c346675adc80fe0e135e72c2222b36e2d982374243eb51fc0d9cc8ed42f17975147b8
+DIST firefox-151.0-gd.xpi 410051 BLAKE2B 0d2f9aeeaf717d6321341f6c320cf561dfb91ba59cbc02688ac6579f129f4d69f6baa3f7c4187d793c82227c0dc616edddcac92d1fcd968a01d1cad753a36818 SHA512 7d1ca00d610d457b706d0d27e253c209e5dde7052d01ae7167b2eb598914716fd6e4e3dcd469f2babf439be12c9b8529bfe7c6980355080991826912bde0980e
+DIST firefox-151.0-gl.xpi 446597 BLAKE2B ab64c2dba2bacfaa45516e20e44645f025022e5e1ea25675eac2ed0d944e52e4b1234083a6f9835d14625eef95bff6108ed949a9072814163f694fc55f24e770 SHA512 dd614ad5c14f3a6c2bda8c4f7608b2410f2028d81c83c15c6cad1a6339042ccab1bf8d9a04409cd664f44a511aa7391b1b93668951089ac506a7493f7ee287a8
+DIST firefox-151.0-gn.xpi 490540 BLAKE2B fa1c668d866ced244a4a6c6c195b2818620903aa0b41b38757c00b95908867fa169f748fad42c2fc782503fb5148755ebe5055591d2dbe84e73cb952dedcfd8f SHA512 970fa723fd3f8a5bc98fbb7b67a99cc9f9ceda57530ee300a95a3474769c7190551e8ac397fb6d0c0aa5e3b2a889212b78da6d7382d61ecb898dc3cb1fa80fba
+DIST firefox-151.0-gu-IN.xpi 359210 BLAKE2B c5273acc0d90abe3a7316d7c04cad9280aa395c5231887a93d2f55d21439d0929221bd567fb4092745a4b030d57e7c6bb726b1fab39eba3daed739a259c91c44 SHA512 73353d7875755a7f94113be4651d393212a5824d9b48ee7e2dde48ed029de545873a4c9c113899462f31edb894892561da88e034d2f0960d935c0403981d33db
+DIST firefox-151.0-he.xpi 486325 BLAKE2B c0ed3decbadffb77a08b18372adc00cc595d86aa284b4768dfa0d88315c16e31da38939c4bd79395663962deb71c79547bbf55b545f99cfe3c9c0dfd38561850 SHA512 f3377b262c8de11b2de46e8438b984dd0611284dd3b3e62446b34eeae849482bfc46488998e737cf8dfe2001e64371f4417d0fe8b78272c7a8004cd5d13686d4
+DIST firefox-151.0-hi-IN.xpi 378095 BLAKE2B 60812497c156caa526142b63914241350894cfef09b0e846f1244d267a66b302499b679dab8b9bd3910b6110826683a70dd13edcb918eaf0aa007995b243b9d6 SHA512 8365d483ffd68892ea32e1ca2dc9e27349eb9369afe75ffb1ffd8cc4013c2aa3ceaeae2ef1afa0f4cd064fa559f523f6af52223b7d4012c3de38a652440e78b4
+DIST firefox-151.0-hr.xpi 472320 BLAKE2B 8a8576a8121abc1f4ebf16ac94f9e133813b1c151ce0cc7ae7f5a6f933ec6180b59ffdf58c8a41e214716fc963ff04e4c4d8b526b3328e6417a89d49c34e8d45 SHA512 c4fb1825c734da0a901d203cac8190316884801d561292195f24afa4f0f62fcf0a7e1e8bfdfcb4c23a7ba2378f8785470d61261c3a386011cdb85178d287de4f
+DIST firefox-151.0-hsb.xpi 505520 BLAKE2B 8a06797943bc07e8b59338dfdf396d14629f9307eeee12eb6e7943d2955659cc87b2b7b2c406cb94d6ed7485b503229a731c654a60559d4ec3886c1c7cfaab83 SHA512 f2f8b7a80cd6a97d42aceaf1e866536527eec0bac370e0e887c14e6171f2537dc1d4ebb578eebf499c01e4c88f9f91d1bb0ab5f3937ffa674908980b1c6fc8b6
+DIST firefox-151.0-hu.xpi 509760 BLAKE2B 04c118df2651db8b94677648eb8d2c0f46761502f2099c926ddda7a0e044caa13d5dce385efb41d0e54f4f2eba8579bc09c7ade823866bdec510aa4add513d05 SHA512 e36dea5ff1b5165af36e0338225e8711937ab68382071a7288d41f56b2fe8fc426b4617621611d656893fd5f43c448b95b482918d03fb2bd3af4e0820e02d6f7
+DIST firefox-151.0-hy-AM.xpi 486627 BLAKE2B f7dd3bf2800dbfb03051f21bfa07200a43d282e35c51dfa6fb078ed31db97389ed715ffca6a17307fbd0f993d566c47636ccce85939d5758aa4e0cb5e779531c SHA512 a0bc141ba4d39efcadb356e2ba2d340bca284bb6803a6de20ea19c5ffd1f2e6e661d88613253950bec2ac5278b9801713c45adda3b34f6c22291220635b56f63
+DIST firefox-151.0-ia.xpi 469190 BLAKE2B de183087b6e4866cc5278cb4ff650ba415219974d879accc6ad234049925eb92474ad332bfcf10bdc7b66453d54e7075c0cdb59336c9e274ff33137e0b7b99cd SHA512 286ade180e139722ac0a5cb1a191d7cd8ff8e2864a812069a0a42c565b99d776c7ca7b445a072a416c0e06cac92f90d10725f6c23bb35611002b3a02ef575a6e
+DIST firefox-151.0-id.xpi 432658 BLAKE2B cdea26f046905684abdb3612f166910b3f1791b080d3e1271fc9bafe5c5f659b42e783f5421ad7f05fc1beff7872f98ab2c73275e296bb544f8171894af732b8 SHA512 1ef56defc1b526278a33fa899e710475f85d6da7a73e17585af5614c2887f086e0ec501e8000cef70a23c8dd6f9772a3262c72cca3a6d1766927549e12be7d0e
+DIST firefox-151.0-is.xpi 440476 BLAKE2B 88b693fe8bb976434e060e7b76626333ee1eed5f0ee8844b936c2b4f2d747d6f8885f5d15dfe468c5516fe1b9f81efcbbecb4335bbfb469c4e83203ab68d441f SHA512 85beaecc75a9a47d5508746e06d0405d0f6e4b36dd9b3b9627b884cf6a8f6ed6b2f7cff9e634824d517dd5118f0b34bc6dd2c5120c5ee5bac200b2c86cfa7ba4
+DIST firefox-151.0-it.xpi 481189 BLAKE2B 61090dce99aef393dac48917d5ee8e4289ce23b4b90abe444745b1484e46efaecec02529a26257d5b192dc90b966d7ca56afaba5bb916a29fce9735c79203b17 SHA512 4a74eade67d59280c4685fa220fcd8d354c705ec85dd786de4c981b2c2bcdd20e1f2dfd2dc8c9274538986e5d716a2a42186002440ee9c5511e0719e50158f27
+DIST firefox-151.0-ja.xpi 524684 BLAKE2B a16032511aee69616a633554d35a498b7dcc78a8a2a48d0e9d5cd0d4b49f94edd7ca33f9409bb2d8af25cb6838a7aa5d411b3287d7673111f0188f99edbd5c1f SHA512 5ebe281e5d9e346f3df2db6f4c954e762d0408089c298572da70499eda75a8027797b5d739e5b387311bcfcb299632af70f1e19aa8163d61f1c7629e468af3b0
+DIST firefox-151.0-ka.xpi 543668 BLAKE2B 92e88fdefa9e5412051b441a28ab1fd46364e097382a5ba1c9af24d561387b607376f03d0e85fb0b9be7d8d7918a9606aab2ceda3a029ccbda264aee072ba4e5 SHA512 f7a53ca5dfc0df9de114a4d62414e44ee4ac0ec77b11b11ce80f5fb7cb2c1c891681c63488242a304e032d715763166a9d3576e9d218f680552a7870fe727fad
+DIST firefox-151.0-kab.xpi 426246 BLAKE2B 4f0fe2ba4fc7f2f9837e3b569b21887cdec24401d52ac969ba39eb91cf35ee8ff5999b406b6546bc388a8f65494f1352681a195a879c98c217a262e71da68671 SHA512 68f4d4e71ab64e2b80e653584a351f2d6c6518291ec0a4ef7c6efc5047953b57ce1d6ebb39fe921ed08902d0163cb3661b72db485e132cb395faf6f8c94de1ae
+DIST firefox-151.0-kk.xpi 562327 BLAKE2B 5cf0617b17b56d729e7007aa716585eeb0ad8b10c2f5f0c9beb1d5915e53ad4602469e22e8254d1992ca5a43bf0278934c322f7a961c4dfc1c3214d8264d001d SHA512 7e799005de4350671f152ba3b824dc5324597d89be468c93cb01d88306b5f366d164de7bb15dc928942d13480b7f0f35b867a6cb84d7eb014e1f2238f4b8643e
+DIST firefox-151.0-km.xpi 376362 BLAKE2B 2d4d65df35e3147502881c2e258d0684ba3251933b63d24c876746d55acbc15209104bf39f691102082be1cc460e548fcb92b1a608f97d59ab04c0d1327e501c SHA512 38bc041163e7ac00b8d3676f78cfb3d75292a39304daf8a8ae953ed15d4cd77f77eff783da6cb06799d4bab1193d34f9fd6599b303f75e2480516c0def7dad10
+DIST firefox-151.0-kn.xpi 333524 BLAKE2B 5d0a5a4ffedc911e0ee10985a9a2b33b7a10d207932ca8d74d1c36213fca0fe48081dde78a2f30e23d4b0078dabefb4c259a70273de82982e7340ae765ee4abc SHA512 724fb4586d512158d210b07a4d932ff749b6ce0dd08eb432c71680155c5ecf6aad0ef23d0420245259af3c77e642dc04e56c8a6c29f5e109ee96ba132e87b1d9
+DIST firefox-151.0-ko.xpi 509130 BLAKE2B ad2ca69aa5f203f5961e5c327a85e623bf64a1e26356cb04e70d105680bd4dc5068efe950055af56a86280338f14efa5da48e3763e8ea891284b607a96c79eee SHA512 562c93c0a571301e169ab6e1ae9a308f02e430cbaf77b2287491e3ddf4855a15e4ff932998f613c2228a02bb20555c3298efea1767a8786b26bdb9edc0b44cb5
+DIST firefox-151.0-lij.xpi 320396 BLAKE2B da9699651802561bd5567aae5d09d2333f2fb9a08c128192cd6e78c3e18f64a0ddd11a0691656f5c1f17c0fa12f441b139ce614a92413e65d93e364c0d4c1614 SHA512 815eedf43501bd07a8c12109f973cb8511d833f694e4546fb3391845d0edc907482f6c84ff6262d7050e0b5022cc23a706f68d327ab524ce473eed13f6a28541
+DIST firefox-151.0-lt.xpi 380204 BLAKE2B 4226fadc0abb41ff6f6aa531cb5175983b8aa870a1419e6fb1a544fd25822eedd6de2a11442fe0681d02881fc4f1e273c21632cf23af08c3728a338c556566cd SHA512 6449e89614c868863eef10122ea665564852cc72a1c5d9bfd58c5a76746b421abf923ec9b60492bd16b7afc852a473c3b48819fde884b853fbaffcd606b25585
+DIST firefox-151.0-lv.xpi 391290 BLAKE2B fea281612ec1dcf57558bc3c625d94d4488a2d509c1f98e7a9f79af41ee9a81edbd9f460541e4d9ba2f24d8049e869f078530093bc79610964cc5207bf9dc4dc SHA512 8126ae7877aaa71497869c9f99e8cb778a42af816743b2d853fb5e41161bd9e1e7e008a02d20a3250a3551b0f8639c94f02ab1fd4b067cb55cf2ffae5b535fcb
+DIST firefox-151.0-mk.xpi 351828 BLAKE2B fa56f9c4c1ce55f66871b34462dfa8aed847ba2ee6f1ebaa4040afcfb9c99918dfbbc77a591556087a1c57374f109a1279cd6d0b356a8130b6983ee9d609f9e2 SHA512 3161ab305034854891a765da746a66f37a73a5c8b96e0946c2b922d862ff5e1ac5c772bfd140ba6c3f4e202f0c462fe5b4fe5c73ddd699b0329076c383d40b0c
+DIST firefox-151.0-mr.xpi 357099 BLAKE2B 3fbbb1fef1a99fe1b3af2f011c59b897c57ea5cdb74b3d0157c19b08093ee554274855cf50519a19ec6917ee8915ae9eb0ff6a00e87c4a730bece8c71877db44 SHA512 656e533292fd1f3eb54faf4cdf76fd27a8751007ea10074c808f5ec5fc62e6995cdddd668264e32f07ed5f70db0e6d9b04d18929543f71ebd9a24946f94df88f
+DIST firefox-151.0-ms.xpi 296892 BLAKE2B 3e9ef6c1c8fe8bce3eabce2bc114c139198e8e8a936d2e82a784be9ed52d8ceecc180fbbd4edffe75bf8e2779daec2ce87b711d96e42d3e58f2e1c8f58cc09ce SHA512 46d98c39a7280cf76e855a694b3162c8fa6929ac33892c1f250eea4f924f5a9f66b1adb57e49565e485614ff675e1a4f56d998a227de7de299bad924efc53783
+DIST firefox-151.0-my.xpi 344103 BLAKE2B 921fbc8ba2c08617b9ddcaf474f8d941062a41f2c6217867a743997bdd9f737fc23cf63b720533a7c04f6983264be264f1557b3ce29ac0eb0edd415dac163adc SHA512 9757ae11038e905b768aa075968ef6d339fa081e81dedd9ae4f15176ace48f84aef30a2aed34ba4c7aa00159da8f2fc8d30774050fdc10a677354e4f32f0d1b2
+DIST firefox-151.0-nb-NO.xpi 468220 BLAKE2B 5427ae28b431238755bbb770722bd3acaae3858b804d867c4e5dfa3a934ecec1dcc9df8704def4e29ac8bfb3c09c9e905c69dd89b8aff0247d9d62a82ee2cf08 SHA512 b1910d73d4c0bfe17a2e3dcf073a646ce7e1a0386400b2a9de2af8a604058d7393abbcd7961f94d3ac08a9576fb3af7678741efe030c428d2b3c82c299655c65
+DIST firefox-151.0-ne-NP.xpi 349210 BLAKE2B f25945f4f415ed1057aadb39801d3a55dfd1450963d6c107adff2ed1f023970af391d01a5103c67c71fd5c426c860e0e1dcf3a3658fa4ca4dbc5464256411a3a SHA512 acd4704a50871e6b3c6e6ebdddd38087d27e32f2cfc8fbd5106692728a31f9e00e24f4b94eafe4b91db416744aead164a2852a8111494abe15c2737989d42d47
+DIST firefox-151.0-nl.xpi 475882 BLAKE2B 4e421eafa8568b7a75d37adee09e1ef889d4cfcc3250e2715702fbd9880ded5108041f7fe2e0077b810ff394bc82e9e8c9767eabb66ed60ba6f9c4c0f05fae36 SHA512 94974f36974654188324ce668a24d64a13455015ba4fa2c3cfe6ae98cc7a6414fa8cec2fa70752e087a1a5e6d42a29640e76188cc4ad8976334c9c756609ab5c
+DIST firefox-151.0-nn-NO.xpi 471568 BLAKE2B 46f56f3fd313c1bb9011edf4957667e0bb0a8da6c5d9e1a754c79297506469421428ccf815fa65c6c33e276ab6df0b1c07ab7c2615c36743047921678487b783 SHA512 d4108f0668a049e48fd0ce903475c4b3554ed243fe3ed9e8fc32f1287f6647030019d248eaba907acd67019bc1790821a1b0993b97dc5a08a03bee4f9939553e
+DIST firefox-151.0-oc.xpi 414861 BLAKE2B 897db38395024e7eb8d1171063d29052bc2352e7eb10222df26c10753b3ffb09d3725b581bca0620a9e643b73863538593a07b3a8d5950171c8c089ac8e62b3e SHA512 e589f34295631438e3b31051e8d111ea55604f4b980ea4f878e4dadbb798dcfb93d32f426b4aca5e331dce6b14206d8f98bb91bccded3373a5c827fd6d8279f8
+DIST firefox-151.0-pa-IN.xpi 542009 BLAKE2B b2d5c43ea62b0513935a1471cb0a9c61470e01f64c4f9a8c662c93ce906f4f8b9f3e16870a0f2e499e618a31dd5b7f7352019ad4c851938b1fc45d18e2491528 SHA512 ee453808d537fc02f9f76089075b540ab236d53452b7f196bdca38bdda966baf07139af9df756eb5d82e5e756c7594ad92e176bdaeddd8ab458d90a1c4671469
+DIST firefox-151.0-pl.xpi 506663 BLAKE2B a298c52c74599b33ec9286b77be60a07155534308e70eadf23f50a7c9747b488b5a3f4cb165e87a72f6cb9e47f27b2187cc2dad233a658513e601aa933fda6a9 SHA512 c07e9f4f8accc24fcd334c903626b2c95b593d27f59af50c2198c62535c10095681c62c113a48ad793d57a471e0cd9cb8869c179043f044632926538f47a8890
+DIST firefox-151.0-pt-BR.xpi 480567 BLAKE2B 99f89ca011a203b897abd9cdccb13a974f7c69dcce8926de0000be65274f58480f2689527ce7cf054be220d38fa0ac5d0b8bd14d3203041718a8881bb9c1a289 SHA512 08914e2f5a26bbd7bc68d924fbae74d12cbfffebbc5c0fc907974ddcbdf1c35942ed08a10f3f3b87dcd74b61a3822f59169e8df94a8c68fe92c7bacf5a51b4b1
+DIST firefox-151.0-pt-PT.xpi 487435 BLAKE2B 1abaa5469a4f538e41dbbb294c65f9bc344e5047007dae8d6f70029bcdcc5e195ea9ab660cb4c8fce86b09ebb06cad8bdbfc6d7962de48855b19bdb8576952a8 SHA512 680b7752700b1cd830a6ec70d4bd06db8fa6b85ab833b002e2236ed68a108db43d60af88145c7e570b995ff53dc9831683ab14ffdc9b78605eff28e2baa4f59d
+DIST firefox-151.0-rm.xpi 458384 BLAKE2B c7043cfd6d0a83c1e9e34fb1f5277f0580d5fe9db3be151860e8fd1adafd7ce601e5d9b3e569d1d8122eee9d0aba3eae421ae91a5e1e02b71b91d9a33af0f4e6 SHA512 4ab2fc04241dbe3aee46e757e900a7c08286ee886e13563450162d97d0ffbf0275d50ea79ab3274d0480aad3187bf3acb7f3d5530d6cb27540aa2062fd67e136
+DIST firefox-151.0-ro.xpi 494323 BLAKE2B 9de6c425399ab4e24e622cd51491880b60a08cfd83c6d20118827b3591c096969fc1228005706c5f0f0dcf6e1d4b028e772592fbb10ac8a8b529fa17a4fc7b6b SHA512 6cb8e871ae81b9e78f54d82b924cb201bdd390ab0d298fec385d337e134e884263fc4127a1fa65747d5a61ddcf21b1af1a1d9f46601e2994bf4d186e4feb8c5e
+DIST firefox-151.0-ru.xpi 574717 BLAKE2B f1f7a73f00a8826c8ef1fd87327435ccdf8e00905b0922e0077d65b7ab90f4e47447a78a459a8c17b14905c915dea1b3da67af8f40e52aa045bd33f55654ccb3 SHA512 1a03be17144a1938d3b95463840cb343f3ed800432dfa327b05c18d4a2476b408cb2569b4cb47457ebc5f984ef2023864ec10aa4aaf32ad439278f121f648538
+DIST firefox-151.0-sc.xpi 429233 BLAKE2B 4d9a0f03ded2742e46fa9cdfae4c01ff3ee0f604989c29229f10acb871aad9e219f6d632e57a6ae08ac2604db709cb63abd631989ec9eccd543c2a93ec6110e2 SHA512 43b3b3dfff6f8795225a1dfc274024bda34c5d995917fc777a5fc6b2c5ed5a1b36aee9070ccc3d3340d2fa82a8461594d30d4fef943052eb33a2717f76038cc0
+DIST firefox-151.0-sco.xpi 323577 BLAKE2B 6dd77c704767f08c37e721d95cd4b95f560ee1f0801b5877765823a9aef24ef3291698a136e1aca7a70e2c4d31014bcdbc1329dcdd0bc0db334f1e3bccec8963 SHA512 8d635051c4c0716adfbebc88c13365b2a4adc7ccd179ac7d4dc8e194b9c181fbb8ac587eaf70d60f2f9077a80f57f96e8e659d0e8d47827444695e8c9613019e
+DIST firefox-151.0-si.xpi 409779 BLAKE2B 8869804acf2f5a879657830811fa0cbb542c520e1c57ef0c5244a81352e4da2a1b156f2b3de9846bb521d5bc06e7b76c36f3f0fbb05e3a0d0795311884c1aecf SHA512 410ebd10062b8f40b08246bd8ff20011fa9a931fefb393dcf99d5227b60e320808982a068b409bb061d7b9783f1f30626405a214db93ad507239b32c419ab3cd
+DIST firefox-151.0-sk.xpi 512616 BLAKE2B f846906eb7b954ece60c5877944c6ed425aaad7f9c17aad0c20b2c3c99f6ba9dba8d36d3feebd57b8e3586b14a393c77f2fb8b9c6c3a8ef3b5c133d9b5dbcf15 SHA512 bba661c705e8de4b9030dc4f5132b0d39464451406bdc73e561c8ac581bb51c21780c26b9a09858127aac0b211850aead090ec724552fc83d3d69d5cf64685f2
+DIST firefox-151.0-skr.xpi 484960 BLAKE2B 5216bdaa0ffecbddd9f1d1f9e88d8f2876e57724bd9a1c3989ab76f33afaabc06a47cc1f807adef23c9558585f943d6f7f41c80e154afa5559578ee7fb847186 SHA512 44d499a1c0119f5b8d307bffbfaf10fa6e6faafab04bc8a5ce157189adfd6e425d44607e09fdcde1d974940b3a4e7d7216e6108fc21cb45a93da7cc96b095243
+DIST firefox-151.0-sl.xpi 479135 BLAKE2B 6d0322f5a664b37b021c6086341662c75462c44c0086e748275ad40b742baf80206878b392f2a4277c76c97d10658e5a812e6a62f33af2982764df07db1f3d22 SHA512 052c3680259e49b8b80a4591334ccc94f98ac2970a1205195f97166a5aaff1f621c51537b18bcc8164e22bdb8cc91935f987e90db41daa018b6c2d6bb899ecbf
+DIST firefox-151.0-son.xpi 275712 BLAKE2B 94cf314f93f2104563929b7982ad68ade4c6af08669886121fd31b03b5696fe4e759720871c4b7025c0db446f94daf425ddcf8cae0852fa7abae80e580cf1dce SHA512 6c728c472f90bd905abe99e7629f4dfcb6ab563c49f00ca0fd1ad8ec41fd79152f13a10c03476a30e862ffd2199f9cdd250146c616e46e87a6687d9cd404f158
+DIST firefox-151.0-sq.xpi 492979 BLAKE2B faf579d3514f6fb6373ca41f590e6ff54d43f39b1cef8105edf6d4e8b829f02f75d9f0f826d3ccdf6f0cd6d11f3b93d8f98e5e5c2c4f58730de76ccca6c0d76d SHA512 e1e769a6c8b6794c6b914e2d0de5ae53539673383e08592d86787c599d0ea04db282d27d3bd59cc84a734874bc9b858c6e7523e1585e00f95f0b669ca2c20ffc
+DIST firefox-151.0-sr.xpi 546266 BLAKE2B 922a0ac5edfa8bdb280a2097a8bc8cb3a27ba7e56d990ffa964adae8aaf9053d3fba163d8cff8bdc071cc689cbcbc4422310d378ade6deabd3322724f5ddb3a8 SHA512 8bb5d5b3b2785f4e115eb914813acabb788c6ef4c5af6c83cad7941f7d454423a5922b6dafb07a83d16d8efcd54c7502d708f37491dfb624c987b280faca6e23
+DIST firefox-151.0-sv-SE.xpi 475545 BLAKE2B e29e21ff32be585570b473a51cdf35b6d8410b374ca77bfa73715e56c177c91b4eb20a8649685b324ca2fe238784df2a32abb4eb23bb603ecbae1b330193c6c4 SHA512 29e6418befc941b81cedba44816aa660b3fb08c89fe28c96a5c04154cee293f000b1a708d032312a9d01391478c799fb6c1d7d705b428e22a8bc721bdd295810
+DIST firefox-151.0-szl.xpi 342357 BLAKE2B 1e80da9633bea6e8b84b743d9c7e0ce3eeec8e2a909f58a7faaba4f8491046039724c9dcbcaa75b221650cf6a73a3f118784f83d289e2f5bde15d1c52db5b7fc SHA512 a79e9d926ec8d551456c1cf47f0bf5221de5704f581dd6fa9fbf96b2c9cdc58a1ac9f4c3d6ae4aea0411d0e4d8ec815531545347f923d569d9044882c11d137a
+DIST firefox-151.0-ta.xpi 338986 BLAKE2B de64cb0942cdcc0cbe19f42a61bfa614284795a37c9d9f692e032bced4a695e840fe86a9ef5907015a4ee3d7faaa2a4640564012f8d1d675df26b6c5cf9eedd2 SHA512 658c03fe9f11acea67d6d786646770ce4e8e168bc1c88c1bd1491dc1a80f897ba08e6352cda02a73dabd504e131c31635a9fc2564c885b2069799a4c75b1a762
+DIST firefox-151.0-te.xpi 388963 BLAKE2B 88dfd0f1d292e9572645db3e5bedb1800db5845389d7332011c468c74507f79da6c295e19a3547a2ea0cb0a5f7355bb4f387cada38b08e692bb34a23b2d68993 SHA512 f7e626bf1a6087058c5124c5464af394bd6393d7a5e8d37e8cc13d0c2ae05e85fccf1ad59b6eda97bb40321a5f6293c2cef7452dd5bb19c4981018d293805eea
+DIST firefox-151.0-th.xpi 551991 BLAKE2B bf5ea2f19784f60cc90550469edd55eb3a4b4e81c788a4a4e64a8eff42d87e342eecf991cc29854ab2997ba928b320bdc80af8e20ceb536e235418323cde0b4f SHA512 ca4b08f763529182c7a237cfd4f7e127f7f4d0c69d8d9ec7173c47c87fe7827b239aa1ed4deecb64974208171d5359cc8f6eb69ed892e1b09d8358177f1bc14b
+DIST firefox-151.0-tl.xpi 356559 BLAKE2B 15f69c5384df68a47109396d93889df4f01cb82c56a5d4b09648b31998239acf62a2b4ad05a7ffee71dba5610eb7bc2427f3c6212e8db6b272b3fd65e7f0b66e SHA512 e07520f4b3755918e031fc392e633623dc6116893998ae8d137e5ccab325ed17b28da0321007885cc6056711b6994a31f9f171196255bd9fb311df8c3be5aba9
+DIST firefox-151.0-tr.xpi 490087 BLAKE2B c6a1e6cf1f0b0f436ece92d463b0aaaaa1d5f2b1e22453f21ac3a96a424b545e354dab62c437a8ac292054ed1a045130dfccec383692e7fcd25bc2dd1e146e83 SHA512 ac34006fe7d3a23cd1d3c91990f9b6af5de33857969db12baedac412286e9959522467d9c67f53803ebcbcf3e1df9af34b05bbfb35c0e26683f4b28b58a74ffe
+DIST firefox-151.0-trs.xpi 325400 BLAKE2B 76c323c1d2f021c4515529bc444290029ff3fafb1399caae1c14164f88db01a21490ec1fcbfc92fe0a0e175c312d149b466c87aa3c59d0e802b3ec80c17471c7 SHA512 294bba2f48b6d3d6b06330a2b6c29f5f79b82021b6f95fe1768079dfb886f8db57fcde5b9b60834644300fd4dce1398ddb1509f9bacd0476449c46ae1b60f5c2
+DIST firefox-151.0-uk.xpi 548809 BLAKE2B c8347fb62232c6b1012fe0cd686868de3257a234c6ff49bb9454cf2686a4e9ebf10db44fbd9ec7006aa765a6d0e845eba79cb86de4a2b657b332eaef35b62c5c SHA512 81d707a9b356602f79cee143463fe5315562525100c33c3ed7e521524a08e8f8c8dbede3dfd6367416f88eb72235d4c117cc2afa12fb9ad346eea92e4b03e310
+DIST firefox-151.0-ur.xpi 371235 BLAKE2B a6f85848342d868bf9561e48870dda33b3289f2107f92f4db0bcbac4e5d06e075df2c7568524d58059a3294a06920b8694c4495e083137db53398eee703ba9c1 SHA512 9d2c0252728d4e66b5d340fc8a031103b23b6de106731c9e94cdb05d994b30e2a4a9636a51f5cf5c52dfe3ffdc6731733aebd7a216fe7f8c2d8ffef7f5e94898
+DIST firefox-151.0-uz.xpi 305669 BLAKE2B 02a02d6608130e6cb9ac0d9e0f926ce29844c6fd2533836a97bf22b1fb859e500c1f750bc62da311a531411ca0d193f2e8357db65d5f84d25dd56fa4c9b8e40c SHA512 82bfb7e0c49aea9302f6d0244a1b1517d86bc6b3ce114a1bbc1a31ee462eaf7423fd2910cedb21ebe32e7e35a073505017bbe2a53cd9d46f05c1af9c5a967c72
+DIST firefox-151.0-vi.xpi 510960 BLAKE2B 181d9ac9d887724cfdf3a3280855e5886563793f893ee4acc03a20056698c667d834cde83be36c251257feb90116c2d08478242ae947659789448bf08c631cde SHA512 0cfbe12eea9a586a708028352041e96cf07cd5f907b63fa509c0293426bca413e149b6dfb6e6f8996f66f70dfdc01a1db6c59d6bc3aae1fece3e3bf9e5b7c118
+DIST firefox-151.0-xh.xpi 275258 BLAKE2B 9e263173a1bab242e1c5c2782aeaef3af2b8a959a30b1a1e123d4ae3703a2ea45397b5dd469e2049b46fd1f7de67ceb3cca4eda238bd9a96700c7a34189e5335 SHA512 2ab892dc97ce3dc8425d74e88a88a5f75dfde9ab0331d5e69ef770179cdca143c58ddcf0cabaca7f7a2daba44d7f13bf1f392a6acc03a0d6f44b97842e2a326f
+DIST firefox-151.0-zh-CN.xpi 501446 BLAKE2B 690f31eebac337137d930c78c101ca25feeaeb1e28afe5bb5d9faebabbbba01fbc6f4352f1d4a41b6a71a4f0f003a7c7e8bb6a3883504ce5e17a98dc226dc5f9 SHA512 4269fd9712ba4b81f9c1b4b7ebe1233709e1f7a32da5a74a7477e625e6803a931efde238f7d0350b9ff550cd1add917f3b61319724e05235a4810cd02d8765c5
+DIST firefox-151.0-zh-TW.xpi 505503 BLAKE2B d3641c246715850153f985a2008fe0f671d1b11f28070c706576b6e129f4db5a7293c693e027027e690cd307b44350bcc204ffe19ddd77cf41db76b0e14a69d5 SHA512 2e9648e41626ea3aba89dc5bc5e8479ee809d47e71a710693883c27b375675206ddd78ad5a557c8bd9a21b150167fd4eeb208f70d7c6cae3a3f910c1c57b5471
+DIST firefox-151.0.1-ach.xpi 295670 BLAKE2B b98dfa3301b672991c87da44e1f659a1e8cdae965f5b6e96fac6ec07d9040a4aa9e2c549fae4b5d2d534b77ec0d1bcac2e7540dfbc8a71ad90ccba71599287f7 SHA512 f81fcbae0d47e724f9d9da4700e6c10c3a40d542a9bdad478c3138895d9b8b0af5728cad26a05b6e96fa04b3b560c8aa53772b0123f16bb6b58fab4fbb88c880
+DIST firefox-151.0.1-af.xpi 269174 BLAKE2B 420af387a4c6d34f02d2e723d14d418335032b6fe6c0e23e1762c13499c2a97c8f05ef4f79b0d7baf6e703aef85414b3c446afd83db6928e5e62e21119c22574 SHA512 b83de033ca081b11ca10bcf1417857301d570bba512ae17aa2c5a68f2c9409141579ffafac7136c616cb2939c2b7e240515403d29839d006f86621bdc0666ea1
+DIST firefox-151.0.1-an.xpi 332702 BLAKE2B 24df5d6fd4ed7057cbaa5a8fe1f850c196c6699506bd11bfffa3973f3b877a8a07a5db875a20c414f4f9b0808c51908dc9db665c381f0000d5ae99403eca353c SHA512 46430002db901ec900e4b7055b4ac7ecd4dc8e0dd8b8d54193a77b8a6002cfe9b37c1abd67d0d422bc119bb3b6c0b5c982589a665ed544b086f96f982e1f0235
+DIST firefox-151.0.1-ar.xpi 505009 BLAKE2B acb0cd9442f98c24377e39bd7e90f7555a2e9148e5597d6a64bf44e65580bf3f3e63f353035df2c677ad17a909a5314d114ccd0d63732c361474263c466439af SHA512 1da4ebcfeb3ac045c1e9548b3a718719db4d51d453bf47ca46f181d851c1f33c0aa3b99088785ad7c00eb86e85ba4b1e8d073c2cd63f66a976b9785801431d9f
+DIST firefox-151.0.1-ast.xpi 313604 BLAKE2B abdf0dbfa7a6ff4cd35f3dd5700cce55ea7c672765c5ce5010a1c143631ec34742d4b936cd62081010c76e48ba36b816d5fc04783f2bd2b9a7129864bc1f6772 SHA512 ae33f25cc9099179bd27f4b5c8649b0a14afc3172e44e37431033c43543bf631df7ceb144550fb189921b483a08fef5541e3fbcda346a30001decaf89007f8db
+DIST firefox-151.0.1-az.xpi 319355 BLAKE2B 6527ca0cca78b78e3507ff064c42a59747326cd4b4b6a47fa5c2f3a0e6148f58afc146f7568e6501e22333ac520757acba95c222d8d2b7fb1e374cd3a3bb08dd SHA512 c8b19b0caa7aca03c894752996bc21ba590646f07c690d3721ffcd7bfa5cd2592848d5fd33cf3f2be7788e21c241fe3ec27278f39581ff7d263a35a292c6f0fa
+DIST firefox-151.0.1-be.xpi 571028 BLAKE2B b9a212c6941bdec56359ecfd9dd13efb6198807f094cb9ff77a69193c52083917dd50a711d0454c126107e53c82632f3c8411cd50a1a08cfd38a1450e7890ee9 SHA512 ac5ed63f73887f30c2d3477e28b97d2c8b2f9d1ac7cc1916ecf5c3178bcfca119fbb763e547cccb938c61fbd320db0395f9b8194eb474f525bfd2d5cbba0c68a
+DIST firefox-151.0.1-bg.xpi 462404 BLAKE2B 398e083ab27c012dc72a9377104aa8cf8156066fbcd478201fa24c03c1f6c7788f4fe7be4d727a261cd0648b92a9c348778e1419aef08ef6e89b757057c312e3 SHA512 b2314f2112e79b3ac42c383cfae57c119f6f5295fffb59116b0416b170a7030f3e40d57328cacf637769b77317dbc769c22bcf089d15427cc3131267375ced8d
+DIST firefox-151.0.1-bn.xpi 413291 BLAKE2B da98a4319cf532e833afcebdb964805c2526f5e3bf146d92cb2dadb59bab22f08a1c888b508b133e4f67008dbebcd35437d8ea59f463d223a0e2a8116294d43a SHA512 27a06b94fe24c7d6e8e0a4c829cd9625bf07ef37e87aa74d2e2b6ff8a65b1f4e1cf187a7dcdd8ab73c9d710b924ca2482227d6401ee39a04c383d781986b7d31
+DIST firefox-151.0.1-br.xpi 395102 BLAKE2B b66264705713f4e31bd62fef7e7c19d2afc034a65ff9d8e3a52db34a9cffca82ea0a645b994ac0164f8dfdd8e565939c7268a1d67f5fa2cab1de4e67ed1281c9 SHA512 f2331711c6c7595c82d6fc392e578b42ad738f9114ceb149e4895b78e5182ce2581c0ca945fb237dbb9e0b39dad80942793ece8c33e2e46542979b60fd6e8862
+DIST firefox-151.0.1-bs.xpi 449903 BLAKE2B e4da532b65e44b01401279d8b87210262799262285b5b1b7e1b01bdb24eb147e1d7bf3fe4c546acef9d549ea392096e0b7ef5e454de8b4787788093ac9b965fa SHA512 d75006adae884e438f8ced5f9edefd92b43f3bb67c672a113f8dbd8ac0831866d6b72bf2e1dcc2cb08a93af07c7dddd559ff69acfb3821605e122b3a850fe90e
+DIST firefox-151.0.1-ca-valencia.xpi 358948 BLAKE2B b72d6983532b966a0229a81fc69426100dccde25f8101789c5ae6183a411f8e5c5351966aff9bed9b4a1442442525b4224096e339de4a9c87bf81b056fb8bb2f SHA512 70e7bb433cfa07399fd9cc3db97a353314762e73c7cfe970c6de1c7c6602ab1536f3e7cf391e87b13f3c3eaa92664134ccfd7c3f489eb0e5d2f69d28b16e7ce0
+DIST firefox-151.0.1-ca.xpi 429800 BLAKE2B df9d0f9a5f42eb584a819d74dd76c7156a331a82187047d86dae7a4f60f47066bc6504db910d7f599afa07dbd7e2f8d4611e5e6be9ab87ed2646f72e0a211421 SHA512 f9a7046410d2186feee45f64127e281fdcb9559f874b6891a6e8541758f9729948a305031089d0494f9ede3fdf04f397e1f6861230bc214cc294bd437d11ec3a
+DIST firefox-151.0.1-cak.xpi 390396 BLAKE2B 38f3d7050c8ebef26a2bd6a509b5a7370e2ebc1b95e5e7a43601c3c4947b7cae3417390347ed1eb2355b40b9499c69d2dfba33bbf8b11a531c55f99b57bb7642 SHA512 c08cdde884ca62b6e83882469d81919d93392904e5184856aee2489c2bad9530e6fbdec29937c43468374979167d46ccd77f7c16645ba45c26a3b4c21a0580f2
+DIST firefox-151.0.1-cs.xpi 522054 BLAKE2B fdb0d1519254a7915e91788d781741720013c48fff295362864053acfca8f52445c7c2c220d3e2017d9d367d3d87fc06cff407bf86ccc5c8e0e0c62ae7cb0942 SHA512 6edd054b1287f2666852796a94623e2331c1fe2cff1e46fa2469e8cadc7ef0e8da47779cd693e3fb16a2cdb1151d172f0395d44ff5f91d4667b2dd3cfbc109eb
+DIST firefox-151.0.1-cy.xpi 483494 BLAKE2B 1986ac1897ee6ed5fdf786e60e139512956ba810ac3d4beff601eb96fb59249eda02e9b5aa823d9f58f652c3a4ce48a0ec71f92736668108e1ed2dc079ef97fd SHA512 4151054e527eeb976f710d5b86056bec548563347706334b80aa6754ea1411f4223e5dd61514d3e405dad89ad375d063efaaea0864843702eb9bf93376e67cdc
+DIST firefox-151.0.1-da.xpi 464154 BLAKE2B 50a33aefff59c8700f364c43a317ff8bde4513154c2e9d0b04445330a69da92361664be2e15ab6546c526356e847576acce33df0b5c7198ce6cb47220f7841b0 SHA512 aa285987479efd258d4fe06432b673dbdf0e9187167152efddc4e033df8812fc967e6acd91df12278c6616416bf4cd3f83062261c45a18a0fe85b783c9467a51
+DIST firefox-151.0.1-de.xpi 494915 BLAKE2B 0351ab758e62af311983d06c2bf296774cda142b5a004cc16475e6552cd361f21e62745d1e46242dbddc4bcdaad582273a5855c53a4cb98599a8f32935c40606 SHA512 f064525ca5d85327bc00eff47ae7360dbc6094388f0b6adf6992d5bd1f9f2fb51b840563b28dd33c9786dabead307940ae7a324ee2c5c761e68c52e35669db40
+DIST firefox-151.0.1-dsb.xpi 508871 BLAKE2B 0476a24b73b1e46a39aa36f1723030095dc38c99246e48ea2763cd1013deefd5aeff4520b3e870f32d31fd114809e6a495742b87ddaf4a8b0179d91d00423b48 SHA512 8650c8b3619ae3f401917d2591e94c919e6a2517a53fa2cea005f4afeac8bacae6746ecbaf34a6c9308a2d453d91a5b2ac495a5ba4781edbf91bc70465b4634a
+DIST firefox-151.0.1-el.xpi 586685 BLAKE2B df1de3539ae37428a9c0dcd05e41b82908284f1ab1cb46d261a00d0bb23eb3f2b4119e02f5bfddaead290c95ad139d0ea785fc7afb9a891474c0fd28f5cd2434 SHA512 9572349b9c2cb1b9b5df8ea003cfc27c95e59a7158c37956222b9d42add54194dc88695a05944bce0874b202d65207efc0a8ae96b6a38179c693b69a7e721bc0
+DIST firefox-151.0.1-en-CA.xpi 447417 BLAKE2B 390bb062f2ab49630ae45f3678244e4fab62bb6f993fcf031e54d762183ec93203d79e5a0df429b350d494c5addcacc791022d6b83ad60704993c8920b277af9 SHA512 59913e89262448454d9be2332bdfb68b97d9796bea9f4d68bae2a5b8e3c157940e46dca6acc247952e1f34f5e239cce35202b98c061618bdde2568188f5d80f0
+DIST firefox-151.0.1-en-GB.xpi 447723 BLAKE2B 40b007547f2957763e54a6fa2d8069bc0840d79b3826c2c48906b7c117a3ce4f8cb6f6c9064f489c8a6f05da84f98b9ab2faed14c98a9397987c20355afad6a6 SHA512 035c8cabaf61046540efdf60ed36f84e65be29f4e90454b0d3468db0fb4f49fe614cd5400b0954e1f523dfbdac2fdeee0093c1bad4846c6f528253d39bb878dd
+DIST firefox-151.0.1-eo.xpi 473061 BLAKE2B 4263b8b3bf133539d3ebaa32298c8143f4df0c40c0a6a05aa0c3e7683686f5c1955f3c475c21b62de8d834259d203497c5ec083549a4f646d89eef2af39a73e9 SHA512 c02b939e56a56d718502b83c678b4d29691173bb6be8a2e27f627add1a5778bfda1c42d960bc7d3d09188bd78b810093c8a36983de0eaf1c3c64df690d112a90
+DIST firefox-151.0.1-es-AR.xpi 485597 BLAKE2B 6bf5795f3706cf8f6fb0a4aacbddf51b45f2ee33e0378cba021b2c89e051cfd3240729e5dac64c91d04e9d49a173885629fc94bf0331f20c7e5c080d93a11f86 SHA512 bb6e452de3a8b60063fbb6c2090bb2bae89176b58eea7ee0d3404cb0b76b6e0e6c834972e6e21cadcf62aac34b0ce6111c321b9fd60488023bfa7c25a948f66a
+DIST firefox-151.0.1-es-CL.xpi 487114 BLAKE2B 6c24ad4dfc55cda8861ac48cdbeb7efe20ef424ddcd031191e1c4c96a33e24840d869a3eaaf134a6a29d9771d674475cdb07f69d960869a1a7a1a039d29d18b2 SHA512 fb3c21d9b645d970a9f5a2f14853f3a5fdd84b888fd728d228264bdb1329f540d7217873b3c9ebb1d708e5f7fae783b21f2f6b938a057b2d5abb493d2da94208
+DIST firefox-151.0.1-es-ES.xpi 488008 BLAKE2B f90d90be3d3101a5ac49825bb1a8dd82394b8f0d241e75be3afad7d8f903621a78c02a053000310ad0f3de3f3ea854d0308e48d5dfbf1deaa16efd69a40e9279 SHA512 02365fe94986b26f9d7aa13cf5de42a8c4c29ecea29d55084b4fd29769d1cfae5ced369939e9c99c2a47df69748aa8bf248ee07ebf55a9129cc5b97aa41cfe20
+DIST firefox-151.0.1-es-MX.xpi 490727 BLAKE2B aefd7c050fdf1f561bf2e785f2e836092ca59d1f006d12b9fc2f6e1e421ab2e80fe2d8f32bcd2dba62fbd17d6cb1fb603588716b8e16ca27222446ecfcd4f560 SHA512 b76e433a967ac7a80155ea854890d4fa076331a8d1a874cb84e2920bf0e9041819c8a17408233294efab7e2b27162f94a4d65a503ce0a931c10c8c668b6f0258
+DIST firefox-151.0.1-et.xpi 359458 BLAKE2B 238b2ddb1bb47e40fa4940b3e55f1f54bf763585ba3dfda32c422cd0811334f5372a43a6b9a3f344bbc50afdef30a8ab9b9bb9067106ec66851ce77c37a1ea02 SHA512 a24cfa8e33f399ead5b7d6b9501cdcc042a321e7da95114749907b3f3de886369e4054bb6310e4374a74ea642b1448ed44654e1d9b91cf660c16b5d67d253724
+DIST firefox-151.0.1-eu.xpi 472418 BLAKE2B ebe85bcf87b404b6a06713f5e57f05615e728f2f8c819da141bc271fed9a42b8005fcd7beadcb65bb142bf8139b34969ce2a639d5a068d71db51c142beff1042 SHA512 07144af2a78aaa756052c9e9cfad7672f0d71439abf79c5d5997ebe4ea46db2dbf40a1b7560813c207776e11f2b9f60927b1b8a3feec800f36aa9e8119f986ca
+DIST firefox-151.0.1-fa.xpi 420522 BLAKE2B e971a5bb6d3cd00ac11c3776e3ea49f6c660a75ecdb86ad295927367cc7fc7a128bafeadab5e1b57385bf715cbec84167e3765466faa2b64de9d5e532ab2c3dd SHA512 70cf6aeb0d82eb4621224e8eb397d0ba1fa034123f229b9b64d664213c999ff26f7ba520cc01a11a86d5563344b9bde87acc31c26a5bf8cef7b8304026440390
+DIST firefox-151.0.1-ff.xpi 311032 BLAKE2B a86925eed9933c49c632ba3cc7dad115ec3ffc86b5cf8dc9b89cbcd3d7111ca3b30fb5508c35f7b944de86649d0530a1f3592f5d344f1c534e426878483a7bbb SHA512 09bfeae00eea1f22b45b7119f6113fc4543ff894187a7370230e76ca0a5636b1b85e6a6963421be3dea450ee3e95fd11ebe28f2084c9fa115dd63083ebed7d70
+DIST firefox-151.0.1-fi.xpi 470440 BLAKE2B 2028491b88e5b8a42427f4fc221644d4a4425d3dc81180508694fe4f374f326f7d5f5dfb4138ecbb8c2778ff74ed2de1a62411152ca13899eb7151424b27182e SHA512 75414ba27def6d3d99989a0a0d2c788f492168041085cfab287d2267a5bc0ac5510d5ee5351c6defdadf5a3a073555c125b7483f71777d7b54b15828d00d0660
+DIST firefox-151.0.1-fr.xpi 500642 BLAKE2B cfa612cefdcbee7f0e5bbeaca82ac551487186c30602effcd74ca16007386fa2f722cb537db7f98c9252d2753b2f6fefcd39b9226f35e7553f67a1d530696919 SHA512 065529057251a7594fbc9d9d4b6c427a324c693b4040676b0d85e0fc2e77bc1b6184a624ad46c5fb28ffaaf0b0d8cbd09ba36547031647584262c51812c96915
+DIST firefox-151.0.1-fur.xpi 476236 BLAKE2B 4d1429694750c3a95f5f199964f27a11d58d16bd84b632f30ea9ba2ba62ffc92093ca2aa070997295ed3d7bec27328d1c084f5a875fe9e9d5bd942afbccf6ec3 SHA512 e66cc5c0a4373a39e77dda3988790eed2e1937e7b5afe7cb2fafd6071a48c5de7574ea6a8171ad2e656582ff0ba5a5f0080ebc8f6ea22ee19698ce35410f49a8
+DIST firefox-151.0.1-fy-NL.xpi 482258 BLAKE2B 6b1e3730664cce96ace8ba7368cf09517ae313f0d0b200525a5a95379b1dd022da9a5abb88d45ea6d5e1abbe3810602015cb77213b9bcbc5accee9ef74780c39 SHA512 1aaa51cd94e0ab3574216f7ace05e460534a5866b4c04af247b08129a8f12db6ef3a8e1ec7d0d421d29763b2a5b10928ee429fa3e07d47d02222610dce8fae2c
+DIST firefox-151.0.1-ga-IE.xpi 316679 BLAKE2B 225716dd08bfc7f5c06f0efd137d3da8553e636a60ab513cbd5da03705e0bd3efb7f26df407d6b17e48f8f25ac4ad706a9ec066a85fc9f7ad47b1367cfd90a1c SHA512 c090bc184a2e0965e2abc47003aca2bfc42dc064a7a1d06818aca883a1b8f77a0ba288a64157eb777bb2e1d7714b06b79e9b2fdd073319454266e3d68c8a1ad3
+DIST firefox-151.0.1-gd.xpi 410055 BLAKE2B 1328ade245aa591484a0e72a6eecbe85a51cc85a83f069c5cc98b2939f98eec7a5925d0f8c76a30f2dc0e5563b9b3376f7037abc5cca2959e239e9a57b24cb41 SHA512 5accc309ccc59f7429d0763b8fc5efaa0b44827a395988e7fdd33605d3c00818d019ac39ded20a9229b3f7ef8c3b8df14923358d30d358f7da98b0ee68016c5d
+DIST firefox-151.0.1-gl.xpi 446647 BLAKE2B 8654314ab6f34d51055a06a94ff2f6c92dbca80b2c95569afd709ddebb56141ee3c9b6ac21d86034d5ba6a913467ea01a239e416e35b0b04dd2e8a1a4ff5fa6d SHA512 e26fe0af87484842de98937aea3e3e173d71227395ef7579b70e67abc74a06e1cfa903bbf27b846e36ecee3227f772b5a2a0125d3a6dbe1db12665940e9afb92
+DIST firefox-151.0.1-gn.xpi 490550 BLAKE2B 2e1b61153667a01edec84b69b35ead193a853ad00bedec7a7bff6a2e8362f8c5d0a309b31ddb473e1586455d8dc984e64396269f8675a5b39826380133ba71c1 SHA512 2a7230f894f240eb420c815724393a25c76bdffac44c137670de84b4bb751028677a532bde7928b3d86e3d197b682075f781c0ff4ed8ec744cb6e733605173ce
+DIST firefox-151.0.1-gu-IN.xpi 359213 BLAKE2B 685058a5965eb4c4cfacfd00e37c6f8ed37e5eca2d85cfbaa1a5ea850de4dc4a2cb03e40639615ef028dfc69c2b5f4f2c71085ffe939f4f733abdc6419f41f13 SHA512 613925bb45ffb61a18c1d353251f6b3ad39b72195a8031abba4cac51d5413fae2079a2f0c52c40b3b9f79582259fa8242c568a6a08d1718848ce581ebcd4a6bc
+DIST firefox-151.0.1-he.xpi 486345 BLAKE2B f73e0b9802bd1e126891643d09c4ac5c8eb9919534f715f8ad41bd581592fbb92a80aef3092891fbe02e9508cc712fefacba10e1c4a24d1e56a1df19fe3ca38f SHA512 530c01c3c9ecec4d6139d4003e91eb14c6950b01bb663509709aa3ad5718ef3b3070d51d2e9f745b07b52038ddc8d58399e70ead53ee898f65ce8131edde0e89
+DIST firefox-151.0.1-hi-IN.xpi 378098 BLAKE2B 6afab16190b2807890bbd5e67b20fcbfef1dec39fef9e966a1e504598ade1c9598ea2e5e792ecb63ef4d97a62aaa50ddec12ff173912b516a2977e35fe7a6a0d SHA512 13604e93179e7f922a04efb15f3cb763ded32b519ea330befe87455edb58ce424771568a72241b8ba49f7e181a22154248cc07ca332ed2419bc32152451cc827
+DIST firefox-151.0.1-hr.xpi 472568 BLAKE2B e13db2021d67ca8d8a44f59643648a802718707e5a30e7fbd417b24d739d164aea929bbbdd07699d22323ed1024ec35575ed78a546e4f8ac96e34fbff2b3d93e SHA512 79903fb55f8b35240b47adb98b7ecac6c2f2f3af653391d47ab8e7612e697d4d69f4373bfda8419e0d2db5b9cd9ec3e577dcd3b2b4e44681e34ffc0f925735d9
+DIST firefox-151.0.1-hsb.xpi 505523 BLAKE2B adeffcf8f74d9397e5680e0fb9c642a1e0f649d3460152ce8134d5ec231011c1d234fa7d16c1648ce61cf6de0a1a9959d7fe6cb708e3c3f558f15ca545fd6fd2 SHA512 7b8cf922fee363d2c1a6e47594466622c89e3405f33f552b7e966bea5570192137794660747e16cfc25ff43a765a5a2fa63e428de17144e94a63f3af4f6f2fb7
+DIST firefox-151.0.1-hu.xpi 509760 BLAKE2B fd3f8e154209cf77bed0501217eb8a79f5ca805779847e87436ce267ed5b1bb35d4c149c5466b48ea795ebb8374176fc9e06b36b5bbf3ce63325f1fdfb114bf9 SHA512 93bd5d3d5b51f7d829ac7ff73de493f7bdf7cc9859b6f14ec6f367c0b5be98915271933455b0b326893ce82accc9983710cd0500d9bb4a4b820ae1b3411c8a99
+DIST firefox-151.0.1-hy-AM.xpi 486946 BLAKE2B 6b37c5900658c1a1d1bb1138bf0660578fd1e6691b92f082a55ad386a81e5bf7030dd98177999115042e9baac757a6562f70ce9331284b88289c2ae3ec0be25c SHA512 8ea3512ad73a076ac49536a23e6b91bd9a8b3de4de894b2ac0849332a8dee852660f5f2261888f94d7b7a8cca9cfaf19d72ec6edd0e89a40ef2f075f5613405e
+DIST firefox-151.0.1-ia.xpi 469198 BLAKE2B f95ab0973394b9e32b1319292b8e35c49da8aa73ac29ee0530f2700762d60d58c0b32b1997e2f406eb775a2c990bf13ffc0749befce0056a8b5eb97da1714e43 SHA512 7b2c0c5348825042e29f929133bf590331524471551f8c9b6e20712b142ded7b83f2c0c845e113eb618875725d27cfaeecbfc4d12f99a1beefb6ed84ac0917fa
+DIST firefox-151.0.1-id.xpi 432658 BLAKE2B 921dc1d25b7e71c322bd3009dfc0c00b852c421b1c7cd9e037a3728cd703ff35a0e30c68fab53bd5296341ebb37d24293ce74d12123e405f45dbc02bb003efd4 SHA512 398b035dd3658a2859194ea6c4e707a0078a912e4fd93ae204f754ac969ab72338753862f5ff9ffa48675e6bddac275ad1600bbd38914f7e11cb6b3b30ff6743
+DIST firefox-151.0.1-is.xpi 440512 BLAKE2B e62f67b54b15b618dbec425769e9f7769c03c8ca8df88300dea448babf10e454f5fd0241237db1ac48d4ed7a8b5ede831b3961ed18589ec94f3c6f82171344d6 SHA512 7223d3756b926ad2b8e269eaefd3359cc35d4adaea3debd63a5c6c829accb98132ceec907aa69bbfc311aaeed6b6bdbe8458064de9f2052dbb38989527257aff
+DIST firefox-151.0.1-it.xpi 481179 BLAKE2B 8d17925374752b2a33946a79e63d19787a20448f0c355a1030bd59a8550854c9811930612a99c9b4255fac30b5b5654138ca6f3d77dfbf5c24a5f6bcf13b8928 SHA512 01642075f4c6c1498fef2558c263f2266a9b989d9fa5bfac11c0548138946b8442c58beafb15d0ae41af1850657f42165a6deaf8e8e88d0302caa15237da4be7
+DIST firefox-151.0.1-ja.xpi 524698 BLAKE2B e592a2ec5cf136a66750cf06e382e795d573947b5fef6160fa7cb2e03b408f7f6f523dfbcceac20fd2a091f94116b79f6a12ab2ed0c8d74a93dbd9d7831c2513 SHA512 ca7ee61ebaaefcfabff17571abb6dad42907b15e65d976e1eca7dc9515b5aa8c88e0377acfad4f8a49d5e0f612a522a6e465fcb237e95f04cae6ed53ca1c42c7
+DIST firefox-151.0.1-ka.xpi 543672 BLAKE2B 7b8b5a10aca0f222c54576235939f01d9222c815623b44b42d3a7738ef93d64bbd9378bdde37da8677db2abef2b06a951ed2161009f825b0387a9229e59da13e SHA512 8b9337751e9587913f50bb6eb368996258a843a69fc2be9da534789572882dbee6e1c302deab74db6faa0362ab0769ba39da695f767c57ab448767b38553b1f6
+DIST firefox-151.0.1-kab.xpi 426258 BLAKE2B 993bd494bb772950b37e21feeda405930d4cccd3b9f9be16bf1530304bbedd235066d5acea258532a906184f3a637678ee5e78aa99bfc2c23b189bb00414ea4c SHA512 79e958e30444956995f49d6cfa320523557ef46e160161501889210e3ee0d6a36a879f52355a7bb69de45f713fd6ce82d11ab94206e0d0f4cacd817061f7e9ff
+DIST firefox-151.0.1-kk.xpi 562331 BLAKE2B 2469126b10332e50bb03ac3502f8b4a0c66d97a1da1227b93728868ceef959387d7cbfc0cfedde1cea05a732f27c4258ae02d1541c965675d74cbf5569dbdb1d SHA512 c001f9ef0cada16f5c1bd992ebdb822ad9147640447bd14057cf33dc8caf8afbce5093715e117248194344bd7b72ca7d912de1a1b062e331a009c906a85dcc26
+DIST firefox-151.0.1-km.xpi 376360 BLAKE2B e1f9b0bc37fb521d91d6755d6206308f80914a9b3265d3eb6a0fad3347c50154725b71d23fc4c4d57887e802df9f7dea2af7d3b90c7ff27070230a3159c32e3d SHA512 4b085eaf79d336727a3ce1fd7201350ba4597f50ef6d9f1879351883784ff244f5d84ddee2d862bd4d5da9bc6901d1a253f44cce1511bda5d2cddef5df8d60d3
+DIST firefox-151.0.1-kn.xpi 333537 BLAKE2B 87a5acfb1c9b24eb03fc95aab958d956c5f1f485b20d593c453915a7599e6a5c063b1ea48ab4e52694f466fe3fe250f3cfaa757ccff36f35240f6487d5d0aeea SHA512 0ba54d8589b56010ab21c3214666cd2ef0cad8d6991edd4b2e8ea4b4d69913fc1de70f647b0c64c2103e0ec7d1bde3fa7cb61c748f1bf2bafc159f31617770f3
+DIST firefox-151.0.1-ko.xpi 509138 BLAKE2B 4143182f7b61ad12b8667bcfc904dda80bc1a68f231562d635e0889369ac399cc574bfa5c4a968c1ce2072e0cecde13199c705c0cdec2a5be197d9558b82d693 SHA512 0e683dfe3a5aa58dc278a781ce708379922b567181e44a63f9a5ffff10775651a790af0f4b0570f04bf9e0a11e7572e42a5c07193c4dad57e06983cbe15978b9
+DIST firefox-151.0.1-lij.xpi 320392 BLAKE2B 8fd3e1ed8effd62ec5c74503e5045fa7ecaf3bba7632164f478b6f01c490efec1fbc07ae57ab6bd1da526bfc1b7a78e57cb471b2da01efc8baaf8d4032067146 SHA512 fe8a0348c94b7fa0c3377b1e79b0b36fa6c6abd4d57d74bfb3a4727a8d9f5f224f9bc6013987c426e458b56501aed92a7f9dc216ae12b13b354e33fc896b9b0a
+DIST firefox-151.0.1-lt.xpi 380206 BLAKE2B 9e11e8f522d5ee7e34e9f412abaaef7607228a3c7cf8923565562df9e2d2a52c150eafe3106d8b5ab2bcedf4a1af9009ba5d6cd064cf6d1dc994f3086ee3ca02 SHA512 b38c0529492d36c1e9b3f853d5f9b1b7e7bbc3dcfeed919fd3ae27f843d8ab860f8be6226ed3a3861ecaf78e56deb666ca31a3375b956331aad483e9dbab3b0c
+DIST firefox-151.0.1-lv.xpi 391289 BLAKE2B 292a2f96c19bceeb7feadb8f6cd49d395c2909273e3522e645088e0a85d40a6c0a8494cf8df28021a147174a11ad473554777a645b4e3c94492854cc5f5367da SHA512 b74cad2ac0a1e880073e17d716144c8944c4b143c4d60aae50aa9b98d558f4f89bba7b5e577ddac95f5abc560896ce174bfa1d84316c62496ff1fe6968bdc832
+DIST firefox-151.0.1-mk.xpi 353111 BLAKE2B 303c79815701c53ec238fc528fee4f5a77a6e89bc1e5f1529df4321034b02cc9092752cf480fd2069a913cf095633f012255a85e10ba86c6faf3f1e2026f0728 SHA512 fc23a7b74726970700d83367e71094e4ec1da6b7d46038fe6cbba483acac708145553a7a842a7a0496b15ad04d648a629428e55b777e1538ab1efb24ed491d90
+DIST firefox-151.0.1-mr.xpi 357104 BLAKE2B f6ef89f659db6e62a8aa6389bbdf8644fae31ad4bf9dfa40795d8cfbedbd761aa2a921d1bb618e38d72ab27adbc9cf7538e6c65f2d4e13c62d8abda02d216c77 SHA512 c243f714650335c57153ff4e7b86f02b366347c1093bb07720c8215a31075f3cc497188ef31457389b1da35537977fa11526c3de4fd306cff160345df2c5d178
+DIST firefox-151.0.1-ms.xpi 296903 BLAKE2B caf1fb34296c5913c8981c8e24139b8c1d6acd85dbe394fe7fe5106673bb57d018cee58cef4c6bfdbbbd0b90c9450840cfd24e8858a7dad722aec170d9fa9a30 SHA512 60ff24e18480593f5edd8d121d445ebee85451f65b5dcb64e04010f10fd22d8ed65387f5c585b5665851ed64f116b884b6ff9acc514b1cc322b43dfe28cdcb1d
+DIST firefox-151.0.1-my.xpi 344105 BLAKE2B f7ae98be5cdf37d1daef6e118668f296e78d3d717961af6abba09176a54e032c0f9395aaf762dca71e6ad3d8a944d5bf5216921f01773441f05854f45830caf0 SHA512 2dcd09812e9a7fbdb872600d60ecc92cbe2fed5daf1dbf00acc38fb9ee107176f40bcf224bceb1f0ff7265a03ef8d92dcf33c3016fd86876a9235aebde6344c7
+DIST firefox-151.0.1-nb-NO.xpi 468217 BLAKE2B 211a8691136f6c35571e17400791621af8171ced28a7ae3eff290fdbc39c3c396464b53e53a8accaae410975d74fc5ec53763637ee6a6d97faafeae1a9350665 SHA512 79e8baf918a1f3e81918d7e905b2c74581737818ef88372d3c22739c89fbedc59f6bbb87a261ca85c6fc968d86bacde638ad3632afa845eeb4901fc5f96bb465
+DIST firefox-151.0.1-ne-NP.xpi 349215 BLAKE2B 5655a5ab82a3d4da20affcc2565dbc474f859222ab0edd32c0e03f797943d6ecd7666dbc64202652a38d675926da64457ca4422bc463bd2e0d6e75c190f68276 SHA512 1022dd98b2c2e69beaeb464ed79e7ea0af1741453ccd266e028934eb731a071fed8c168cca529652c51eedf783f8aec8bcc079a53cf4c7a08d59363bfe7ceb33
+DIST firefox-151.0.1-nl.xpi 475886 BLAKE2B 0ceb2bda560f0f040c4fab2750c23b29bcae691ec4fd7640f4ee358babd94b002312e346233aec4664d4c1ce0ea7abad3a7e525c62bf3ae74121f57d0a053ed1 SHA512 0761204a3aba954376c76f7e35fe28115122a33c8d7a0a27a10bb14560477a5a68b16b6b41468b73b056a7c186b9687d65f6de53fe6a0e90fe01588dae6bb929
+DIST firefox-151.0.1-nn-NO.xpi 471574 BLAKE2B 0b7e22d107b33d079fc44924efe130c553f3d70e156620d87323c07c59417e3753bb9e57a5b2b08bf7b96c26710baad8b766bbbb814c07e1e4e86388f2ddd840 SHA512 13f45f25af09228cc49733501c94d3362f9d429f36900786dcca6d1408b754498f1dbe7a61bde51345514dc3a222705429285bf17112a4616e90b477a178900a
+DIST firefox-151.0.1-oc.xpi 414858 BLAKE2B 363550935432804dd6dfa21223fff4f0b483858d39e50ac50fe99cc9966ae2ff942e73fe34928a8a71b5987b0fa6047c4f5232e8580c70b7bbd5f45e0120687e SHA512 9f59c1b40f9566d0ce818242ccc578eaded102f0aa58b6f9ba92dd4d625cc9432f792a664cae001d673212c2a9243bccc1084ff586359c1e66e292225f16fe01
+DIST firefox-151.0.1-pa-IN.xpi 542013 BLAKE2B 9c6d5349b7315030cb381e6a7f7cdd81d214c8c9680ef34a6cec12f5aa2092555a57f1f40b497063e0f83dd83e4ef7883ec1586b251aeecd1bfedc32dbcde03d SHA512 bb6849ae6fbb8b8bb0dbd5d712a1e891d7669109af83fe2a3fc168e6b81c1bed1b2b1b4e02ddb71bbe3f78e9d9f5938fc5ad84f2329ef7a3ddd25681d110819b
+DIST firefox-151.0.1-pl.xpi 506672 BLAKE2B 28b306085dadbbea7bc8b61839bd64037ccf577c7f2884a69a500f150005a405268de039ec6edfaf817cc524ba0b6aa7dbbe7d16fb32f8dba23221eff9f1b3d0 SHA512 ea680c690dee9cdc63fde8d7d509825ef7027e700b54ddace4aaf64ab0d3219f0f11957d8fb4be387d13baba1cad05a557ed88b99abd08f71f0cf5d5ed01e535
+DIST firefox-151.0.1-pt-BR.xpi 480576 BLAKE2B 35803eee114ae90c57eda9157012cbfaf68f14598716884213528f31849f2fae8ff2bb656c492d10e56decc7cb6f9a6a8b3823a1d4cefc2d420fdcb09d526d7f SHA512 305326a18def69308173c8ad806443826cbbdaa97bd7bbf7cfb3321ceb14f41495ef1bee54792f8136660ff701121c23d24df9bcb3e2857068bda577ebc82ac8
+DIST firefox-151.0.1-pt-PT.xpi 487430 BLAKE2B feb1de2e29ba35adf6932536a938cb4b159dadd1131fc8d062be0ca69aa672486a6d12b259651382cf273f3cc6f626ee40e560f4ae62be1a7b912a50df126731 SHA512 e54a113a470f19975437172761a5681e62515c555520f7bd9098946decf4f90e651994383ffa4877885f9b3a2f1d0c365445b6acc2189a1d7a66d87f0914ddd0
+DIST firefox-151.0.1-rm.xpi 458391 BLAKE2B 5079129870743f0735be7a28bff41c192f59a34f7b7ae11214afbdb87a9157a0957e86532eb7c3fe8109f7f026d0dab77f367069adb607e89eb504c3b5d22aed SHA512 5187add80ee1f360b8fce28834700ffdef324f0c7a6d0b2f43f6a365dd5836eb4e4a1bb079effaa8ea92db8ebfc75b89d837b379b481b36e5301328bf26f1340
+DIST firefox-151.0.1-ro.xpi 494343 BLAKE2B 4e46a0ab942a374cd3c438f1f1b3fb6400e0f3934cf59650957aaa2f20b8f4dc09aa1996ea3f0e32419cf215907dfdd6f9bae18473cb495a674204a687202185 SHA512 fc2be896132bb8fae31a640c60c82d56abf5434922e75f6894f1a51e5f66bb84a2357131665fd37fdb43bf1d8235ca028128ced2f0fb6e201b3584c0e8ad4f88
+DIST firefox-151.0.1-ru.xpi 574703 BLAKE2B 5326a5ce2d1662c67d9c07e4d98f8baa90e850fbe70cb9748a35f0a2f7f77cf5705550806c2cd7aca6c399b08388f8a377322e4c85f8664112c4216ea1dd059e SHA512 61a9f12163cf425f36a142af3f6add9cbfd6da2713c118c506111decf434ecedc21629415a50608eb7cef5531afa27b41490871fb4cb9ced550f3b23394787ff
+DIST firefox-151.0.1-sc.xpi 429224 BLAKE2B 7625511f14ce2730429e06c4cccd2e647f803973ae128bcf7ec8b126c030bc647014596b6a1eaf6f061fb1344db8f99f52b7b6f8e9fb989180d62de59d7e473e SHA512 cf84fa28a963c4d6fdb9366f7ea3f59fcffc4503d12835d3fd7c41d81447aa9465c0262414a3fc5f1ba07370d537d5ce796c43300a7c9cbde1d8c36dd6446880
+DIST firefox-151.0.1-sco.xpi 323584 BLAKE2B a1b7b43ec6801f427506f9bb6cf7684be64d07d52b2a12cd5effa40f74b35a7cf9fcfbb6ea2c8cc269eeb7a10b5880e440dcd4f268aa8a1b1edbf0ec32e38830 SHA512 a24485031193b5ec60ebf8d8355770cc32163d633b5d21fee8c9c48dcad7c15739632384dcc108eaa3fd09463fb0cfcb4fd404391fea1cb1117680b0bd06a0e6
+DIST firefox-151.0.1-si.xpi 409772 BLAKE2B c249b6013091e3cb8f483a19b34a8178bbb931ae144262f0fa63205644c0edffc646665890dc83f32a7ab3171d5b40e6b3a83a611687c26f9f10cada6f3c91a3 SHA512 451fea670838696a272d66eaf277e50ac3eabd63d6232443beb75ca77d1834a2b2e067ba965f288c9259c7b116456db13b544d0c8f80bd4c0a91f840e80f1a23
+DIST firefox-151.0.1-sk.xpi 512574 BLAKE2B 2ed94fcb548c9db7f2b951c5af788b83a6db3d29ea6b5b921b65649923c1ac10ed35239dfcb58e6efd25851d2d39e6cb176308149b79478f548721b9a7ed8697 SHA512 eafedc3b55aacb132c4fb4906f1e8a417a62633e2eb02de3a85bf4908f1938c155a87d242505183cd41dfde0b6a7882714942785e842e9e8e40fbba05a0f7dd9
+DIST firefox-151.0.1-skr.xpi 484960 BLAKE2B cd83bc31ad25648ef2ddfc9c662a76fd981473db04c1165fecde1a83ff03f5d8230cc3fa056394cb206ded9b0e5bd733c0427fb2ebed344dd9fe4358856c1826 SHA512 5c26c2e6eae279ff14dc272a318fe0cc90329631c82f780be51740b057cdaf5958ddbbe7550001d39eda65ab013e5b6820238d79dd9342b1a541e980d333287e
+DIST firefox-151.0.1-sl.xpi 479139 BLAKE2B f7bbd3cfeef01a7a6479004b0731cd250e7a2543373caf105a7dd83d07431446af64018a7fa50d263a40787d04ccd4d24d2c5ccd12f48ec565316d6dd95ec9eb SHA512 6c46970b6a6d392c43dbbf8dc930aea829aad66f6455522b79c8556b5fd845a24a6d2e06bbb961040555ff1c7abf1f45e8c6a48748924a6959a37a807513220a
+DIST firefox-151.0.1-son.xpi 275710 BLAKE2B 23c8d30b716bea29486b16ffd9a8e2924d17b1df853b0d35c992f55c141f7e45b958c556e7ab0f1c99e9000893d6e4eabc3e0035e6d0c6014de0dbe095cecae1 SHA512 09bf595509e5630bff6a5e92c2546aed21526d48e17d662d1edc343cf6dc2ddfb2094553264a8ae69ed611a9c49b2d5a3a847e1bd225da059952c91ee2adf117
+DIST firefox-151.0.1-sq.xpi 492981 BLAKE2B 49371e415d5b258c74001313754140095a541c16b53f502c73dcee1a4aaff8352f21e110c4d45c59d132b0ce75be913db440354c0f42129c8f8ede06ebbf14c4 SHA512 645d9eb5da13a13046b9d9f2be6e673dfc4b2fbcdf4f8aa722bc4def97b37ee1e37c62a780a555d071760cadc0970d66703b10890d0be971f91976d48a3ca2d3
+DIST firefox-151.0.1-sr.xpi 546274 BLAKE2B 709b945b779f0ab93798fe59192318054ffbb368ee8fbe11f1e84f3bc0e73e308eb466d9004784e945b50f0975464d6e6b243bb7560b6586012b2b996ddfa668 SHA512 d958511b00dff7432fb5a87cfc7bb4bf4641c98ed3519058ed06d56f4836102bb77b7fffeedd59795c60ba5bd5292a437a29e95fec9b47d73b08ee39d1088b19
+DIST firefox-151.0.1-sv-SE.xpi 475546 BLAKE2B 900e2ab26965177759885cdaa3f0b5f3cb7c01d51fe229fc3bbd5a44fe56b916d32be02eae5fc99b0753177da2a88f7a7ce200aace3beef85732ae87150d5fbb SHA512 5a538185bd66757baaf0e68a4d8d35468830a0b28c61b8f022372beb170a0d6981ccd9e7ca1fef6a57f6ae2cbd8aaaffa6ba69cd18b03b3ae129bc2327abfb75
+DIST firefox-151.0.1-szl.xpi 342346 BLAKE2B fca95653658ccd49389f41e8f0e2dc98c3c819b6bd8ce40e73ddeeea7e92b019e391e6f2c6550d48d1a3dba626c7429b20162fdf63116e46a337b288e82e981a SHA512 b717962dfadeaee94e908b796a988ed608afab4e78800854fae2c18eca73f135fa755ffdd2cde2829639edf9f8ec267a8e9f0304a121476e102e653eff0cb518
+DIST firefox-151.0.1-ta.xpi 338983 BLAKE2B 2d150b41270e2feb8bba9b4ab236d6330407fa243f4c7b8ec50e057fed3b58f5c801bc5506f035a76f6bca1e73d134de856feecff4bb4640b742982f5925b60b SHA512 5debf494ee8b8cc25d8b26ab73a25ea53413ba477038cc68439dc6b85099a3a6dabc461d77f1f150d564f2d63aa69a34bd50408b1b778018c16c7e39a20d2d01
+DIST firefox-151.0.1-te.xpi 388956 BLAKE2B 206462ed4d8cc1c0fda1c2bfdae3a0db8b8dfc1b187b92525e81db542303401526a5f92dc3a6915f3498e05fd0b7af8d3604e6071a41a775e083d887ed678a4b SHA512 a2587941954aa43d0188f1e12ae7fd78134aa84a27ae75ba84fe0811b33c602fb98ea36d8c2860c411c80b04fc09dcb3edfd1a835ed2df1b326a59734c70ccc4
+DIST firefox-151.0.1-th.xpi 552176 BLAKE2B cd4cef61389fad8d20bf8c883c574391c19f9c6a5bbcb738485a8a5bfe34961f91908f1cb7c80365038fc3c4487365970ecffd666650e09878299c8becbe2618 SHA512 b77352c4e71330b1a9b1b5764a6c684a1617e0ef90d9be211b45ee6b212aa4c77f579492c30279591fbd8c6bf186c27e154a8b8699838668099f10867ff28e30
+DIST firefox-151.0.1-tl.xpi 356559 BLAKE2B 96b9430cd197fd8ecf5ce77e6f2b747f1c10f67c4d4bc9d195497c37c56b2be9fc9be29f2eb9cd15017376880c17808573f4adadf089bfbf27396d54fe0cf0f5 SHA512 f2489849a973634e96cd95d3f5ff2ed495b8846972ac0f760cc6c9501b1eab4d9beab531039650716ec2fd66cecf01b852d4368645c68c0cff997fad4b4e408c
+DIST firefox-151.0.1-tr.xpi 490093 BLAKE2B 2cf66d8698c7df0d1565f30dd99de7f106e239fcd57228985f74790339f8e2b1c8ff9f140294fb022a0f8ea2b39e94dff84ee4af7ca4a6dcf3db92b666a2ca4c SHA512 16298b08506640123374398a7476087432fe2429f3cf806440f7ca5040fe5f272caeeb15f1ccc335078b713fb1996645487968384c209509dcdbeb3bcdf0b04d
+DIST firefox-151.0.1-trs.xpi 325412 BLAKE2B c2e517878c1c9cf0125f322c5ce3e336ed1e8fb535c4dc7e7c5e4916e82e28322b9026f76f8fdebfdb59e52c0e65737e93fe7810a7da017e5fffc8c422c8a159 SHA512 41f9fa085ebf6a601eeb50bdf682bf6ebb64c11af1becd4ab7cdf70ab411477078edbac0013ab45a16f7c513ab2bb79e36efe125204e6214c7d473d5beae94c1
+DIST firefox-151.0.1-uk.xpi 550584 BLAKE2B b9951840bc023615f9b43e2989f77239160395f7fdba648e345b1e3254b64801a42c3ad06851c9926d7b841c658ec5d030a8b7979fb0cbad08417dc8a8b2c5a4 SHA512 a308886b00b463100a5df25219ff0d7f6657a86608ca51b5263746a39486eec781296e5743c31c9b82c850b3665127835ac74caa6030d231f33bd00121289005
+DIST firefox-151.0.1-ur.xpi 371228 BLAKE2B 44c152d3d737c246e5ad1bcfb2ae909699a49e10fec8a43d1a1dac9bf30737c3fdca6661e7ee3b47f3303092300672b9afb5cf36be5538b2346495bf94ba4d94 SHA512 526e1787aa6f637ac6be32a6cb4a37ea0493dcce2a684ef027bbb0841b3ebfd3751d9ff05025d5bd5f52d5141ebdff812a18c7734e9245a7896b56be8160ba1c
+DIST firefox-151.0.1-uz.xpi 305666 BLAKE2B 172e0cc8386f75a6a9136d6f0c4b88dd68921de7922c587df19762438d0acbfadf7d04d4fa63db9d57c4441d8087ab2408f26b80e9c09a91a42f7306f4ff0be0 SHA512 602d03f56852db616a784329fc9a76576faaea7d4391914c18bc86e15317178dae6b45f0848936f98f72500ad8d48451513c7de61799d403775312ff6feacbb1
+DIST firefox-151.0.1-vi.xpi 511080 BLAKE2B f1f15826a3cd9c46c635036c398d19f2d527bce70292d549331583cd5c8d9f32364dc51996aca49b3265d1b505bc08b69bd7a03b0d4573a23bf5b473e0f8ad66 SHA512 469f218d6629b73aceb81fd17066729a3c6b5150748f0d49cdf381f67f2c91a3fda7d39a0784579534e50f70de70cf38d50b7881158a9b797f5dcf85520b864c
+DIST firefox-151.0.1-xh.xpi 275260 BLAKE2B 9012885bbfc3e6cdcd46bbe5eb1d7cd2f4bb1e10c2b9b9ea3342ef006bc60351db351750bf7c7a0857741591c5d6b1aa00d74ffaf6f6632b6c8ed37ffed08160 SHA512 b2b7a756c70d54aeca1665bd836436bff68333475840ecfe0b796547deb5c67e9948b98efcf0de93452280ee1d96b0900eeb26c2f4b6cf7f5b9b19d549bf089b
+DIST firefox-151.0.1-zh-CN.xpi 501447 BLAKE2B f18b602af6f73172e7ae6297e2662c74300f13e9aed39cc7196d8bf9111e85335ae2e68a2fc44ac5b97c646cb6291a53d766479b002cc99420ed1e10e61e9a56 SHA512 f98c3c28bed7460b72458f87f6face0875f3ca63be0259483d313713497f49cea1babbbe7d0c9bed006f345f44ee104150d44a7df9e0504954e3a1f2121141c8
+DIST firefox-151.0.1-zh-TW.xpi 505505 BLAKE2B 015f159e4d55cac7fbac2ad804477f7008b8fc86f7a707086ad359f7e140159404e47f2e1e162fd0748a2ddc7346eb16212d028d182804fa28a6cc7848b43e90 SHA512 abcb5ba9eb39e0581f6cde34345ee69e91fc519ea130ee63bd68c73722d782a603665649022f34a332e6383f27ef4814fe35b069e4f8fe1150418fc3b337719d
+DIST firefox-151.0.2-ach.xpi 295732 BLAKE2B 15148ecb6b193655ed071ba44d682a2dfa538c43641e4b60d25c88efdb43a8c72a02686239a76bca9490be8099df19aa7fd2d34306627d84a3e049d103aa823a SHA512 10c858bf1bbde8f0d6056914c78b995d4768a38308d87d7cb4a21b4cabc44864ba9e2fb86bea901be5ef84e929b7322c007e79a883cd71f528778b7d5e93e2ff
+DIST firefox-151.0.2-af.xpi 269246 BLAKE2B 814c9b986f02e27b6fe015ee8e50adcd17e36a9631bbc1f9e43ffd95d2303664d738069421c79175270cd02df20648cd075814470834e38db138ccec0964cba8 SHA512 505617b52e5c9d46f272ade716184c8bacd3dc2860e73b34e69a071f3799ae4cf7eb621957920220c87c38a3d61dab8f0e2853fb895bdef62ebf284a6b85debf
+DIST firefox-151.0.2-an.xpi 332755 BLAKE2B 9a6f186ee9768c575b30c7a5bda104d69899ae2e027fc187169b98290d49819e7d6f508280d10532e4e1129d0273bdb68d2edf88a2bfbbdc6197754225393f92 SHA512 72f9634dad5c2ce95b8aae2f813d1cc4fbc493cc2aa6a85d600a8a25ca2b715bb23e2151ac7decf958f9b1c3dfffdb5eaad61d4ec48fbb973b0bfd967ee8d754
+DIST firefox-151.0.2-ar.xpi 505070 BLAKE2B 7f83b97278f22afa5c7b42ca1052f07909028c36245c48b5154ebc466472aa555f47e9e2484671a3c648030757e167c24ead2292513c16b5de194e4030fed3bc SHA512 c81de4f62a04d66c8be8ae85454615d64b2bff3ba689dd65355b640afbefe3c63220a5a59ba82a3c0737f499c3db52917e0f360dbf963b9dce2b553647b8f203
+DIST firefox-151.0.2-ast.xpi 313667 BLAKE2B a4180633db22e1d3189154f10989501029124203cd964d549c6187196a075eae91408e1d422bbdf04a4a1eccf8a926605df187e157f6e10a0f016670814dfacf SHA512 9cf3baa5096c6d47cce8e92490067eff9f5d839c2396d27959d6087b3910a83a157f3167bd4ff87831129ac51fbdb07d3f6156b4095072f639a47b9665de44e2
+DIST firefox-151.0.2-az.xpi 319410 BLAKE2B f642277c91b5caae7c667392ed5d66c191017284e2c0f71a23e1ded63edfc804793e379a864c7bd9610237d5424d2a5ca1009f2754bc39d3b1163ab2c97f31a9 SHA512 fa38c27a572258721d0d8b1fac926ba571f65771d72099e4fed17003099bfa12c4c05899741760d42b72d3a3ab7725f5bc689125d9a6393f1dc868c6beca856b
+DIST firefox-151.0.2-be.xpi 571091 BLAKE2B 4e29bd8136b2c9a147a941e3112578f980be6d2423ad39503843e7b352b013592977218c293265ce896180a8c58a28d47c28d13804ae38e8bd96778b56c00e1b SHA512 6aba77235cade5eacf56dbda44e34d6eeee42995c5f98f932a887358b5d027736b8a554215f32481badb3afe877ecdd8c2ab2721f4f2db5fcfc80cbb249fa3f1
+DIST firefox-151.0.2-bg.xpi 462502 BLAKE2B f16cf9a4e1c893034c6dda46b886dc6b9ee3ad036ae6b95c35c41cd4c2106d1660f6ceae4ba3d17080e7797a5b3c1fbedad9bc104e2a0c49aca47298a46f7665 SHA512 675fc3906bc6c8a91af9570ab09e6025924abe0381ef9bbd4db2e40a0972ea841f2333f6e0385dac0b5157e3e2c2023d115ef9951f9f1460dcd7ddc296b2d71d
+DIST firefox-151.0.2-bn.xpi 413363 BLAKE2B 71bfb1aa196f2eedbc5a73c16b475e8c58b819f57373d8080568931f39e2b89d0840c482d711b2304d915038cdbf27caf51ffd474682587caa9a8a08b3b7b79a SHA512 17b8b82299bfc7f7a04d84860abfcd188b909dcd49af83cee33deb2027c8598c61058e99bfbb6a87e220aab561cbd60af0b3a28b372f38ee14c587431d1bc116
+DIST firefox-151.0.2-br.xpi 395342 BLAKE2B 49f539607c375b4e0637079967b1d08ee3d5127a816bc60fdaead2aaca881dc8d0383d6d6d9fa712b6a6d3751b173189d0fe1aa5a4d4247e063520a4af986f9a SHA512 a89511fd7dd77f1d5e30bd04107930b46237c3385339ac92fff88d383875a853edda451e32658eb4e2213f6606d206e107b46121869ca7dc0c2111bebb200266
+DIST firefox-151.0.2-bs.xpi 449968 BLAKE2B 0cc4b3aa2fed807afffc965931d1712f54884015b47f7ed87abc3b65cc1681c3659cc401092e5e50369dfd69f2b84816ad3e28530cc696a74f8bc083b5b80c62 SHA512 06f555dc4e22379f4f62bbe95b76bb37a6d3e1bbf26e29f5e1cedbec9b8ce49b6637b57fc98cd02f4a06469fd12908c47c1a2c13ab4a6b99339a887f25b84f17
+DIST firefox-151.0.2-ca-valencia.xpi 359019 BLAKE2B 15f109202a38805635ab6e8cb83fe5e8d0c5b9a2744db18af9b356f0c7681dd4e7985683976a942222130529e710591a3d58a40e44a22272eba28f810e6d70c6 SHA512 e670a7a61aabc9aba6208063ba045041522942b198e27a712bb5e36eff265d988fd5e314b18ceb260b44858fe1520f826f1ae0d5eba0b229b28a2cfced0adbd4
+DIST firefox-151.0.2-ca.xpi 430442 BLAKE2B be0a21baf34edf6b26e50763f5028dd7e29c62a2e67cdf3ff7e8668998f05f8e81576c886708615002b8f682a6fd4a508053863e9dd6b2d18c16dbde10bed6fd SHA512 6d32597ad3aa3e9df6e4247d1364b69684db362467f1fd6bbeb3df4a7efc1682eddf9cfb325c01d6a8e7ad184037eaec144b8f3a70e3a8d6a1f22834830af8fa
+DIST firefox-151.0.2-cak.xpi 390460 BLAKE2B 8e2b1268293f875fadb7e94e16fe70fa481802ee03f443d99393a8fb92c4c4c60926aa90b6647542598165f9cccb833f39e1c23d4b8ae53fd1cef7b71b9f2e4f SHA512 6a4b23a1eefa052eeb5ae45a4a94873e626dc02cb5d476602d33468f777ce6c7f5a6396a030890ee965d6cf5ecb11c2662c7905037be1adda8006ca9850a9d8e
+DIST firefox-151.0.2-cs.xpi 522131 BLAKE2B 04f13e9a91da886d6d0c75ca79591a417ad7762ebdbcd02b2378d40a4da4f6f52a80817149ff98e2fed00b2de7a225c02ee12e87a85bf5844b0b2f57f0f05c9a SHA512 46613661ed0091fe3595d5cca9800f566f5de43248e16600487b33a7c7c036d1307e1f0c2c8cdab1835a729d873acdd39c88de0bc614ebacce45c38abd4167d8
+DIST firefox-151.0.2-cy.xpi 483563 BLAKE2B 2c66ff88142a94d68299ac7893370bea3e76116faf22490f605450303d0c4311d4292bc7a0da0c67826ce7a22f238c798223472ad19e317de2f0ae0535e89196 SHA512 4a9d2cc024e3eb1c13c845cab7efbfb4d5cc67ffd50e0e6bea72e2b1976cc395b33ce9b26a9b2097cf70b5cb8743f818ad67f6b2cbf6e946cba8ade800040355
+DIST firefox-151.0.2-da.xpi 464215 BLAKE2B 6390578dce77cc076009b08d2a323cd2364009b5f2bba8013c04aa516c3651daabe8049d4e9e90894572ef6e0e21e51b995b1c41c7c4a7eb3937b28fd6cdaabb SHA512 9eab875e1b7a17508fe25571bba44cd7ebdb1ee60693dd47cdda0f5dd136a1c0bf9830909112f811f99f27d7372e47c9d1c43a9b41916da062a73fb7e5388e79
+DIST firefox-151.0.2-de.xpi 494991 BLAKE2B c4124452c332d192ef632a0aa577e159d66f1ed34802803ceecb8bb43f3f1499ff056852beaf072f06ffe56944eafeadde571c6622d23bfadc7ffa72da6aa780 SHA512 29763a2764319d848dd740558047b6a61660c58d41e40bf092fe280c40cc7f8599b33297cf03143b5aae830a5923f2737e5389f68bf9963caa16a27c2fc551b5
+DIST firefox-151.0.2-dsb.xpi 508929 BLAKE2B 0f05d22abc5886167ae2c3c21c6e780b0753edafbe713f18532dd85418693e5166a843e5bf8c5ad897843b5833d6a11c0601d9716459138e6746e64c2fe40324 SHA512 7bf4b95701de5bbedc6e67214c20e51087f460af2527c070e421e91df737eaa248d24041f36e15a5a60de69c6fb4071f04921a3c610d14a18cfad4023b05e7f4
+DIST firefox-151.0.2-el.xpi 586724 BLAKE2B 39f8c25afa5472acaccca1362c9408569b4acc9e5e59662d0bf9093d51160a94bdaaff2aa8d87f31fb558b13ca557e22f60d49b25498a9c3b5bc353a8389e6d0 SHA512 e3bf257955b4668e8fef7c8132e423c7987e9f7cd1faa05a3acc41d096944449f3decd1cff71abf557c9efe0c888c7e137a4f9d727293c98c1624e0f9d3d104d
+DIST firefox-151.0.2-en-CA.xpi 447478 BLAKE2B e42bd439d6db33f9ca8a8b01845182a271a26bcdad1534254abc8b9b4b83b3fffa042129b0f3c57047f19b2c1053d70afb5f4adfe087beb022a8e582c0029673 SHA512 869542c54015c090e8698aca3b5ec4322266d9c10df01f6b33542ac33aa66682d31b775b983eee6b50362c2badde1c939989e0f78c9520229d9dbb768fea300c
+DIST firefox-151.0.2-en-GB.xpi 447792 BLAKE2B f69c555d2726d88fc9b6ba624c4c6281ce0030a13c80a7d04e8e0e5b0b273a1fc6eba4a2e2c237e73ec58c8394c1cc7bcff7eabc37e481ba3e20e75d71108969 SHA512 e54f1a1a14573bdd86248e7c246c5d7a4f51fd91436c9160faee50d597408be32c59f0633e6e1eb6afe93bea039ec7531580853398d59e3fa558cc11eaeb2899
+DIST firefox-151.0.2-eo.xpi 473137 BLAKE2B 33a0334e31bea78afc8e95fac11bfdd15c07d35ffa0a7e9d4f03bfc822a76f616a3074459e854c87c36f67764d057346d01f98c085e2f2a64a6d133581dcc208 SHA512 abe47c7687bd36aedb7989e0c671d9ddce2bb68b854be71ae347ffa57f38570e879399c796ea7bd1ec168499b7c9d12bb5af5bca2d650eb880fd832f89bd9a9b
+DIST firefox-151.0.2-es-AR.xpi 485656 BLAKE2B bac123444e5e02a8cb13ff42ae9d746da0e3f77470f792d7b8687ac61d89b6cde49337e04450204260487738b6130ed390c6a09f5cad5cbe6684f3aefa0a4d58 SHA512 15956073475a02c8ee82fcc98aef622c71ec67648b48e9f3c9b6c5ecda3149a7cda743c550f4ff1eac86378b65e7d753dabf93c6ccffc2f4c610508207bc8679
+DIST firefox-151.0.2-es-CL.xpi 487164 BLAKE2B f76a21ba18e462875a01e99f564d0b1af1c48cb15e058e3de62daeeb44799ef7d895447c082eec78f9bea2f4605fb18ecf74c04ed2ff5e89bf626b9a2b0a55a7 SHA512 33a28606535ce509a87b61eb2edfe41bfcdc2544bf915fb428e2824a91f42dc8372d0a9831e1d255756d923fdbfc7d11d5035bd363a56c5210ee88fa0a82180b
+DIST firefox-151.0.2-es-ES.xpi 488070 BLAKE2B 9cedae0568d8724ad36f791785b2c10e3ba5b9a1933cd2f90f1b51eb7240fd3d47938e50528c74b4b662fe77a9b1c641a233a7817c84495cd8046072d05c2315 SHA512 07973b4579dcc4b54a35b4df68f26cd58dbd82bc75cf9b9d74e0ec0fd92037c235963f86e2f35cee2efbfa81666195e5ebf5a751cd8a420862f067dee9897f00
+DIST firefox-151.0.2-es-MX.xpi 490781 BLAKE2B 9294a6ffbdabf242fe3848a63aea6ece3d9fd35e0376efddaaa8d95531b0e9f29205e1b7da7d5a0c5a76511f85396243b506ef22dcc64bc35f2967c457d39301 SHA512 0fc7f37890b46a94a2d866c79b4249f3a8e29d95dea22ea443312c3a2c24cde248604cb6a84f7214582b491ec8774de53e6df196c33eecab957df616c48507e9
+DIST firefox-151.0.2-et.xpi 359518 BLAKE2B efc1ac48d51505fe74c097cc4779a005cf1e83554c24e008d9754f24200f294283bd0346511b4a2de2bb22cfed10a2269c37ceb8d5d3c6071511b0093c4de7d7 SHA512 d2e3dd67207f5f07e0310302b201ea77cf833a41f617c4251815d30bf4823f592bf5930236d6e4cbd071cf33a2e49242483e901b69bdeafca0d70bd0a84fabcd
+DIST firefox-151.0.2-eu.xpi 472488 BLAKE2B 81fadb66e2291fffa76579f52540cde6025070abb7cda71cb928e0ccc6e7a2268d0739aaa523e23eae498764b2a874d14b64450d382f9ccc6f1c6c3e6fcc1650 SHA512 26cd4f647c61cee89979e18e8927df9ee7171dace56ce0a028446401f868519ab1a5fb1d58884743cde3e6e083e74acb774e526264bb0f6238cad315f2cfc6f4
+DIST firefox-151.0.2-fa.xpi 420582 BLAKE2B 6e36139de90e0a036f4a3eeefa2cb59afb38c27dbeac75e9468d0600df79c0d5ce3562c4ed21a447290d8d4f03d12d607d489a035ae3466866e3c7dd764ed684 SHA512 eff0f1c1b0ed0c58d5662605b3dcccce2f9b17bbf958dec9602ddb656bb09def57b89d162c1ca72fa5bb20925eb6663d2b6d05748bae4dc3de95291da3b2fc09
+DIST firefox-151.0.2-ff.xpi 311095 BLAKE2B 7de5616e0644b9f0825e3de2cf0c0bdd93dfacec8444af5f06d8a5da95cc30d8bdd54598c3fe380698f799289e23847b852092613de9842efac240343c357f66 SHA512 d665f98317adc925b21972dd067afd424343030b9e23f84d0b3c37c0c1efee391eb9afbd0e2e5728059d67b4968ceb785a85080eda1ffd9bbb14bcef1ff346a0
+DIST firefox-151.0.2-fi.xpi 470499 BLAKE2B e3f66530987fef89cacde2470930a968921a56d6e4493ceab9864d9fcee2cce28e9a21d0227c098d3488d74e64adc413467ba557c8f3e47396a3cfa2d27d6d57 SHA512 3ce77510efe0d36c7c27aec1e754b23535cafc6ce7303e3088eff35ea543965aa3f2c9b7253b867c02eb362398661e9d9511d966beb5496a5c23016003123f67
+DIST firefox-151.0.2-fr.xpi 500724 BLAKE2B 8d7bacbe13b72630be99a2142f369c5d675a197683336779dd518ac990c5c4b204df16fe2b678ebacba0d28ac2a438ebc648509133af97fcb720d6fa36ab41ea SHA512 02f2e92283f6859f4ed071ab1fad1298bab997a9327bfc302239eff64cd3049f6e6537d2dfe3dff36d0a5d91156f17201f11077a584d8398bca20a635f9aea1e
+DIST firefox-151.0.2-fur.xpi 481145 BLAKE2B def8ea948a464fe8a342158e373007e26133efa09913d7d01debcb29d859cbf11484250f02cbe0171d3a5da4cef6f711f25487f8901ba2ec4f3b7187a08d7b58 SHA512 f6e86845019864d0a7966b3630e14ff26cabb7fe8ce61a591b70c81273c8702d7775ec0bd3abf51208a1334c4698d3d4ca43b87a9139f0d60d754930046c594c
+DIST firefox-151.0.2-fy-NL.xpi 482318 BLAKE2B c6c90b6e90260984e858b158468212d399cd154192591e722a663997ca951e38ffa4cfa867cfa80d9ab713eb31db970188e3b9a949ca85f050f5be8f2f2d84c8 SHA512 f076186ef21dbcc31bf90c0c7ef5260a35e875c09414d7ef1e5136ac71d477847245c8cb8fba496254e1ff14ad165e800de58986a39918ca114269e26dbc76b8
+DIST firefox-151.0.2-ga-IE.xpi 316738 BLAKE2B a1025e12da0d32f4a1f623d5cb4aa41dac793e86a18dde93f1d71912c1d24f3936577e6d61b215a2269d45bbe20b719348da085e985c6b63af62f5a91668cb43 SHA512 05b6981e98152eeca7c278156d395bfa5c78dfc006629bc2b68e03d17d443fb4c42dda1ae42c9fb6301feb337405abd60aa074ae46b29dfdbae34cca2cdefa4b
+DIST firefox-151.0.2-gd.xpi 410120 BLAKE2B 73f4340a0c1f71edc3317c1305bf10934013bd5d1327cae95912774d38e10cf49cc571f4530850f087ad74e7625a3061b4a0051bbb2dfa5a00a6fb43588b78d1 SHA512 56d8ccc61a84dec88e6b0e927a3e863ec632b214ff1b564fa86417bd6f1242675598014a0efedc1833641687159b274e2e86f37a5a664beb1621ca5acfe586a1
+DIST firefox-151.0.2-gl.xpi 446723 BLAKE2B 1ba2670580b40ad95bf617e2fa66087f26b9007b597408b3c6199360ab54a1607824fb6f5bfa3be15ce304ac0839247c772cdb8c870635bef5262deb97071a44 SHA512 4570f68d54528c56081d3c343ba9e1dd872205e54df041012f43bbae8960d1a4cf0c9f76c78bb6d02a7847412040e9c490e6f7392d2bdae70c5e17040d2faaf6
+DIST firefox-151.0.2-gn.xpi 490612 BLAKE2B cb857efa9dfb42de4ff9f97809ccae7942f5c4a65239ce8c5c6b665d83a06bd28ed48fd78663872c242517f018432b27e8abd262f8da7f36e4a2ea36b24915df SHA512 13dd0d6acad836ccd15f502825b2074370f8f2e22b20f352e1df11b5d6a3b3ef6e23db4420e8263bacfc8f910f7c267b826b975cfa8b725c5ecb86c8f79c26dd
+DIST firefox-151.0.2-gu-IN.xpi 359272 BLAKE2B 12589dd7c37c984895025da93faafe766d1e1711b4ab5e52807c477265eab6399787dfd8fe9ff839d1c7806f1c6432bb6fb4ca219565a342202118db271d28f6 SHA512 4828e832c59010323c1485c710454899c436fc26dd738a5c3231cb9695bf35fffffc41228ebb786e96e30b66d07fc39fc56e41bc2b1bd63547576ee8e0fc1d14
+DIST firefox-151.0.2-he.xpi 486416 BLAKE2B c5234741a57aa561d795dde0553d331ce1a0b501e78e15d518c91db75fa923cae565a25eb021733d7def36e1d2ad703cbe94aa3e67035ab2ffb499ca5d352e4e SHA512 189ce1304fc32accb55075817e7fbc30d065bbf6e3c41cd1361bdf30ebf7dbf3e6b4dff4b9f6128d174b1b06f2293640c98e208d109f4950d9f319cf88b6e7ca
+DIST firefox-151.0.2-hi-IN.xpi 378156 BLAKE2B b4063ba5bbf969c8cafa015e4dae9d5d76e8d28b3b432ae0152c594deb1224b6332fac29511d3c688077c0f41b1bde2a33e1d356fa1f18e1ff7ed05b5774f979 SHA512 d05b7b7e3a2ca0301c568c2cafd959522e45a4f21be1f3c243d9099a1f6285af2cb4470751eac8d8518d1087e02a14cabd080d4272e4dd4feea83b63a54e121d
+DIST firefox-151.0.2-hr.xpi 472639 BLAKE2B 2924b699ec87663570278597f9075cff32cc41ba70cc6d41c00140b48d2879beda24ddfeeee78d1ba98164ea67e197d734db46a740c366e5c0759238eba23331 SHA512 6e50d7ace1a96609cf051c3ad0adc598836d6f133f2607e79acbdd094ac1c451db1defdb0c081dfdf6efbd79ac94334234968e08dc3019eb597e6e2ac5554384
+DIST firefox-151.0.2-hsb.xpi 505587 BLAKE2B b1464898a26164adc20c331208820efdd2bffa55bb8736edbf5006d13c878d0e2619dd391ef4919e1c9e7bb476a68f8dbb9250e227ca21a7d874d188114dac58 SHA512 909d03f7580417abe67b645ba318a696dff061b57dcc121dbec311a11413f0989c28bb15f1a763a9b1b8ea9577d5027922bde172d6bf347aa07d4e1e90513f32
+DIST firefox-151.0.2-hu.xpi 509821 BLAKE2B 4f3bc7fa21920e297fd31329b7c52df5c6e0a7ac65864565e53eee6c664a0edb03dff1791b038aa8a6c61c140a542536547da24ad2ea195d7a644e9af2fb5779 SHA512 95aac6ca7f43cbd2043541b44ddccecfbfef809539fd3b3757a9650ac1d4d70cdc9102405a1269ba7dc87d1352bf33228e6765951e1623e4f7f848064a758c1b
+DIST firefox-151.0.2-hy-AM.xpi 489021 BLAKE2B da94e40d2a85b4cf3c734ac0f6a0c351084674053f0a1df795ee9dbff9e2b5de339d5cdff4fe16a7910c2e486e8077a4fcdd15be63bd9cf284a18406a198b59a SHA512 69aa24fcbf58472625a3ed121d26414d3795bffa1eb40490eb8f27d302024cbd13f4a2ac38b77f89ccd59e79093ccc66753c5eead9a0031e5bd4ed0ae8ec67aa
+DIST firefox-151.0.2-ia.xpi 469271 BLAKE2B ba806a477f5f913824c9619d1ccbaa048c3a8d09344fb4ed8a0e00215ed51554d8400f552fcd0d638f1b7bf7e78d4e357a9fa637c85d2c21b5b84d15137c8ae2 SHA512 325a37a73305c5cf44570a17bf5a5469dededa1fe1d2147cd7b929c98be2948af8cd956b701dedbc020365f520d201f0e9769264347dd4ca46a549b57609b736
+DIST firefox-151.0.2-id.xpi 433177 BLAKE2B 77b349307db6bd7eb164cf5492521ec3d0c1b6142d674032ce727bad1f7b8a76887e40025188b462bd668d18e5f0195a4375309d03b36e63cfadf0a640995035 SHA512 28ba02f17071e65231028f7c2bf95c0e1a9de38c59d10fd5e9b2c44ee81f5fe99738c21b77b783a26ad8435e18d97efd96a54cd8120eede36088bdc88968b553
+DIST firefox-151.0.2-is.xpi 440579 BLAKE2B 6f4a50faaaa965d699bf3ec34a39e11fb391200f761a1332ff7b4116187511712321366f0264387819bcae024d39e11372eb400e09b7d24f2617d3fdad39f815 SHA512 d823e3ab20a2a89a213b542104a3326668cb9c9bd1e0174c98ca17f4eaf2988994f543061409e35eb7e7ba490e74b5a22b36824e6bd4f2d467cb58f02ed1ec2c
+DIST firefox-151.0.2-it.xpi 481241 BLAKE2B 6056687629e6de3356cda3886699a31843466768a5ac02c8f97814219190f2790333442e4a3f798daf2a5dc92006cd86647a4c318c8c9d1ac3914577caf7c5c2 SHA512 b91c4d91eb1d10414eefa7b0b04753023be389e9ddbebd89495b319d518fc2ee87ac3106a26e2e4e1c0cf831673fd80bbd456a1627592830aed9d6e284da468e
+DIST firefox-151.0.2-ja.xpi 524600 BLAKE2B a9be00d0be7a4bd85db8aead69efdb75f6dfb3f8aa62a1b7688e1865f3b6eb175940d3052513d91aaae2852f4ef26b287bb8a128a314234312e7eb0c03a49911 SHA512 d41e8d0322be3c2c3d85f9d51511f4d608059bca4a4b1e88a83d15cb414800d54898c8e137f1f0b978e11118a6add6f1c8e8db4a499ca779213446810fc12fef
+DIST firefox-151.0.2-ka.xpi 543756 BLAKE2B 5454837d2cc3b36c8f766ec68db5485f47700049b12203ce0b8efcbee64631a967d6936dc2ed4d7cc72715ae21bc7fb17edcdf26b8c83d7b3635f6af2744b099 SHA512 df85e2a16cdb402ea1779c5739ae90eea47b1de2770269bbcd0cf80a25516bfff45ea28d9a7536cf83ae6c751ee4caec88db80aed54beba19a9026b7a38d015a
+DIST firefox-151.0.2-kab.xpi 426310 BLAKE2B 58fbfac1d57ea86c29a262be3f84cbad99a69b018b542f59eca006ff93aeeb4d75d1c03a362ef707adbf760d42017564265d9f42885c86bffa411555c954c547 SHA512 9b454bf4f4833a271674f37d4581fc0b9448eda638284f2d5a8dddf75d83adc6ff09a7ec9df8c08123b6b26897361069af7eb98d889ca40050089c42a961c457
+DIST firefox-151.0.2-kk.xpi 562385 BLAKE2B e5ea659e9f09538b3e691b7bd4536cc7f3e2195d1b6a32b5afd519d34d81226e0286038dc749523e0deb4f4671a3bd44ab1b9b37e20d34ca74b567cb80895fec SHA512 ada389b699a03845f336b062f3d2c3d42c4d0936a50c9e987aa29c795e1a72795beaba6bbc7f7fc77d7ab8646ef32328e0857c70962c54f3d0a8f062196aec97
+DIST firefox-151.0.2-km.xpi 376413 BLAKE2B c6316ece816cab468be2e6f13525701f2d1a1266b5a68df5db186fd18995b7dcabdc229607f35eabd1eee55f2c26b9a9901ef762564bffb8d271fb1a36bfb045 SHA512 ab50b727ac51f28790093c2747851ae261474698bc670581ff0019f763e01f2a98d8ec86319efc1c5b048f7a7de57ec32635d4554288d3949ea6bf7f23122b80
+DIST firefox-151.0.2-kn.xpi 333588 BLAKE2B 4e0919045f70433b190883209137e8b889db09cee28cb151395a1148bd93c4902364fbb2e02bd1283618582e7891e98bde5c43f3be95e044d55e2d6f5532cba8 SHA512 3914034742312e1e0556ab900e4505c51e80416f8f54087c55af49a93821fac8ce3f5d93e1857139639de83a913972554ffd19e3f7a7f144f61d40387f39c779
+DIST firefox-151.0.2-ko.xpi 509216 BLAKE2B 5a44d1f9e33e8c0e021543962287ba59e088eeb7c4030db7a54ef94d470032b69cbaa1457d377436c12f4445b72ccfa5931e2a236c74da2e33a7b88ff8bfeb13 SHA512 c180ece3ea0c236d629193981104566dfc1b4672c44964a4f239263ff45b26e9180c0cb964bde4e5f331df71de11e892433a4569aa44d595dd4cdcc228082c9e
+DIST firefox-151.0.2-lij.xpi 320449 BLAKE2B 6ef778dac3cad4e7f30a0fba50a8942708b99593981a288b85bbcf8220ed9e49a31740167a5e671289d6f32d25bab3c42c66bc662980bd91b3d426f6bf219daa SHA512 9f721526430e296dc28e5a74b38dc5e042e87db0380aa26762eed4635350143506251c67991ba863992996dea3544bd43f33947d3f0431ace9df3c99ce63e896
+DIST firefox-151.0.2-lt.xpi 380265 BLAKE2B 04a590c3ff6ab6b9499d07496fe60f4ff10718dd04d97c52e97c6eb4f90616316745089057e36d0a15f1adcd4fe0d39d12cf9e6aca28c538ef9400677814590b SHA512 6b48b1d32cea53ac2324466c1bdbbcf28bd1d9cef15c19c65da42fa341cccdd3102d91b10579cefebcb2d492c34dba56781ba9fe5dbe90215e9332f66680012a
+DIST firefox-151.0.2-lv.xpi 391358 BLAKE2B 83a787d34ce3b57d4a072b3cccc6a30997f1050bc93720a7f162b59bfb61caa22671811310501a1858c093727fdb6dc1212d44fe7060ac9ebce4c02596c521bb SHA512 9805cc284c11ab869b1be6255cc1e2d5da98d2b05feb29a020918fe1a9cd7c9cf38d768a86b800e01cf5f0db205bd7c1bb5395a630deb124d8b96298d72b7b2d
+DIST firefox-151.0.2-mk.xpi 360512 BLAKE2B 9e61b49721c9de83255d0e629ac0363d43779a3b2f81b53ffdfe1891323166c698b2948ab28631ed8c200e34498d0303bab9c79a1b9f93970acd359d61a74f87 SHA512 068be5771052c4996872038eb7b131f597bbae081fe59495400732b1c39e1200ba47dd31b0ab70e9cce1630e7eb90a36993e6c4688e12026c29d04e11156dc6f
+DIST firefox-151.0.2-mr.xpi 357169 BLAKE2B 22c955a744d2ed37a79459699e2a6bde2ef92305f21f7d9db6a7ce7761dc1f99cadec679d21ab4a7d9b81fc169121f73fc38977e806d037afd3e83eb4510ff2e SHA512 dc92760bc454e93e0f3ad78e023ff0d331f1400878127911e3d72987b6c08939f682d9eca5803d623f223298a28d3fd87328637213cc3cafcdb8df536c24d857
+DIST firefox-151.0.2-ms.xpi 296982 BLAKE2B 9db80cc6036625799e53c5ad43a66041eb852f45fe04e337eab746fb785447098fe6a354f7fff276ffb1fee043e0bcc2b5adbc5014ae7ddd2068e074e93bef34 SHA512 765d1061f31a83a6b3f8bada030965438b6ad4737be22ea1c17e174563c01779bca1f6bd96b2df0922912298415a5e480fd9e60f2f239ea22cf01fdd6c56fa21
+DIST firefox-151.0.2-my.xpi 344147 BLAKE2B 90669790b3a65d4b16fbb99ed8774add92cbe8d2bf7140720197b7bf608655904ee9324531a26178bfc888c2be6cbef074fe4e684270e4e2d38f66951090a19f SHA512 2c4968c6206adc2a5c0ec08c1d45acf883044402c5dc88f0447e6b8c5f048b7e658adc55ae03e99a403891f10e51ff8032fc7964e5cd6f9aee2f42f18e72f17b
+DIST firefox-151.0.2-nb-NO.xpi 468289 BLAKE2B d07da809aad8c6a2ca75e471c24eff6a3129518c54d4254afd905155445f90b0fb5c5d74dbdbe1d0d240c18611d11236603e1fcfae49315cb69f480067771906 SHA512 02b7d07a9adc8fdcbff5cc943d3adf27fd724e65e66bbad81173390d831bbf019ada76d47cdbaab946a772f04b8794c716bb7a1a2223b45478786ea4f4b3c89d
+DIST firefox-151.0.2-ne-NP.xpi 349278 BLAKE2B 95100e2f3387586332bc705822c220f59f87a1601c66693946b2ea7837538c653ff0cb98d7c30f63798f89ab70513d561ed106c2277b4cf918e4826afc88beb7 SHA512 8e31dfa2e6e6309167663df4ca96998f4700ceed3d6d6a02fb6907ad787237a64ee83ca220d309d2527c9a6beaec344725965df8a58fc94d5c73d748c9e47cd2
+DIST firefox-151.0.2-nl.xpi 475939 BLAKE2B 75bc377b37f0ed3905fe9321e8084b9ea0144387f3246dc1f7db945c922434874be6a045c55b585e49a5ffe89dcf60fb770670d27832e97e2bd061ae78df70a5 SHA512 6526d841c0ea2ec77a335b0f82d5d01ada7c0a577785623c39d385cf04d5207db8fa28d280eeabd48087ae65e0ef107ed838a3568de5fcd61fdadbd3618a48b8
+DIST firefox-151.0.2-nn-NO.xpi 471623 BLAKE2B 0bb23f18e3e5c81c3597edf12d09996f5f21792ac7769c1550560a8a88ea8762d5ce58d068b1ba572ee62162df5c8b91ae2c8a346d444573d33d6f39372eb65e SHA512 6cfa7fbaa9c063b32856961c73dca7f9f2dbf68f4ccf8c93a5c28de59f7ce74f65c71279bba938f958453084359decf96cc834f79c4d20b7e4d3b83965f6d981
+DIST firefox-151.0.2-oc.xpi 414931 BLAKE2B 48d0b89c398d8872c46aaed3b8ef88762dd3e9974d556641c3ad902ba7636bf10f500970ea90611389046b6427d8d84ee2e305d439fcf68c06653cffaf3703a6 SHA512 a6c56efb9dcbccc4047191902b809e9a07d9cc7da1eebbd27ecaf237682f8e144d314e698eac0dafbba22c81e82bf40dd7fa89293e040705b81dbc3dd8918a99
+DIST firefox-151.0.2-pa-IN.xpi 542074 BLAKE2B 497cfe307116c0cf3a84f7213307fb860beb97cbc37910c385c39297e9c652c425c6af77dd41f02428d669e5fe3b2787f83be59c09248aac6eebc34e0a9930f3 SHA512 15b7f1bf63bb8d3d1e87e6d9fa831bf44e68902c8ebf4dff9f9927cbc4b0c84d21af22284e59472d3d40142fc3c9b889933d86765161f96a92ed268b002ef5f9
+DIST firefox-151.0.2-pl.xpi 506740 BLAKE2B c9185a7a3398238c4b1592282a7946f950126886a1482a5755a0325063aeaf762d74affcee1bbc3be2b0c34062417c9a7eed580b9055e6db83c2f3ba64549036 SHA512 2b041e45f4b6e70c0513e6890e5b2c0853204306a8397b19df06a872eb8f5fdee28cfaa2159e5865974dba5b269d7cafe30c4026d0626046e8645dbe2e17d915
+DIST firefox-151.0.2-pt-BR.xpi 480653 BLAKE2B 5bcfaa43efb9a234242592885308ef9813cf9c72a6e76d4f19714bccd54509cba2f62a8764d1b1d6401902b19662bab07b6d6514c476ea00ea4b24182d28a577 SHA512 7f78dcb0945a9f9306f727aaec624b8974a5eaf648ee8a08ab95cff64e131bf186268b54e321c6ade9532db5e1031ebed9f3c45996ce6ad45a278b906b8d4d69
+DIST firefox-151.0.2-pt-PT.xpi 487492 BLAKE2B 64662ca4e8c6c76ab1c2df0761c2b878a4e76ccecd557fc33095bd94926b81d084deb6e092c004b9079934b4ccb3318e0849de964d77198e2f0b79af9b182bc2 SHA512 12da966cb3430fbc120a15331f44b3c175ce309faa6fae0cee7eb54b5adf2213fb5901c326f712e9d4dc33a0d04cc400eae0b3afb7b80d4894c4358e270974ef
+DIST firefox-151.0.2-rm.xpi 458465 BLAKE2B 9583721d8d0f8aca5bbe2221055d1d01fa14fbc176666e9681e97c71a79865130e6ea8533239bb9bf9683f5ef62cbe14b7b072d013ab11b70649242cff3a2ed3 SHA512 804e0f30c55e40f9cd3be6dd4969ff9260d8eda88e261a0d5d8d74ef29c213adc1e1a82b2053094b86323bdb1b4a88de3c8e4e0ba3c6bf4d3c14c89584e54091
+DIST firefox-151.0.2-ro.xpi 494406 BLAKE2B 4a694d39400afde6a36cf122314bb5c9a2295f07d1803c1aa1d7c3c8ac6c7c92da3f994b2741d5df76a56903ec43ac1267deb9fe4de649bb27466a36ec3a3583 SHA512 b5286a91e22f95d12af4d09152e3ade9484229743184f95191401994d9e55db8d6e6884832ad7652bdf6a616a0fa7634335be6e81e0de3b6ef7020f27b7525f1
+DIST firefox-151.0.2-ru.xpi 574762 BLAKE2B 49099b50fddcc2a1f8a9538933cdadd9c3f098b2d5032018e327ff1b875bd73facb0a321d1d0be148cc258783544df82a5cc1fc19dd8919122a5167170c9561b SHA512 66b0f8a376c1fbf0319b8418173a0a7efcf0322d9da58758d0514f8b31e6070ef0dae57ffa02df2fb989e269692259800cf9360688401150b588b98c9391b0ce
+DIST firefox-151.0.2-sc.xpi 429519 BLAKE2B e58519451ba4403a0484147785e6136276c82459c6e6999b7b9e36579f5bc6ba1fad6fae203da114311170d9a3e37bcc042845e248766199eca085a7a99fc3cd SHA512 a49060db8b35d87d8e5aceb9aa580a54dc43e71df109201136acdd5fd157aab59a855b93a3b44a0b51bc7071312b430df750fc348cc409eb2e646d0c4b60df7f
+DIST firefox-151.0.2-sco.xpi 323635 BLAKE2B 954d1d75b3514ab98cd9cabda39190b7386e08a3338e139e1dc4932c99c48ef68d2ac3379ad7f49f98bba747ec9d179d5184619f3f95f51ae498e3adca11fd35 SHA512 df342cd9fd4121ac299ca0882b71d740bb92819d1187577f00e93da690e8a5345207815e8e4225fd506b3503f0eb4013e6acfbebe2df8c31ed2cca231efd59d5
+DIST firefox-151.0.2-si.xpi 409833 BLAKE2B 9119202d3be10870100d2d95a1d3783142693776b5d3ce0ebb8116ba18e54d183bdaa9701eb9c229ed489cb91eee50462ed602c377ce324efc7fd10dd20a0425 SHA512 fce031dbd2b4fd6a99641dbb99fcc7aabea63fdd6c85db04b77cd3c2dcd708937ac23bf9bca15ad74637530a0f6241a4ec4be1a4c98e0b0608509bee966e329f
+DIST firefox-151.0.2-sk.xpi 512634 BLAKE2B 017851d966cdaa711920f0b48481d965736b8fbc3b108bb95384742b47f47942c4a9817e7fe17de838790a42ccf4d424f0b557df976a591fbe674aaa06f62021 SHA512 809c9159f3cb9d1ebda2441fecd2ce587ac92b95cf3c3fda4b49762d0e00a8cc66c7e35452fe95355a397b8e64964961aa878facb3af3f47844f13044998ea40
+DIST firefox-151.0.2-skr.xpi 485037 BLAKE2B 3c1dbd70e0a1660401dfc8be573a6815d557b029b49e9ac2ba129892ecfd954ca1822558c0b2e9f49278a8bfaa58ea2afbe546860ecc19ea575483e35ab2d18c SHA512 9d484c5a1850c6bcb04373cd4dd987db59e9b39399ff9b43ab05e68aafb9d8a019104146f3a20abecae5a2d3836074b7b52ecaa11f170a8ad94c94e1cefa110a
+DIST firefox-151.0.2-sl.xpi 479198 BLAKE2B 4be751958bb443bdad7c0a4ea2f733a4d0f07da6ddb967443ae21aff5df281ae81df44e09410c3f875692a001800cfe98faef90ad13f50be899c8edc7810b4ef SHA512 3095e6b22831d9503061602f47b1f99b44a0d3fae5f3862c4154d083c523c45bc1de2e22adb5913150d6a1f0da427e7eb77d7f2118ecbd4a8e8f8f91c1c431a1
+DIST firefox-151.0.2-son.xpi 275777 BLAKE2B 4af269bb8afadc2883884071deafa6e749a99138cf9418350ef72609cbf1deaaa05c18e59ca3b511e587fe10079a88451c0a73a955e1b003a247c0485c97775b SHA512 d0df44c75367aea40c0a719b685a0f73651572f0ad8d5350e612f2e49df939e006504f0422b9aac94817dc2f810a0119e8acee9826a8a7de87efaee103dff82f
+DIST firefox-151.0.2-sq.xpi 493041 BLAKE2B 0a022edfa42a0dda4264bea45819614b0de40cce7dd22dda6f333581dc4f97306f2ec54bd210b15e2542457421ade4fd5a357667eef1fec1b3453fbebac0f4e4 SHA512 66b681ec3296e2adb27e3d2c4586065708c6b21d783d6485194ec85be9c244e2a61bacef814ef9896ec323b72aaeb179f06cc491379dbc8ebe7d9e2b90810ddf
+DIST firefox-151.0.2-sr.xpi 546339 BLAKE2B febcf6146830f934f5001ae599f94a24add67d38141faf839858d5755527f94cb9252e5a3a536a97be526d5e64107f201c90011f2985a296e75b4e3fe13add27 SHA512 c3b60977200f78c16472ed688d61239dc513da91dadcf95b67e40f46e95f28b6735439817258a03f2e11b5e7e6fbb590c4b99231e70889969d951311b650ec4e
+DIST firefox-151.0.2-sv-SE.xpi 475615 BLAKE2B 1c06ed3a0e77ede8fc44435fcb85b4086e0d588b9a6bc99805b00a74979e9b29825152ef6ad39cd5ec650281432dd2ee86701723c3b49f4cafb10987dcd0fc07 SHA512 705a26b4a545deed96ae7eb40155c913bc425299ecc5cec8e82d0ea9e65dbda8a67c6cd38e9726b20abe8616b5e577c216a1d655a23a9d6165d523bc3318741f
+DIST firefox-151.0.2-szl.xpi 342410 BLAKE2B 434273a91da76ed006d530a3a57dc0f45291f36003db1ed0f53ab35bb42f611e6fc7f4eeed0e14ddb7ab783c8a429bd43132b96f7e35b1e218c0629342b3db6a SHA512 bfd617dad3a286d56da78b32f07f7d30f3faaa8d9c2e3c086ef937937ec0f5a36bc4b51b9a9ea66efd71c1c29445371e339f6aae6eea79bc656f99e34cf92430
+DIST firefox-151.0.2-ta.xpi 339050 BLAKE2B 1f4b5d9af593eed60959e7f2ec3c0ae520d5ca4818cd66a2339960945ead71031d3d20ba680c9b7f3e566fed0d50ef3737df0700205e9973ff87e939ecafd89c SHA512 713f962f8e0799c7df4e2af21f0f7adde6b880188b3d2f314a8ccd9f7f1d1652fb34b90b9ef2afd4d7e289374894c67feba91f6f398eb682f2b213d18d09ff53
+DIST firefox-151.0.2-te.xpi 389029 BLAKE2B fc89f10dd73141c707d25939d9e9a320e5eeffbd8f803b5fbcc49f13e179c09e19d53aa0fb2d5e85e0806d874f511e21b1dca8955d0199d57b496b374d29be44 SHA512 a82adfc1c59eb2577f488ab90c799c3fb31a7f7acbec332bf0f81984a1616aaa851eba04dea20f87e48ef9b50707a7972a2ece510aa251919af65fbdc89fc124
+DIST firefox-151.0.2-th.xpi 552246 BLAKE2B c2182cbc5050da493557090fc4cd325c8feaa56822e2ac3358d04aef155978827c1d89d970b36f69a819038cc249b34fa0b82a956a7ecbd132489e55e96d5042 SHA512 0a59141ae848c1a10f9388f11016967d0d4453c8471ed777fbff946cbd70d691fad2484cc4bd0025b1bdad2c5e1bf5930c04faf5b598ace6021d8a901d4a2f34
+DIST firefox-151.0.2-tl.xpi 356609 BLAKE2B 66bdfc70da4b1718e0f115b5fcc6156b2d368df56148a60bb59946fbb0a804c1b732b84da367b33de5d4dea40c3533af0dcc0260af7137529adbf272b1b754cf SHA512 cea75a7fa6da1ff89441611190ceb854b08503e28255cf5855d0002b2f613013ae237e1ecda3aa554f47296a466dcc0d671f15467775f73cd2850f33bb76d4ab
+DIST firefox-151.0.2-tr.xpi 490146 BLAKE2B dcd994fa052c580427c69edba4e9a92b3a37ef3cc83d9e7434491c36e22dea6311ff097ab51ff520bf137d9392d5ee0e6984316e21912e33126f8dfb96497401 SHA512 fe72ef3de4ef0cf7b1b7a307eb2f5ebd4413b96d42094fc411a3b326400b4e8c36e4fc3ac7befbf3db79ebbc46e8c6b1eb1b676e6214edb564cc48875da98513
+DIST firefox-151.0.2-trs.xpi 325477 BLAKE2B 287293369e9fe27ef2fa4834067106e5c376acdf0751cea2680bc798ddcc5b535562dfad0edababa90ab01f1c1345d0441f5a4adb74b8643088412a5ce35523e SHA512 dfd81971c18c06cfbea4e950ab48f0d49bec9f80527cb96c0d6ae6fcad35cce9828a828581d46d350fba82e47dd724c427ea0a8bd446c3d86a231e22717e1b45
+DIST firefox-151.0.2-uk.xpi 552131 BLAKE2B 5b67c443cf6e0b15bc68440f7d6ef313ff23ad2e32839f3c50c73b0e9cedb00eac8c681c804a698777d570973180274bab307c530f9512f496f97e30c54d5408 SHA512 b9838e123cf459e1b1e68fee8804f5051077a8fcdb174f5c6c13f85ed5cdc467823bdb81628668197cddda2b61782255b52b47423813f3e162263557b4cc1c0c
+DIST firefox-151.0.2-ur.xpi 371291 BLAKE2B a86ee5ad59de3dbdb3897a1714b27ae6d0f82911cdc5151efeae283bc57638a2b5a9763f0345647d17569b34c25c40d7385276b3545a4a37625d1e42b393758d SHA512 9efd8a0b8367397d5754a695a77c034a3ea275384f02159d408fa3f75b14d6dbeb723fc35963fc874e88cb95bceee2c839e7dbab4e7809ef0897d3bc8f5a6802
+DIST firefox-151.0.2-uz.xpi 305737 BLAKE2B afd70aa2ee29e3615ab89083d4d1b44b3742c79e6442cd89bd1806d406fe1c05163bd28fb87405ee0254a7253577b8c4e9401643a1918b2b58612faa4de9bfef SHA512 da6729fe972a5a7fe7a7817cc60732ed6fb99be07fa7e637ac91bde39c07ba4699dc466435a94c9dae8735b9fcdd305cce919ac3bc681a1774492714f5a10ad1
+DIST firefox-151.0.2-vi.xpi 511303 BLAKE2B f35997021e3066855ce5cebf00bbee120642fa850d07f32ebff6c0d4dd9d6fc8012f88998430334c349f48b457eb30c1ed162fa1ae90a415e40b699ac64a8d3c SHA512 2f194505e2c17bd230b41133bcb050638e9a51f8eeb635bbd4b63073f874d251eca0e301447d2fbcf188540a196cac8b7f8f9d3a6b82242451b656c4d3fa2bc7
+DIST firefox-151.0.2-xh.xpi 275311 BLAKE2B 865384de24cdfc70de994e04937bd2dfc223db24f43aef56d75db44feb72b1902989f9165a0f6fcee87daaee4132564e708c7d9e7df6ca1a2164e067bfbed7fb SHA512 3f6daf98093e7342a98ed21b7ac95ac0c97c07a49ea519ca3cd2726c2421a1ff76963dbda0a19de4f2553a9cac6a753ace054efad380d54325c2e9e9e26ee224
+DIST firefox-151.0.2-zh-CN.xpi 501515 BLAKE2B a973ada3db5232c5cf743cfae9233a224d906b8d4cc835d5e2094206f707aba9c42d7ae0dcf80c14c7316fe215b6147e11547f17c725c529672aa6cf2606689f SHA512 95d0861ef0cf2c31a0bbb03af7733b302187fb6f8f20e43f82ca290e652fed354245f4e4b5e5d392abe43ed85a54d58489f64ea786da0c5a0422587a4e69a79e
+DIST firefox-151.0.2-zh-TW.xpi 505574 BLAKE2B ad4cdf25b691637b8eb72f051e39a774b3abeb5861f2617c98f7e9a40b55c6e5a20d56877aaef2761eecbe41957560ba5276b18f2954125b072f25cedab1faaf SHA512 403bc218c4583e3002e6c6c3bdd7294b74995b80a29a36fced69f82c590c45eab0c4afb31cfbee3393e82fb6b6004655ee5628e136fb727f06dfa83c6323772c
diff --git a/www-client/firefox-l10n/firefox-l10n-151.0.1.ebuild b/www-client/firefox-l10n/firefox-l10n-151.0.1.ebuild
new file mode 100644
index 000000000000..47f081fa54d4
--- /dev/null
+++ b/www-client/firefox-l10n/firefox-l10n-151.0.1.ebuild
@@ -0,0 +1,181 @@
+# Copyright 2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+else
+ HOMEPAGE="https://www.firefox.com"
+fi
+
+MOZ_PN="${PN%-l10n}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+DESCRIPTION="Firefox Web Browser's translation files"
+
+LICENSE="MPL-2.0"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~riscv ~x86"
+
+# 149.0 is when the firefox-l10n was introduced.
+RDEPEND="!<www-client/firefox-149.0"
+BDEPEND="app-arch/unzip"
+
+S="${WORKDIR}"
+
+MOZ_LANGS=(
+ af ar ast be bg br ca cak cs cy da de dsb el en-CA en-GB
+ en-US es-AR es-ES et eu fi fr fy-NL ga-IE gd gl he hr hsb hu id
+ is it ja ka kab kk ko lt lv ms nb-NO nl nn-NO pa-IN pl pt-BR
+ pt-PT rm ro ru sk sl sq sr sv-SE th tr uk uz vi zh-CN zh-TW
+)
+
+# Firefox-only LANGS
+MOZ_LANGS+=( ach )
+MOZ_LANGS+=( an )
+MOZ_LANGS+=( az )
+MOZ_LANGS+=( bn )
+MOZ_LANGS+=( bs )
+MOZ_LANGS+=( ca-valencia )
+MOZ_LANGS+=( eo )
+MOZ_LANGS+=( es-CL )
+MOZ_LANGS+=( es-MX )
+MOZ_LANGS+=( fa )
+MOZ_LANGS+=( ff )
+MOZ_LANGS+=( fur )
+MOZ_LANGS+=( gn )
+MOZ_LANGS+=( gu-IN )
+MOZ_LANGS+=( hi-IN )
+MOZ_LANGS+=( hy-AM )
+MOZ_LANGS+=( ia )
+MOZ_LANGS+=( km )
+MOZ_LANGS+=( kn )
+MOZ_LANGS+=( lij )
+MOZ_LANGS+=( mk )
+MOZ_LANGS+=( mr )
+MOZ_LANGS+=( my )
+MOZ_LANGS+=( ne-NP )
+MOZ_LANGS+=( oc )
+MOZ_LANGS+=( sc )
+MOZ_LANGS+=( sco )
+MOZ_LANGS+=( si )
+MOZ_LANGS+=( skr )
+MOZ_LANGS+=( son )
+MOZ_LANGS+=( szl )
+MOZ_LANGS+=( ta )
+MOZ_LANGS+=( te )
+MOZ_LANGS+=( tl )
+MOZ_LANGS+=( trs )
+MOZ_LANGS+=( ur )
+MOZ_LANGS+=( xh )
+
+mozilla_set_globals() {
+ # https://bugs.gentoo.org/587334
+ local MOZ_TOO_REGIONALIZED_FOR_L10N=(
+ fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE
+ )
+
+ local lang xflag
+ for lang in "${MOZ_LANGS[@]}" ; do
+ # en and en_US are handled internally
+ if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then
+ continue
+ fi
+
+ # strip region subtag if $lang is in the list
+ if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then
+ xflag=${lang%%-*}
+ else
+ xflag=${lang}
+ fi
+
+ SRC_URI+=" l10n_${xflag/[_@]/-}? ("
+ SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi"
+ SRC_URI+=" )"
+ IUSE+=" l10n_${xflag/[_@]/-}"
+ done
+}
+mozilla_set_globals
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ unpack ${_src_file}
+ fi
+ done
+}
+
+src_install() {
+ export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${MOZ_PN}"
+
+ # Install language packs
+ local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') )
+ if [[ -n "${langpacks}" ]] ; then
+ moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}"
+ fi
+}
diff --git a/www-client/firefox-l10n/firefox-l10n-151.0.2.ebuild b/www-client/firefox-l10n/firefox-l10n-151.0.2.ebuild
new file mode 100644
index 000000000000..47f081fa54d4
--- /dev/null
+++ b/www-client/firefox-l10n/firefox-l10n-151.0.2.ebuild
@@ -0,0 +1,181 @@
+# Copyright 2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+else
+ HOMEPAGE="https://www.firefox.com"
+fi
+
+MOZ_PN="${PN%-l10n}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+DESCRIPTION="Firefox Web Browser's translation files"
+
+LICENSE="MPL-2.0"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~riscv ~x86"
+
+# 149.0 is when the firefox-l10n was introduced.
+RDEPEND="!<www-client/firefox-149.0"
+BDEPEND="app-arch/unzip"
+
+S="${WORKDIR}"
+
+MOZ_LANGS=(
+ af ar ast be bg br ca cak cs cy da de dsb el en-CA en-GB
+ en-US es-AR es-ES et eu fi fr fy-NL ga-IE gd gl he hr hsb hu id
+ is it ja ka kab kk ko lt lv ms nb-NO nl nn-NO pa-IN pl pt-BR
+ pt-PT rm ro ru sk sl sq sr sv-SE th tr uk uz vi zh-CN zh-TW
+)
+
+# Firefox-only LANGS
+MOZ_LANGS+=( ach )
+MOZ_LANGS+=( an )
+MOZ_LANGS+=( az )
+MOZ_LANGS+=( bn )
+MOZ_LANGS+=( bs )
+MOZ_LANGS+=( ca-valencia )
+MOZ_LANGS+=( eo )
+MOZ_LANGS+=( es-CL )
+MOZ_LANGS+=( es-MX )
+MOZ_LANGS+=( fa )
+MOZ_LANGS+=( ff )
+MOZ_LANGS+=( fur )
+MOZ_LANGS+=( gn )
+MOZ_LANGS+=( gu-IN )
+MOZ_LANGS+=( hi-IN )
+MOZ_LANGS+=( hy-AM )
+MOZ_LANGS+=( ia )
+MOZ_LANGS+=( km )
+MOZ_LANGS+=( kn )
+MOZ_LANGS+=( lij )
+MOZ_LANGS+=( mk )
+MOZ_LANGS+=( mr )
+MOZ_LANGS+=( my )
+MOZ_LANGS+=( ne-NP )
+MOZ_LANGS+=( oc )
+MOZ_LANGS+=( sc )
+MOZ_LANGS+=( sco )
+MOZ_LANGS+=( si )
+MOZ_LANGS+=( skr )
+MOZ_LANGS+=( son )
+MOZ_LANGS+=( szl )
+MOZ_LANGS+=( ta )
+MOZ_LANGS+=( te )
+MOZ_LANGS+=( tl )
+MOZ_LANGS+=( trs )
+MOZ_LANGS+=( ur )
+MOZ_LANGS+=( xh )
+
+mozilla_set_globals() {
+ # https://bugs.gentoo.org/587334
+ local MOZ_TOO_REGIONALIZED_FOR_L10N=(
+ fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE
+ )
+
+ local lang xflag
+ for lang in "${MOZ_LANGS[@]}" ; do
+ # en and en_US are handled internally
+ if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then
+ continue
+ fi
+
+ # strip region subtag if $lang is in the list
+ if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then
+ xflag=${lang%%-*}
+ else
+ xflag=${lang}
+ fi
+
+ SRC_URI+=" l10n_${xflag/[_@]/-}? ("
+ SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi"
+ SRC_URI+=" )"
+ IUSE+=" l10n_${xflag/[_@]/-}"
+ done
+}
+mozilla_set_globals
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ unpack ${_src_file}
+ fi
+ done
+}
+
+src_install() {
+ export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${MOZ_PN}"
+
+ # Install language packs
+ local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') )
+ if [[ -n "${langpacks}" ]] ; then
+ moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}"
+ fi
+}
diff --git a/www-client/firefox-l10n/firefox-l10n-151.0.ebuild b/www-client/firefox-l10n/firefox-l10n-151.0.ebuild
new file mode 100644
index 000000000000..47f081fa54d4
--- /dev/null
+++ b/www-client/firefox-l10n/firefox-l10n-151.0.ebuild
@@ -0,0 +1,181 @@
+# Copyright 2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+else
+ HOMEPAGE="https://www.firefox.com"
+fi
+
+MOZ_PN="${PN%-l10n}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+DESCRIPTION="Firefox Web Browser's translation files"
+
+LICENSE="MPL-2.0"
+SLOT="0"
+KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~riscv ~x86"
+
+# 149.0 is when the firefox-l10n was introduced.
+RDEPEND="!<www-client/firefox-149.0"
+BDEPEND="app-arch/unzip"
+
+S="${WORKDIR}"
+
+MOZ_LANGS=(
+ af ar ast be bg br ca cak cs cy da de dsb el en-CA en-GB
+ en-US es-AR es-ES et eu fi fr fy-NL ga-IE gd gl he hr hsb hu id
+ is it ja ka kab kk ko lt lv ms nb-NO nl nn-NO pa-IN pl pt-BR
+ pt-PT rm ro ru sk sl sq sr sv-SE th tr uk uz vi zh-CN zh-TW
+)
+
+# Firefox-only LANGS
+MOZ_LANGS+=( ach )
+MOZ_LANGS+=( an )
+MOZ_LANGS+=( az )
+MOZ_LANGS+=( bn )
+MOZ_LANGS+=( bs )
+MOZ_LANGS+=( ca-valencia )
+MOZ_LANGS+=( eo )
+MOZ_LANGS+=( es-CL )
+MOZ_LANGS+=( es-MX )
+MOZ_LANGS+=( fa )
+MOZ_LANGS+=( ff )
+MOZ_LANGS+=( fur )
+MOZ_LANGS+=( gn )
+MOZ_LANGS+=( gu-IN )
+MOZ_LANGS+=( hi-IN )
+MOZ_LANGS+=( hy-AM )
+MOZ_LANGS+=( ia )
+MOZ_LANGS+=( km )
+MOZ_LANGS+=( kn )
+MOZ_LANGS+=( lij )
+MOZ_LANGS+=( mk )
+MOZ_LANGS+=( mr )
+MOZ_LANGS+=( my )
+MOZ_LANGS+=( ne-NP )
+MOZ_LANGS+=( oc )
+MOZ_LANGS+=( sc )
+MOZ_LANGS+=( sco )
+MOZ_LANGS+=( si )
+MOZ_LANGS+=( skr )
+MOZ_LANGS+=( son )
+MOZ_LANGS+=( szl )
+MOZ_LANGS+=( ta )
+MOZ_LANGS+=( te )
+MOZ_LANGS+=( tl )
+MOZ_LANGS+=( trs )
+MOZ_LANGS+=( ur )
+MOZ_LANGS+=( xh )
+
+mozilla_set_globals() {
+ # https://bugs.gentoo.org/587334
+ local MOZ_TOO_REGIONALIZED_FOR_L10N=(
+ fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE
+ )
+
+ local lang xflag
+ for lang in "${MOZ_LANGS[@]}" ; do
+ # en and en_US are handled internally
+ if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then
+ continue
+ fi
+
+ # strip region subtag if $lang is in the list
+ if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then
+ xflag=${lang%%-*}
+ else
+ xflag=${lang}
+ fi
+
+ SRC_URI+=" l10n_${xflag/[_@]/-}? ("
+ SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi"
+ SRC_URI+=" )"
+ IUSE+=" l10n_${xflag/[_@]/-}"
+ done
+}
+mozilla_set_globals
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ unpack ${_src_file}
+ fi
+ done
+}
+
+src_install() {
+ export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${MOZ_PN}"
+
+ # Install language packs
+ local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') )
+ if [[ -n "${langpacks}" ]] ; then
+ moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}"
+ fi
+}
diff --git a/www-client/firefox-l10n/metadata.xml b/www-client/firefox-l10n/metadata.xml
index 1ec7aaa1b7a7..f6b7395348dd 100644
--- a/www-client/firefox-l10n/metadata.xml
+++ b/www-client/firefox-l10n/metadata.xml
@@ -6,5 +6,5 @@
<name>Gentoo Mozilla Team</name>
</maintainer>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/firefox/Manifest b/www-client/firefox/Manifest
index c3853a946a47..555255678f4b 100644
--- a/www-client/firefox/Manifest
+++ b/www-client/firefox/Manifest
@@ -201,11 +201,116 @@ DIST firefox-140.10.2esr-xh.xpi 272786 BLAKE2B e49ebe04e70d6f98f5cd159d0e53a4fc5
DIST firefox-140.10.2esr-zh-CN.xpi 460701 BLAKE2B b7d86a273f8e474b5ecdfa002d7eed175aee0d53847996d5f684b090ac4a6efb6e48ca4606e112d0fba69c8666e38ac1dab892a54a8e77d01858ba06f7a0f325 SHA512 0c5e1d8f1ef2f36b34675e62190053e13f221fe6cc9d50577053f2e6e75c083318c2f0920e1a87939131d517da140e0436d471304d3b5a1cf10e3e2b2f0d216e
DIST firefox-140.10.2esr-zh-TW.xpi 463738 BLAKE2B 523649b74cc2f0ca7de709b76c4cddfd915303902490ffffaa3b43507d03d20de61b56f171d283d75b0ec9587f2c0ffe47f214c810e8d436d0069c9b5fef721b SHA512 bc9e612545dffb0b8d4a61cdd1c0c1b4ba2f413718c577ba21bd1123a032d4bb7cc32a8833e2acd108e5a100768c77edfb98a91f3c637c7363a7745df04db288
DIST firefox-140.10.2esr.source.tar.xz 638783848 BLAKE2B 513de9c3c73ddd3eca355d369f2dd40a6e3b3f73cb399b83a79b8a2a0851b72339ee3e8570738339e5c3fcd2bb6f8ff23ad9e0ffeceeed95fb8c234505a74070 SHA512 bda7d5e6d59a2ad310e3f3e6e8ec05c78222edce266671d5d454dfa3e8f0086add3b9c0099db907cb62b2587ed47026ba7b3aa4f0406693d142d8d91b818d551
+DIST firefox-140.11.0esr-ach.xpi 294371 BLAKE2B 29cf9831983dd0a8df011f1a4ce787a53a9579d49625206c4fa69e5b1b9cc5b5bfb3b6a722148d6c1e3ac60cc8023425a3d8a420a23e7a828b11d6d3a379fb7d SHA512 4064306bf02f5da0c57edca1e207de6a225355ab4929d7ac1df8cf8b47c60b1ec8aad4350d65828eeef54549018d39e641aad7d37d0ad347b572ed4b4ea211c3
+DIST firefox-140.11.0esr-af.xpi 266634 BLAKE2B 7be8bd546e96e1255d18ce096d58f4ab9cd0303bdcd7e168289d258b8fa8682b366c9cc23405d62c15408f76a3f7ec65560b39554d75caacd0bce3d7121e46a7 SHA512 752d9d2d7a5e634bc5309096444f737705e651390a70bfcdd8d8a14e97f6ba16087546cf39c4588c6034c4f47b795f445542effe71124b5059c24adab94dd31a
+DIST firefox-140.11.0esr-an.xpi 332299 BLAKE2B 955c0d23c831273ae91ef4c45400660d0245909c8ece8d7dc38a1b08cfc88695e3707ea990f0f281815cbd4b6ed316c8519ecff3be0925e251abaf64610cb16f SHA512 127de6e64b8a85ff9998dbea57ce89d16b4b6dc34eef063645d0de4ce8762a6e5f0647812dde4f7bc6e7fd0c7a819af7d036be089d2a8f4488f2cf778577ffef
+DIST firefox-140.11.0esr-ar.xpi 445288 BLAKE2B 22189d5b1c4c5aa6e2e8d942ec0b80551d351a01ac65e8d423514b2c2285f290c3280f59a835f74b81924f8d81a8854dcaaad34dddbccddec0b8dba4d40f7b1c SHA512 45d4775723eb6f53ed678b879e94f8d59c92204b391fadc454298bb44264142e67dc438cb9839ef88d29c086583e2e4e96c25b886e6f095ec4326a92e1bb4ae6
+DIST firefox-140.11.0esr-ast.xpi 312216 BLAKE2B 0f505df9d95fdfd849a1db1b870f260b8393be323aed4394e19e53ae9639b22facbb8b7fbf36b938e276b82885c9d644105c0c2378528c9a22e004c2aa687130 SHA512 e228029ff32870a123dd8fab8bea416ca842cb8e8ae44be0b766354cc5d24967d4ef9d668aae752f5b89d7193117df27b65419880bbc8a919369712b57b00ea9
+DIST firefox-140.11.0esr-az.xpi 318412 BLAKE2B e7e4385647565e2453ecc797cd8c4fb9b9ea9851805175029484e7f7ccfcabac5e9dcf6d3dc76cdb3a20ccd6f21f83b5fba3a725d8cc7cefeb08c635c5e4bf1c SHA512 ecc9a8f1813a8677085b29ca3762d992ff88ed0f749c29f9d6de32b8d61e6a8f26cb9d150719a4d091ec11d73d2930aa72d54a36d13343b31413d5effb0f2363
+DIST firefox-140.11.0esr-be.xpi 521200 BLAKE2B 8d2e8d3af762e3ab4e58f011d43feb10aed25c63e9a960d3a1c43563677fda09dc1fe761cd7d731f27ad83745f82583dd9dd8befa1ccfe23e2865ecf3c5ab57c SHA512 e219c477104838f244ccf1d1c3eee8c22065b4ff1835f5918c10bca60c2fb5555217c2d626120deae6f6ee808fd2c393e3784e5af1fc83a0b9339629790fe706
+DIST firefox-140.11.0esr-bg.xpi 457555 BLAKE2B 31f80376a72d36bbbfeb8b42e318812129a2f79a3244be5ff53e06b909930f13ee28dbef8416ba73ec6af1e80c0e3ce44c3a601043490640b110fe727b11cb1b SHA512 ca61f6b632db989e7bd8725c5fb834fbf19d8f4d5ab7b6238e005fa4273096855173905111a5a449dabd4b9382ac18c59c25a89692dd288e617b67d5f88cf648
+DIST firefox-140.11.0esr-bn.xpi 413377 BLAKE2B 3a607b01c32ab80478b2595ff0f331f5669879c26d4590e83123d79a756bd35ec1abf2b89ebc49f4f3c14ffaa26cb07a4ddd14faa9dca4db096219b409d1032c SHA512 c6a6edeced542a7d18452e2353cd8da1df62f058937299fcd9bef5a30cae1fdc311cee2b66c8a6cfa2f8a1aa5b78cba36dd41eb16024aa70c2a16cd153a34f7a
+DIST firefox-140.11.0esr-br.xpi 395302 BLAKE2B b59bf7fcf4ebacdf798ac7abee91feb55e8932acbe6f092c8675c183aa2d68cf9ccae5d9f596b7c9ca62ee1cff49235a36bda74e35d3c8467e21dde695ef2c39 SHA512 0e63b6eaf2ab583905cf7f27c055e0c93f38e8ddfb5513be33ca4cfdd9bb30ed1a94cdadef5d0894f30242227abb57121c9b5159d29459f8a142c8fd17976511
+DIST firefox-140.11.0esr-bs.xpi 447174 BLAKE2B 475886a98ef884a29fc1186eb87e743ec3e493135220099cf2cec895d34c30ebdecf8e5944ae851eaf2526f595ead18cd6f62910409406f19b23f62adea59258 SHA512 368ab5b4ff8a70b3547dca71394a5c2cf7c70b7209d035dcfbb9ec84407c395025a7a89313cbb703af28aa5719eb6c3fadc1f861234c2e9ffd11bd06e2eaa0c4
+DIST firefox-140.11.0esr-ca-valencia.xpi 357934 BLAKE2B f4035ab23fcfeb631e2b72cbf5e9f66e866a77db6a8f1f7799ca4893ecf34b5defb808fb2c0579ffe3ddaf019937cd90ed49485924a72e15c77795398346c085 SHA512 f385612bf6feba63cca40d934f470b639b2fdb07dea5a430367d4bd4c30af748eefe6c0f479c58da7fdd1c802f7084a606eb5e6976f16ae429129565e853f207
+DIST firefox-140.11.0esr-ca.xpi 404833 BLAKE2B 104a1da0ab04c0f88fac44cc654091643756102c233f988e655bf07cc82d4a3fb0410e7e240b1d53225bb8f58f0bd8ccff7885b2608e85cba2edca81fe051723 SHA512 1feeae2ae0e25505e3d1dcadf4c96f648cc5e5e3882dba8e255bd66e657bbd07c7fa1d0dc8ee8bb04774650ed13960e0096a25ab9207f4f347af624b16e6ff51
+DIST firefox-140.11.0esr-cak.xpi 390847 BLAKE2B 4b07c25370fae466ca1033c40012857cf7baaba2882687ad00f1951d923f68808b3a6ba24ddfe14e5e7772c0cbed6adfcc1968eaf11749963405a85a7135d47f SHA512 521866521a691015e3526f30c6a2e6ab1cc4c723d810522229e972b8af369da94d75228ee04e4b72af370ced8ef533d2f82b293f06d0b8605e5d119e4984b035
+DIST firefox-140.11.0esr-cs.xpi 475926 BLAKE2B ede401d984bb83185e99ba58008f17d4b5594be134ec209af77a96f187e450bf314ee6497d05425f16bec6000868f7550dc7dd2ebe5acf71d8943864847c1264 SHA512 391c282d773631774f8e147604f6573705926d4feda98d21240532e7b41d6c2f7babe5b7e1bf961080f838cae1efaeb1930a3a66722acccc5b44b0cacd399da5
+DIST firefox-140.11.0esr-cy.xpi 441956 BLAKE2B 95fb71d4293f947288ef797832f08ef1c318f0fd1760a1d8b3ef452639834680a303d6f538935f3abee341d777b4f0d21457fcabcba10b3f45f2212e4edaf729 SHA512 d88ba7806a6f1dafae326a9f249f0138b26e8d88ad3121924cb45e6da6d6e218e17579e25d56fb1cd1e72b72c301a63b7c2a989d5b57ef3a99ca3f88a70f085a
+DIST firefox-140.11.0esr-da.xpi 431126 BLAKE2B 8607f77feb838f829c8afd2ac5ce3975556ef13c764132f29362e33d1ed6e192a580321462902d98e2504702ef3b04c997044e753abc2ff69cf7e73c3b7cbd71 SHA512 0cf4fd0539f45d5ed5972ba79d9e4b7a34317eb172dc962b5e727cbfc7ea4a6d3ce6f68d527a5321449abb5de6083ee1a6edd9ce4e04bdd78e4bcd211f526cca
+DIST firefox-140.11.0esr-de.xpi 452699 BLAKE2B 86b2ab0a7c440c33e8c0da4f00182ef546eb1f7f3a7b0d1989b94d60b761a983103271a1d6ece50c4c4b73ca358334d94f56da1ad61be40c233a071675c8a936 SHA512 8d283ddc974356930fb5ef44599de5ea51af5b47b2dfbce8d9f119bf38d1771c7235800ede7e6407114eb557d42fb560fe05dca45b1ad86e494bfae787d19208
+DIST firefox-140.11.0esr-dsb.xpi 466065 BLAKE2B 786032e6575b115c3f299459b5cb2957713cdb1e966693046a9dc1ad57ebe9184137b56d0f3bece5c3473e040efab5db5ee0b4a412b04046fa8966eebfed94c1 SHA512 0245698b35f387bb1c5389a0614f63c11335e88df6af495a0f7a820b42ef8eabfc49c6ec0d21b155cfb395bf788f3c637e913740aa3c506a3b53534f570f1539
+DIST firefox-140.11.0esr-el.xpi 536817 BLAKE2B 7ffc22a84591130762ea6e6607594ec29179091a3705e910807f2439aff04446c1832d48e929dabae24b3c62aa1efa884c1a77182edec6c3228decdcb591e477 SHA512 65e3dac8a7b74393736cf9e9dbbccd83c0b316a2954e65883ecf2fb7ae2f2fcb70784279506551c4ace4ad56858db49ab1e11fbc3bc7702d8b1b0eb14c3e4881
+DIST firefox-140.11.0esr-en-CA.xpi 411054 BLAKE2B 9543148d9ec86fbd301f58f7d1a6d1da706460c35d97f85b247d78a7894f627d8d03088142c5e8cdf3c4efd5a34948e41e549612327f76275d59d99d4aaf1655 SHA512 57e7b1904137df3217dbe1e14c5b0c95c72f5e2c9bbc694775825e2299cb0d9b1844ec4e885d4781fc98dcbfa8f1accb0f3e78aec9575a860f61a985f749376c
+DIST firefox-140.11.0esr-en-GB.xpi 411412 BLAKE2B 0b8cb73f84af0185bdaead1f70b247be6e477e9d895ac3ce2935e0610628c667ebd2a50d187a0fe60aec7364a63e43382c947822bec6b7e185fd195875172aaf SHA512 0035befe38cddc83f9f993e7ba5e3f0b4d8d3d3471acce7a12a0f83001f2effaa5979324e01db738811d2e1b1aa46863f946eb9ba33294bbcee1e4a257d9aa61
+DIST firefox-140.11.0esr-eo.xpi 433477 BLAKE2B 8ad62c7c3a5c0892c1dab7d30450a83c84d0f097cb154bf21957e028856fc0b900aa3afa8c9b16f06ebe39340f70e74b404310f31c06c3836c20ac34abd3dc58 SHA512 9cbcdce267ead7359d46584a3c5cf39621a9c1ed8d5a5c7090e6e77708689f980e041eba9de961b23e24f1e4dfaf5e9106c9f8967fad9c49b78a6a5083dea4bf
+DIST firefox-140.11.0esr-es-AR.xpi 445515 BLAKE2B b6d5925612a1f0041587ef902151dac5b45218b202b8ce42911d76a38bacdeda21e40f7e0f8db454a5320020fa27b3c0ffdb97b7340d580b7c6c65366ac270c1 SHA512 663122c70d281d99afa665246d0fdfe0f50bfec569e26f94f1979c38d5886086d16cc299ea4cb2dbc5728946a8b14a3bf48263b6c867ff210b5f6ea931c87101
+DIST firefox-140.11.0esr-es-CL.xpi 446304 BLAKE2B d66e52c04e0ac9e2f04533dc8d031b3fbdd4fc3fbe7cfa0019d537fab1239b946be23f7386654ea1ab5a7bd89ad13727748c88efde138eb1c10134e0add2c57e SHA512 d3424b21d4b630ac5ce24e96ad40fcc2b32e3f17782546b436b145c8de772962b016fb20b7a8aafdf5a1dccfd675daec221feab2d380f571869a9dc514bc73a2
+DIST firefox-140.11.0esr-es-ES.xpi 447015 BLAKE2B e023b0d80d2d8b82c21a754cd2bb1e5b3b3bf8002395ab57aada57cab929ad0d635288753ba7dbe412a3ef11a4610deb7c6ce0a23ec4c722eff897f30d1cb8cc SHA512 c39afcfed79822f0a1305c233c3b1daf7f7b13c62740faa3b749eebb1a75070f4c6689b139f5063eb1c4a09f018a44934423c9fb2ea887e1e0a0656fc5111b4a
+DIST firefox-140.11.0esr-es-MX.xpi 446240 BLAKE2B 2a67018bd95dbd9056051a0cc5bbff6c14f3dc2bfb7d16c5c60c74b38ed76349adb0409b5855baaf5be688eaa36f8d40697b5d69cc19da31a991c3cf36cddb72 SHA512 60044bbd788f12d08c85859e46dd5ba4eedb17c5301e34d3d33535703ca478bbee0012dde2e41c0eb1cf2eb5aed62b351bda11105635224012d395346d934e6e
+DIST firefox-140.11.0esr-et.xpi 359327 BLAKE2B 487bcd65e93183a760095c376b14d397b736c7a83fc48ae1590177b839dfb341ff12c0bdab3d26e8b149ac9d6c0920dba261784f2edf3e55700cffb20a1dbcbc SHA512 4861ee0358af9d42d5c8e488d86eab8d4e6bec0909792d84ed8fef2107f66b25c0d5bb75416927953f871f68659314edb5ae47e342d9ecb2ef9c049946d91e47
+DIST firefox-140.11.0esr-eu.xpi 417292 BLAKE2B 675959ecb9376b3578293e0372ae518d953f9cea31b1e7727a6fe02f8e160245e2424210254589ab705bb31858862c64e6f06940040f84d78f0d484b87a75897 SHA512 c0426796b7c2d673043b0d29402ca28e808fba956a61e443b8b72a3d72e005b340dfc00a6f6acfe0163cc24b7ccaac9244f48c81ed2e14d9e1f9ddac22f29d70
+DIST firefox-140.11.0esr-fa.xpi 421633 BLAKE2B 2c0f92b174e7418224554906a9865c39f94467d49a1940baea1b3d3cc8deae9144bf0689f88813e0a7f6ed295d5d91c20fc84bc7a20732f940e94db8e74dd0b5 SHA512 d4b30f50f85233c86556e4446908a4a24d810a0458484dcba8da4378e05aec24fac7b97785e638e6137c5a1c96fdf0be7baf2ec1d2bd0150e2557f97cfe9658b
+DIST firefox-140.11.0esr-ff.xpi 310183 BLAKE2B b99fcc7ea695061ca2e337d7860d920054c1023e6d944bd8ed361002e1c0877786b94bd5038a0d72eae24f669af16947268847f3a33e5917fea54bb280c3ec6d SHA512 d7de0e3bdafd5090356d4d73ff0d0826b769760cda1a7d3721a046eaa7794ee899b98f6286f265b7b43b1b4fa49cbe828664a69d40b6cc9c9a8b38c528193069
+DIST firefox-140.11.0esr-fi.xpi 430163 BLAKE2B baf495856ea9817b1a6c8323bc2ce4fc5877481109f37a092fbf68ad3fca050cfcd8364ace46f90310dba0bd41d27b2a7d20751e78ce9fb4a131d574a16077e5 SHA512 285b7e47d34d8b457f953e6aae36bdbbcfdd0d41cd1420ca97fb5555a471343387e4c42b67c3779a9060675fad03e734b1755392c549a502e30ffc444b405635
+DIST firefox-140.11.0esr-fr.xpi 458457 BLAKE2B dc74642bb01478e07ee3996f56d01379bce078642bbbdae19636940177a8a980b07f3c3b52584f99089970b622cd110013c780a8f84f6e903724f82205dbadcd SHA512 4d72ad72401c679a66a3b628762d51fd88d4bb59d5c08b645bd2764129596a94b70eebe2c83e03e0f2de6f87b6fb02460798026efb4052d59ca98263f2a685e2
+DIST firefox-140.11.0esr-fur.xpi 451831 BLAKE2B 56260a9026f93164f82fe0d43bd5ca9efe7e64e1b082069585da4a54fc08b39874a7fbe66dde9460f9c43d4db71202d24c6688dd0be8acaa5c9c9f98f68099b3 SHA512 aa884d47753d176c995c1b6a8048ebc4d7b1afd0b4de4a3e8a13df2c3cf73af7cc1877c21e57df3e9a2af1d34e581379508aeb0532d4af25d1b6041ccd4ede08
+DIST firefox-140.11.0esr-fy-NL.xpi 442166 BLAKE2B 98ff53c9e16fbe381c184b2b4037cf714170c85b9abda0749bec29f14e1f0e18621702798aa95d3f1643610cee0dfd688aa53122f69a347aea4562201953d8c9 SHA512 1f34f676f1d1b682d4402c04c29d319d3bf8a60a60632a94efdfe760e6af6901706fba783f7d2d0cefea484d4177fe3518e2ca10af7c4335e8f643891e82cd4b
+DIST firefox-140.11.0esr-ga-IE.xpi 315284 BLAKE2B 9be83e360dd1f73543eda0eef9664a7dcbaa8940452a2b8ede19c50a3439c3ba73737808c2baf47e47c34c7d89f2eca2729351189de109a3b6d57382471bf49d SHA512 72431fa9dc55b850dd6070ba2d4dd158fd38068e8400ffe9f4ed49e4ba8cbc42492802e49aee1e89f79e06cc1e87b58459a1e45f728741154411f67fa109a10a
+DIST firefox-140.11.0esr-gd.xpi 399430 BLAKE2B 75edb7ffcbb8d44fc4617bbe8697c040cc717709824632be586d7d905514e438f229db177c9a8e438d4268ce152bb9d67e4de08dd5ce184beb265a65f042e314 SHA512 ad3b36eb22d6a07502f3fdafc98133bd3ec98e29da1a5b50bde20f9380f96fbc14da3c9f2a5bbaa842912a42de86d088e94118c4c4ae63c5ea24c2db1d34e555
+DIST firefox-140.11.0esr-gl.xpi 442916 BLAKE2B de516c754c723892d4bc892e36cec758fe12bb6952ced5fd23cda744ad90a0ff54f48521f4305e00d92c6f739aa91a33941145638c940c8dbe32537a1cd5c753 SHA512 75276df8f81cad4a30cb899815344a6d874f288a2e58b352633f9cedc1485b1cf2e8c11fe011950873959777c5e044f2df5470e7e04a95887a7c1bd29cddd5f7
+DIST firefox-140.11.0esr-gn.xpi 451091 BLAKE2B 0ffd400799e3af5d69b0f832cfb13bd7e7979855fd1786b8ba473a2ec3cce7cc936a7559524aa12dbc6f8e7317fdf22bc870372298a1c9c4e5cedcebd38a01c4 SHA512 3b7eb0a661af1def1a5bc517dae62d1716f66495f9239aa42402f54d2e210634e063d0c23e4f51c3f5bafd6e1f7f750baa4c802e50869d1c1b6c6e42fb013e4c
+DIST firefox-140.11.0esr-gu-IN.xpi 358974 BLAKE2B e4af8542660bc809a7c1e30ae333f350b7031cd2d5e2d69bf878dff0fdbc25041cf8b64510e56e19b1718d64593abc7473eef2d68285c5eba437a8a863cb2f07 SHA512 4336af040a43cef3a9546ba77e716f678fab7840000665cab0b7cc785693137819541fb933b4b1dfae72fe66d65726690d290ad162685fae67db12007b80ee36
+DIST firefox-140.11.0esr-he.xpi 444991 BLAKE2B 3745e5fe2e2856c5aa448eac7fe14a9e345bf6f16245db94aac0adbbf5ab03d4ab6f87421a5e51d2d122790d61ccf28d6940f062508a037a11197fecc5905961 SHA512 ec616c7776b1b185696119ffa0184f3f692cb802bb265015522ead01bb664e26bdcf0a34757fdaf7196cb48660ac8586c08c888966dc2ee4d4cd67af75c5ca57
+DIST firefox-140.11.0esr-hi-IN.xpi 377455 BLAKE2B 9baec6cc104ba7d8f6902e975e151a73a653ec61a73ce264b69e25b4ac8a0146c962463f1296f25789f508b70cc190a96955911f9e1632c1096dffea01a97ec9 SHA512 ea14495fff531b74d032edde89e2df59905b9b4022d1a6dcbf1923bb0f1c59f78dc8f4d051048da7ab58494167a452893d2fdb8d8438f5e0967c054d95b28ecb
+DIST firefox-140.11.0esr-hr.xpi 437689 BLAKE2B a5986d51b43145b9e9421ec5b7f9e20703e72b7f14bd29e71061f64fd7fc4013304473a8d0bcd96d9635607a74766dcf025daeac91d8566208a5ab64c9aaf2a5 SHA512 bd9748a19357dd5509ace144cec948c05f7071467c120c8efce327222980bf4cef445e57482f5c8881b4bbcf2efedcd47e0cd25a9b5ca01c61daf4affbddcbf6
+DIST firefox-140.11.0esr-hsb.xpi 462696 BLAKE2B ba0a66715ac289f04dc8c007be8c937c66058249bec9e5933389ffbba92a558dceff6978688876e147e2fb95a5e2c2f83a262237f441f427e178d2a5676cbbab SHA512 bfbb55790a6977005b830d1ae6986fe85548c094d310f6613fb4cba2de674f3d6481fe4020b6fa9199ded91a3f476afb41f6b0ae01fccad2f2fdbba2255839a4
+DIST firefox-140.11.0esr-hu.xpi 466165 BLAKE2B 43b2a0389da75a09791a7fa82b055b4879f481edb155fc49430e034554f86488fb5494c10b220982f3aff323b70d984631e9528fbe647038e8e52c7ee92c3a9f SHA512 099176f73e327a4ddca9e4f10934f30b2be05c6aad45a75e9c8db296e5e631920423339cb5e073f072b75f6b292679a3fe9eb75df371049c6b2a3ca6b2f0cd52
+DIST firefox-140.11.0esr-hy-AM.xpi 461618 BLAKE2B b7e0d15ea44614a142f4c3d022531717cd550c652e3175b0b3a714f11fd3122866df131036f2a8989cb4abcec40350091fb09c85d981257c7c4bb2d5225792fa SHA512 cb23f39da7b20086fed2d47e508d445c7af2080973a5dbdb9ea0e50b96b0cb96cca8f1ce731829e4e645ab8681cb66ebdd4ada705d3199f26ecbd71a6ae4400c
+DIST firefox-140.11.0esr-ia.xpi 430106 BLAKE2B 40aae475489c64aa0c7d842de51fcb37bf91caa976ec562304ab8f1252258824e405e6c535071a8938f2f599f96adb261263b62f4ba3ba0442cbb87e09c8e3bb SHA512 60021a2e88eb868076609013dc568a4c2da1a0b70efe389a86c6480bac1c3f3a0a126f346774b685060bb0c8584c991643fe543cf110e743186ec5da8e64919a
+DIST firefox-140.11.0esr-id.xpi 422739 BLAKE2B b87c3a3e29fafd24438494fb4a9c00e7f0019c390fbec07c60b0fcf4452d09be812fe360d0934c512b4dbe60b6e85d897218f9cb5ebf50d77e2dc2029016868b SHA512 76accaa329cf829e63869afdd011cca7c182607457f769e2a8dbaedd801f0c4cb0fcb4eb736391dfcaef61b4711b8fb6a1d2d1dc3e535d8e400bff3796f737e6
+DIST firefox-140.11.0esr-is.xpi 432674 BLAKE2B c2c6624197aacd553ba2e26305b25305500c9c15d8d522a011d23de48c29fdc22df96b95f06f4e14af0a401c906cac448cabb3e3c6ee3d7fbf7aa43982eaa8fe SHA512 c2c0a845c4800a4427982204e73f0b62d8b6fa7c839976b76ecc36be56211772fd8181b790f36350722b48f89d52c453cf9f35adc7fd39d34edff23f80a8cfc2
+DIST firefox-140.11.0esr-it.xpi 440903 BLAKE2B bd42519c47ee47662bde0ba4382e2ae35057c2afd6a0777e921de5d9bcc3d0f60bb650086165dc2568d8394f579f7d25465938657641f5d24172e4dbdfd60038 SHA512 9e1ba3a8fb3bbc5c024e1293f5ceebf1d1d48ad23af73460bfba569a8a0dc2d23788f47831992d064b55c86a8950c08b3276eb220d2333674d1d9724b4e54fe8
+DIST firefox-140.11.0esr-ja.xpi 481317 BLAKE2B cae34121519ab7a624eae841475351733db7f24237385fb240c120abfc544a4a2065de10599612470eeccc41a2339eb6f98df6553b5010dc3567f94e67f93b5d SHA512 2fac5f8f1cff6b78b5a8bf4afdf2795352d1a215a7c139e8e3eaadd0517218129d451c1584bc1fe30edd5a8d1ac162fec420fe79333fa380bbd12ac49a0e87d1
+DIST firefox-140.11.0esr-ka.xpi 494873 BLAKE2B 7ba1e335e444629480ea3584c56ef95436827fd127ce7be4a5665e874898121b108c2f6b3171aee43c19d4066f907cf8ecebcc446ed0940c862ff832e68a367a SHA512 9a1dc8eb181dc2b4fe42388fff7f41bd9da740f650309d21de9cc4713b10a6eef5b4bd65cb947af89800f3a43dbc9aade2c73e6799e515f7fe1ce39d1d3b89e0
+DIST firefox-140.11.0esr-kab.xpi 422861 BLAKE2B a28442a40c69446c2d4f432be5e7435a0997f36654028a8c44fa45b4d77e2f9983a9a66d5aa42b98e566b4f889b8f189cc15a82b2d8c9583685e771417091651 SHA512 0b1ffe0071b7fb9e33ea511a5194e5480977069e424a721fdc7a52a46b16af32aa88aed523471291a0c9e0572539eb0b4ae396181017912d7d59bac681cbb2c7
+DIST firefox-140.11.0esr-kk.xpi 506683 BLAKE2B 026efd0c44baf0255a873eb79bd56f4b18e25b7685e445a1042838bdabf00433d2c57729b405c3573f0ae9b4bdb440e06255aa66b5208f4a4abcb1c96e6af6ed SHA512 b760df0532ee3f7601025a31566b3324dceec1dcd696fac5965a8daa0c758943507357fd79c8ff909987adfdb4cb5af268f8234e9f9a2c2c35bf4b73f455e9f2
+DIST firefox-140.11.0esr-km.xpi 348779 BLAKE2B e17cde6d40eb6088120f552d30dadb2b2b66e7ef90460b8616e6772c6f5369b14f7ec74d8bd2f3c2b6d3d3b0811f548d38ad0fc2a641ff8d5c0a29347bf00a9a SHA512 7c29d2e9d8c9d2df15619117f23755f3ffcacdf048fc32f9196c724bb00a46c68a6c7e2c3cf8d66b3bca6f4061c8647ff8387e0a737881aa99599a915ac00d33
+DIST firefox-140.11.0esr-kn.xpi 331777 BLAKE2B bce4de0593c5470c444773af257f4badc5a778251538f7755387a8020d57943fbf0c70b36a360d75d92ff4934c63378b46e66ed90ec848927e97d587e4b6cea8 SHA512 d548867bd6fa31ed7ed77b6c8e6fa8d9daa9d72e3174e376d1179ea179369471094159fd8f4ec3cc6262d89a61f329c67ec8633efe665262dd030511ac3b0ce2
+DIST firefox-140.11.0esr-ko.xpi 467544 BLAKE2B 6bc8462d97e98e4a62f0f81ca93b382bf03f83ebbbe4f7870e6f829315f1351be9fc26c963f306b1f1a286fe6193d99e8d4f0c8aa09b20a7302350607cdfb80a SHA512 07ea4b806c48b4b5068c0a616a13689a0a3cc3fa2fc105726383ed08570e017e6eb988ed725d8696167b26e6476a7eae1d0ba1dc54b674bdff5cbc0b530e4ccb
+DIST firefox-140.11.0esr-lij.xpi 319285 BLAKE2B de726e7edf42eee728257da5385e46ee8eaae473cd54abab9f9708c3f12dd84f7535626369a2e340c73747ef17225f116bc33ad5f0f5439c3cf84492018eca16 SHA512 31f5da496d3e7cbc0443e629d65e5a77a9408637ad198fa90999f9cf24556fdb6e0aa6c831fe23a46793c048264ed8abf50eeea508e411dfdfab8269acaeb723
+DIST firefox-140.11.0esr-lt.xpi 379964 BLAKE2B f5de8086b5ba25768658ed02e863e05c4268bf75fae2a30b5b70a7b7f6c269a876750616206e381c353e15ca7573792b5220f99a9718239d0fc9d3950c424b04 SHA512 044140845c8211cbf29f1f3f45e033ea5f3e1043cdff177de2a6d17ed79d6eedfe55b047ae4716530d76aa11b5c95db137383b6b74db77d63f0ffbc99e21cc39
+DIST firefox-140.11.0esr-lv.xpi 389077 BLAKE2B 6c1b23eab0791817ff016e05ca37baaab2f08809d5b97e88fbd58eb592de6befc4029ecf6d1fe73d4f4ffa9adceef07cd474dae3dceccf4c7bd4724795e956d8 SHA512 bf910f5bffa80cadcbc35f7ad69a2c3ef9fba6bc7e6284c72c75540811556b959821c2ebfb7e3b5f13eec797dfb40e2f709ae0664686ff7ff2505f6f5939474f
+DIST firefox-140.11.0esr-mk.xpi 316834 BLAKE2B 2d449b01be65ce23e6ff5a5f99f4bf77201c1e46e962fc02440086b92f9436b94c108a48850144e60259aaeef206d967fdaee5e24558cc4fd863d0f4099257ee SHA512 e8dab96c2126cadfc6622c3f2f016b55b5d561c1cd3cf81d949a5cd3893aebd43239512f0b6e591aecc4f4a81939582501eac922af93669d18233e42eb0b110a
+DIST firefox-140.11.0esr-mr.xpi 356252 BLAKE2B ab143e0c5b2de1bc5cf5a387d02cdb45e77da59ea5a2badb7512b01526cd155d77cd65befdc93f4dc789db30a6363bf2b2acde57406431968ecedda415a92aeb SHA512 ac855b5d296e0b2098c8882800c5102b20d045c62327efcc5ced4edff4cde19187ad203f7f53e426733ab8a7a9fe0e9aa975000e1c2cc290f95cfccd59a05dd9
+DIST firefox-140.11.0esr-ms.xpi 295388 BLAKE2B 8cd101629cd4f56bb270daff1e22832ab6cede7f311c187108b316da627f39540edaeeed47a68b98a3043303f4d4d000acbf4bc0f015a36282794fce0082489f SHA512 1eec846a78be0f03b3acaf949ed7d6ff9e883db9959d68e1864f360f11dc2ef3e39aec614b81deb130d7208c2c4cc1c0d7cff9d2d5548814860a1f91c27032fa
+DIST firefox-140.11.0esr-my.xpi 343021 BLAKE2B 226606563c3c1081950db9b8d9d7a6bdc8917eef54e7b5bb0e674f8d0ba8a21b6fa8e6bad682233f232bcba997337147eea8b6ed9cb36ae3f6e2ca6541dde47b SHA512 3d47f5c6b04a162b3f3778c27b84b4d6e7709dddb481bc07a34fef344efb362e00e752f2262295b6f0f55f6a281f220c7caa85aa5ff24a5009bdae81beb0462f
+DIST firefox-140.11.0esr-nb-NO.xpi 429338 BLAKE2B ee627240b132d9d114aac1bfb870cc5ef47f785842abbdae8e5039a446876ac53e029d65b8c25c88429394f9a7c3c16e9bfffbce5cfbc8ab4d9f26bc6470a49f SHA512 342a987493a4867a1ba479e6fcb81fc5e8be5b632d7f50c5e82f2cbe7934c54f1ef545bfd595660dcb229dddac98996a4fc7b1b6fc22d05888901fd9076324e1
+DIST firefox-140.11.0esr-ne-NP.xpi 349012 BLAKE2B 15fe886f33c1a629c9f552688ad678eb059942f35201b88fd449f5783d586198256380cecfaa8dce6235fe532ad0a31fe4aa630e9c916ac52df1ec3b93bc212a SHA512 9f361774225a3a8688fff65526cbc8e138fea92098f5c467ea7aa43a6d871f3b116deaa6d06a58f3a4fc6abe483f38ac4cecf9120a3e908671462b499656b64c
+DIST firefox-140.11.0esr-nl.xpi 436181 BLAKE2B b7ecd90e109c1597a9bb3ebe29a86bb7797d554828ce68ec916b8bca0d5fb3c3f51c4aaab6308de66a28ed8b9ef724b49c05cbc20eb3ad5892eef783639bffb5 SHA512 ef691e9288c9777e65ee30fb6f92a42f0802429c14b95c0b99172898360a73be4c6b0fa6e026319c84af5e818bab546c2f1261b7e69a819544db40b48db3778d
+DIST firefox-140.11.0esr-nn-NO.xpi 432220 BLAKE2B 354b961252eb667aa08f02cb4eb7f0cd5a4ec74d92b23bce39257cc85037403683d8b4749c5d8a10978bdea00c36274d8b3203f36457c8a4bc1bb36bd8104431 SHA512 982a0eb742104d91ff4d85e34a1d72e79dcb909c5218b8cac2d25b912b1fbe22a39f8587ca110e3b315d3f2f6da9948e9118f0cfd258a4acfb3fe328917c45a3
+DIST firefox-140.11.0esr-oc.xpi 410937 BLAKE2B 91643dd9d840b7303c905ea08af7cbd46b2b4af1b778fd7b5d3da4a6b233c911dcbbb762105ab754db89ca772f1e29a08cc07f76aa65f3685bcde7fa799110b1 SHA512 10ee716d6af2742efc2f4261d75e13358dc50c61cdd2ea7619f70a42d68643a12968926c2ce6d15fe5e196da5f521d0446cda06cdb47e8da8a13f9c404cd2ff7
+DIST firefox-140.11.0esr-pa-IN.xpi 494402 BLAKE2B 2b344f45ca632cecf94402675e06ac71bc6336fbac5349c84c59499d7560d2dee3f1f3f0064b877db1fa54be0391ef2a71d875bee7b056f1bdf5e4ac1a3564a8 SHA512 e04ead3bd20173a15651a4e87207637d22b716857d38b73ec656bc77c37abb2eeffeb4663ef0c738bcdedc80b8511b5644a21ea2beb12d6462b4e6cf15502884
+DIST firefox-140.11.0esr-pl.xpi 460926 BLAKE2B ad04e980228b7d7005938266fcad2cf35a757cd59fa35f7309dfdf2dfa29c97373a472ae8dda93bda0da33456f37da3f322edc5b0bd5450e5e11e690a31ddf41 SHA512 fa4a05b27656a1b609f62b47de9667772029a222cd0491c912fc495d0bc80a1c9819fa96bcae06f63f38a3cbe3b5d31451f0100f015f1b675957a478e4636b42
+DIST firefox-140.11.0esr-pt-BR.xpi 440763 BLAKE2B 254f58900046f316ca39a141bf46f29397bdefcac26a098691f84cb0878ef182155cc6d913f38c170a7fb7ade305fd63d939751ade6a611ec39f4451049fcf4a SHA512 25e90824a3737bbe0e0171bc274a8e84fee4f000bb323619a6ac402dcf587efe460a543205c3d988c477e42b805eded80c0eaa68d644fc436a79b61437be1289
+DIST firefox-140.11.0esr-pt-PT.xpi 446417 BLAKE2B 91534363b487fde9326f17f7370fc76c9422e450b28cba2419d68bc13cbd86b321092488390532c81db1ff659d3461924f63d36ff2c09d10b9116908242251d4 SHA512 2b3fa9572b85ab212161cc3d5e1e7e578600029ef3505f8446463e3c402b3727499976b283e35581961173af255720291119ee47831a30542c32a057bca52bb8
+DIST firefox-140.11.0esr-rm.xpi 438025 BLAKE2B 8eb38575780975ad2fa35b8f7471330b1626c6b4c8ac1021bb7e42700846b908f6ca09d70702ad8b91c39d8dffd4984a4b46c1490b9d6ceb2a83c8967c199695 SHA512 710b4e24ac2e7286f4bc376e05031e395abb5a485ef0700e363ea83018648d2658ac0cc6a4fb0c136179d043260f1ece432ae9b6294d35ab937a5127a69d860b
+DIST firefox-140.11.0esr-ro.xpi 452843 BLAKE2B d36fe19e78c884443a1d6be0da019541a47e96b3bf25c3a8d33f3ad7adff91ee1790f199823307f83a4274de5ffee59a2d938b9a8d410e349e9b798e81c178c2 SHA512 11a55e13fd831d4c7c90c52a28b6648c1fbf2a31f114f02ecb5f2c163b75a09e0fa23bb023f136dc19161e49a7e5b5c59e058169477fed07082a7fd36579a7b2
+DIST firefox-140.11.0esr-ru.xpi 525180 BLAKE2B 4b9f9fe21302e6a8bc9566faacd58b893d2ed7fcaaa8797f8e1cc8d2c838298b32cb93a3782776103d6772e0cc4329c516a08b058937ea63d6f0db8c11f4c7ce SHA512 26becb9a236fe5892bd68473bc67f3f21299c628953abeadd94aaa588c0a6753f0615dfdde16b6401feef3399b1b66d5701b11886be224fd1f92db33a885bd9a
+DIST firefox-140.11.0esr-sc.xpi 410465 BLAKE2B dbfd49f68781da0427e111a09bb34419e5d61a348da4e22e341832fc1a272e2f20887934492990d8ce235917167411913d5ddbffdc593da8f022c36ec68a846c SHA512 c6fdf1d3c9db3e07165b55a0453d025199907952cdbf0e8bfbf3ebd126d66ff132f882f9ece16cee414c993b59a5c87eabea1e7db55604e8664edfddd5213a71
+DIST firefox-140.11.0esr-sco.xpi 322643 BLAKE2B ae536d3af5ff27b24096ded46891c7daff1d6eceb9bd5a8e73c189bed81725355eb5aaf0a28e61f0721fad755948e6e50ae835a4a8bff28aea94599ff4aac00f SHA512 b58354c217d7f6e04e3dbc8275a0723f17cce5f1eed010932dee71cbec89fed7664d15549f3e3bd3f135b2d0c86aa36ab13db936b73dc1b6093abfdee863f7dd
+DIST firefox-140.11.0esr-si.xpi 411601 BLAKE2B 3d1135cb37bbe43e102c150cc0805363fbe3af42c544a118eefd26809bc3bbc46f1777a8fd3e364cb163d0d9b66ac46a66d82f81dd290670daf321f4fa46c704 SHA512 4d0e82b8fda455c7350939503cb5d8aeb47e6b5a65e636a2e8701ee9ff2a6def97f3a7c123610a05e5b4bb22606339a79bbcbf15cd2b3d4398d193ba17e89ec5
+DIST firefox-140.11.0esr-sk.xpi 468229 BLAKE2B 2bc3b5669e55cfb8ec50931c987a88a0cad6653153081772b042d205c62d44ecdff7e9899ccf07f58a2c098b34ead4e4e3d1c6f4902a4c7bac4ec43ca4aeaea3 SHA512 42514c1ed7e8c65d4982b77cd724f2530e8a70a2a1b4e41a37763dfd2d0882a7c7276ab3d829ff9024daf02de81acde8e7022d3c45df568f281320df13f41535
+DIST firefox-140.11.0esr-skr.xpi 485866 BLAKE2B e9046769b0d54a03f07524f943062e5c95fd9d9295fec766faa57e08213f0bc375c3237ef04dd0567817d8089776b64cc6636eafdda0e1702f3b9bfb6ab38033 SHA512 0ee94f32f9f54d70bd99f59dd4e55e6d94bd3ecc6df046ecc06ae4004c7196eced84c7d7d6b6905158522ebacb441624ebe8df81fdf0b8c42a99370bd6c0b4a4
+DIST firefox-140.11.0esr-sl.xpi 441203 BLAKE2B edfab4497902999911517276b8a0bb9a0ba63d0b465df5a59f8d2c251fa2a2e75ec75d7ad7e779efa0195f8efd58b55717250f68f0175ef407432a024bf0bc3a SHA512 fc8e60d4afadb912c00d888808b6c88f6d78dcc32e07d2df7c404a9b442213cb8e5ec4fdef6ff20d46b9ca1729833abb5eefb421867b5992929af5fe788cca9c
+DIST firefox-140.11.0esr-son.xpi 273120 BLAKE2B 1355e4fde7766eadaa07316cd01d07922d222836876bc4dee6e68b2f85b75c6358522e22b5714d20b64d2efb0607992e4ddd513fc062e8fd66b31d9fe5690b00 SHA512 ec73b581fcf412a572f6b89161426ebb8ba9255fa969db90b61741f0d49fac19474f7a0fe4a2815e2539ce1232262876274511468b0ae08707e08afc647ff361
+DIST firefox-140.11.0esr-sq.xpi 456016 BLAKE2B 1a7d114367b36c388c8072d6f0e8a42bdebeb7d36b7afd64a8225261b3e71bf690b619e4dd4dc1e5c61afe731355a638fc19ca5405965cb85ac26e534eaefeb4 SHA512 99cf4b4069a8e64c6025bb068dffaf073ad830c921e4b444b19884bc1d69489de910412a5e5d622ac7d610ec69e107d06610d46b96be91fa58f9ce7acc2181e0
+DIST firefox-140.11.0esr-sr.xpi 453371 BLAKE2B 1d0e43c584388c3a3d42e889d68d90a18a92a9da60545af1f819f5090972c2306343f4e07865a6e5558877c27b4e7d9ac2c71454c9166464a192feee70b8048b SHA512 3af1374ce22b523567ae17b753fa4776215f687bc218e2187a1f4d409d2703291e445ae1ac25923b7f4a56bc97c3f56501d007e73736c118a1527278eda838eb
+DIST firefox-140.11.0esr-sv-SE.xpi 436160 BLAKE2B 25d94fe5c0f0a51393a52c087ea91c29f35ef1bf3688a8e7894acef34de149c72feffe6377f9f78a3f8d159a752ad599aa3f67312ebe94a6422cd1b8a5d6e551 SHA512 47b796c7b34dab4a10d61ac040d76f9ca0e2e5338272cf556b6d0a9795e31e0f1932182f87ef9fe6dbabf6f90cd89b4cdd4dbdbebb9e1680fbe204c5f3f4e1f6
+DIST firefox-140.11.0esr-szl.xpi 341681 BLAKE2B 161e2d22b96e59e038f5e91514e68a4a41507983ca1adbb8a1f5fc32fc3d534f5060325f185688de93b9391714a08561b968178d1c2bb60774165738c477a7b6 SHA512 e4abf814708d09a4cff461513f7625481c83a7e2f851add25b62e34cf22473ed1aee37238052e685ea160a9c7052a6f49e2c835dbc7c2cb7214bdd9d8de2fea6
+DIST firefox-140.11.0esr-ta.xpi 338147 BLAKE2B a6d89a39ed5a8aef6b4c27228114edbfea219b4e84f8101770a076e5e7bba81571864029a4913b30d109ad0abf339c190c8a79d979b174f9a6cb6964b232cd05 SHA512 04d5b97b992832572592cd6cfa128cebe5df3990b0c0633dabe72bae3a4078551359a1b72c8ac009d15cdb80d9cf759741e3b59e8d92881afa420c25a275c3ef
+DIST firefox-140.11.0esr-te.xpi 382197 BLAKE2B ff2b0fe75b7873a685d7c7918ce5bf473ccf90eb61bca2c540af6a010b16016fdb6c9b8924dd8648b549f706f8b99a74ac690dba1bebe010caf1f6220e579c72 SHA512 bae2caf00c46cb7846dd1363c83050fa224e5ab05e08cc09d08dd876a0d11137bb366d5c07489fe163ce22ef5bd63c1909828f181a9cfabb741c0145d5106daa
+DIST firefox-140.11.0esr-th.xpi 505495 BLAKE2B ddff0beee6e9b737f7a91cf8087ebdb312afc240382959dadaa5bf4ac221eb7b92c2f07641abd5cb11457380569a0e323b68f5e0fd5c197887d60f4070788cbc SHA512 12fd3bebe0418a2417642e7403eede920ed622cc3c84fad3fcbdec303664ab361b66a5273c21d5b5ee371d48df85884ccd30c908d8d72ac267a941a48c381f17
+DIST firefox-140.11.0esr-tl.xpi 356652 BLAKE2B 1c2cbaa261df51725e6904789226a83df4916292afa5093a2e951e3102b4fd78d57fa9ffb051528a18c816e736e85ffbec76b1b687064c45d4a85dbf69be78b6 SHA512 9e99cb3427b35ed96812c1478bbce594af4e8259a5a0816f8accd877639cd7ff457532fb56c996cb63bb46655005ccb4e1a92e0fafd7fbd6db4a395ec42a392c
+DIST firefox-140.11.0esr-tr.xpi 449314 BLAKE2B 0aca31b306fb5282a3fa77cf25fc0f293835059c8c3b9775eee3993dde2b285bba3eb8b1a75d512ec922e6cb174ef694ce5a8922a59790304eed93424c6462d1 SHA512 450b7c2c441d13512f275f73c7aa5c5ed01b2da4c51a7cd664a2255b72a2d6208db01b423bd3c0f86a2554fcb2a0eae8a50a42e12daf3cb22a02b3489d68f401
+DIST firefox-140.11.0esr-trs.xpi 324523 BLAKE2B 33e03748e0221e77c18662a9ba184a1ec82c283a81e6e55f48ee318062480ff67eb0683ece3dc28c9f4691003405c6467165b9de031f7537b3bc1d0ee27da256 SHA512 4541b8cb11b5c5f448d765a4d2eeadeb5601e6f2e1222a2a56603a734a928a973a47ed814817be145a6e2702d06539985390f60dd390ee552110511b2eabfc4c
+DIST firefox-140.11.0esr-uk.xpi 516731 BLAKE2B 76386e56c09ee21fde90f632167b166ef198ca4b70ee2566aa00afccba8b016b3041361128954717adde6c15018fc2b929b9d3ea9f9290a3b3e9561964d7c553 SHA512 01ac9d3aedafec939a36f24fecd111edda911078b92da6ff7cd68700beda07dee534fbc1b0dfd9baf51e615f32684a642f0fbd422adc2cc853dc65ae64efa421
+DIST firefox-140.11.0esr-ur.xpi 370172 BLAKE2B db5f156918549c174f022ffd6642a195b417bb82ccfe1d68d638a4467335af4d4d6f826353684fb5535e5118b0fdf777e5b7e1230591170133c5e927ab826fd1 SHA512 32d25f6edeeb91a986862852a9ffbc5ee34e97be56503920e87b0d5b8cb5c22f3bbb4e2065ba06f5abea6988a09b2b048581a0902f98ba039c6723635a39ec5c
+DIST firefox-140.11.0esr-uz.xpi 303479 BLAKE2B 469511d7525b093abaa9fec204591a69fb3f3faa96b4089fc4403fd5727cddd0fc40e9f56ce78016a0bb51a660afaef0e8d1bee0e0accfa7fd559529e5babd18 SHA512 d9b034f265496d5487ad48f7b24eb8f68b96d39be7da1611e69b19d0fc4f385b09ce50212b89680e2359824531f69bdd2b41e4c15284e42bb49bbda36da92d34
+DIST firefox-140.11.0esr-vi.xpi 469148 BLAKE2B 2f12a9a947f4926d9cce09289d699eb6aebe84d84ec6414e2168868ee823139a6bf8cbd13072700e14872f87b98b60615a38a333f904983bdaf75f7a785e5169 SHA512 18df2ba2fe89e0bc3c746e743cd5897064a6b81fe00e5b2ca47dd4aa8b60b1e9d0ed65c48f3b4a5ac032e0af68f92a3becfbb63a95656f6d693132c290a41fec
+DIST firefox-140.11.0esr-xh.xpi 272790 BLAKE2B 3fbba37d7f2b6e08ab1bca9eda8cd0d09c5f27e7bd1dd12f1f4e54a9347388e4cb2cef9f174a5d12435a355a99b597a01809861243e26a22e4abca6b858b1290 SHA512 54002d5dc86f4ca1297ba0f04525e3187ca8d79fc1aa711d30c9f82ad5ea2d9f420ac17c44a27a392ac11687dd63293cd9ccf498c98cd8be2b601e7446494e52
+DIST firefox-140.11.0esr-zh-CN.xpi 460700 BLAKE2B 2e0f8f26db2607b4e929cf797810a38e49cec6c57125ddafae834bbb60c68f461aa2324350d0bfbb2eda39cf7d994e6e259577d2a89944cad504797ab66145ee SHA512 4a2135eccbd9453d040e545d02b989a02f4a916c672f46ba964ba75e12b7ad48a2f0c1c9c456fd910be13e901de03be5170c68a1bbc8e4f0d8d409debbb5992b
+DIST firefox-140.11.0esr-zh-TW.xpi 463741 BLAKE2B bc8f6735861320eaf8cfc6b8432c60449d01f019c2f494604fc2c76cb74127f623dec73fde387a3ea220a76d42565169f2a2839f0c338eecd2f29c896a2884ef SHA512 4d0de158ebb8137b6b9c04a41662b2f359e13a7bdd93e9d96c6c137ee540157ea43bcc14a6fc0cc7434b09f3ee0364403978c3ab85eeddf60daf4798d823e464
+DIST firefox-140.11.0esr.source.tar.xz 637083992 BLAKE2B 987913236b1d64cb0a17fa2fe1d8f1d3aa224c1cc4c7a6d0b2d912d2dcca809554de4f03de3ed958ea7b5a52d385c2d4ae0cf7e79b652ddd16d1cff73e947539 SHA512 d06adb3ef4de1324e3d61872d70de31ab08ac013f33903549bed28c6ebcc5b4dee94bb36388282c1935d77d1a564079f3adbf08d6bb80284a899cbb3d861300c
DIST firefox-140esr-patches-09.tar.xz 15300 BLAKE2B aa796bae895114103d2d4aa2dffb1cda234f3f2763ffc5bbc85527430e7457b8dd17c0eced83aa8ecaaeda345a6b558059f5d2fc2e7fc72d7eb36e596386ac5c SHA512 661d2f01215a0bd9b11d69af182b55c18f9b382eea958be1d2be68786feef332a52b9723bf9097677f0cb0e6e65ae8bd80fe24ecd7ffbe5936d9c89a008ec185
DIST firefox-140esr-patches-10.tar.xz 15052 BLAKE2B 1e9f1d401590958422f91d5df98dc2286b76de1cefd279ede23afa9493ec61d4a231873e000ea73bc26cc2433af7a2a6d87f94bc257a2763283b3d3d5e683462 SHA512 8276a3b37424d476f63c4669124120ab310d8a132e4fb82250fec033683456960fb83e31e12860ccb5064268bc72ebabb65b212bba161766832109dbd3d14676
DIST firefox-150-patches-02.tar.xz 13452 BLAKE2B 3c6f1b824f4ac01e97c9b795a5ba62c19dd5cb2115df6d5c7da99d725206f9d10d7f536389e12f0ee18475347693bd270333f4349f1642dda68b5d4be11f2eb2 SHA512 057b2242cfa1cebbe7e4e47b2e51eae3e5a15669d507fbd32cad3fdc80586bbee4b853964ac329cf75751af2e04a66eeccdfd4d2b2aad8c49813582abfc38d47
DIST firefox-150.0.1.source.tar.xz 704237724 BLAKE2B d70920a86e784fe971756604237c1dacba5fc7d9cf346634ac897ea09f7fa92b8b243076fa9d7e98acc0cf79d88b9871145a8878b959e3130ddad5544e6b4b28 SHA512 b3710e1b35002312bf248e822681039b75ec1196f8d014c88b0377c9b06f34780469152a98ad967440a51a4a0ca45418ba6239438f869ae564cc82c023645179
DIST firefox-150.0.2.source.tar.xz 709752320 BLAKE2B 71ceb820171d3cbd4b6a0a13bb081d821b2361a8e5503b967aaa16d676e4f0dd718ce8d6b9b488449b5901d985afe6d21a49297293f97a30431b799092404ee6 SHA512 e22fc66f7faeb9bef4036d0a90af4c27dabc45a3dc59c7290536bfe46c7624d73388d29b36a8999e364065fa31a5fa167596632229b0af9bc1baf4135fa29a4d
DIST firefox-150.0.3.source.tar.xz 709676888 BLAKE2B c167496083203222116cac44d0b58a1931530fa6ca4edc5176466ed82928e4d17859b5c722796b748c08f7f26957183ed8c5ce343fa2f812a7ec9b3d176755a1 SHA512 8452da61200f8ee66790d3fff230ca84b2ac9291af2b57e018486c50f938c53c6fb4943fe6cfe1e99b9783466fb00bf707fa006293753ac698618fc1e3b70a4a
+DIST firefox-151-patches-01.tar.xz 12784 BLAKE2B 3f50f9a6ee6f4a172d5e1ba4cd887a08c4dca38dc35b24c9917505032898215a6b17cd1c6c5590891e9b3b40f2ada5fccdcec0b53992bb1d7b6ee8e53d0b351c SHA512 4afcdde73781edca646b6e7a06d55a94ebee471bf0d3b2a2fca94b511f784071c03cc405178b8f9e624fe296e6e1963f8c59e65094f4723feac725d11eb707ee
+DIST firefox-151.0.1.source.tar.xz 780629964 BLAKE2B 0301741891076331293e13c03ca168d283afc1b257f7bbff32784b23c817b780b84b4afcfa44c37dde65af37a210a4e18fe7e6433a07db718d982f7e91083efa SHA512 8492a1bb956b38373153938bd18b0e18e3a4ad0d2abc2017b45e02bc2768c8f468d5c06329a32485a03a67bb9c22102e6abff1e73080c77764735d430dc77277
+DIST firefox-151.0.2.source.tar.xz 784076112 BLAKE2B 4b5fd2683a2b3aaf85fdf419cef5e4fab3660d623511bc0b3b2f463c04aae075e906309965730df1cd564778fd2d8e9b1262147016b4cd02b922d6952fbe9b03 SHA512 87308953ed354a2799a9a45be40033bf9ff8d80fa220f034aacfbd6e754716901d4164c37fa56032c659b259116603e0ba2b566c1f3651ab9cc0835d502cd739
+DIST firefox-151.0.source.tar.xz 786401788 BLAKE2B 170cd234f7d4256523634c76f424dd460db91e220c6935b34e402befbce5edfaf6d1dba9d0aeb4b45a78b6c0681c8efd6a9c56deeb376305c8cead62da6344ae SHA512 5e6b01236c6aad17889c1d33614637a13e41d659c3306b2dadf13ab50d91a36d1269fae6d405d31351e4defe589f47f31c0798b66ad87438720f5779bcb90401
DIST wasi-sdk-32.0-arm64-linux.tar.gz 142940986 BLAKE2B 45712415f916c2749bac9002157def84f75d005bcac0403cb9b5a814623a1e0c2a2f24092d55478ca5204afa82c7499cabf405b8e5c6e95a514351801da4a91c SHA512 e39f3130290e63a7c2674e8838bd6569ca6a630c0231e2a303d6bd4a6b7f9c78b59a99606193c3ba3e200d93d9221339d23653e98ef720632d54c5c6866dde69
DIST wasi-sdk-32.0-x86_64-linux.tar.gz 143157058 BLAKE2B 62b83e2db70b24361962b392551c604b21c59535b8d34a5e652447d7b722b033327334f0e17381d28eaa6dcb31fb02aad9978c66b761fb592b6de502012aeb57 SHA512 f77c08d1eb0f8e765bed4955d4794b33bb38149df5a144bebbe43e91fce3cfda7210cdf57073c0ff23c1d3c68105b6c69b4782af1643a0be2f3310001a2398f0
diff --git a/www-client/firefox/firefox-140.10.1-r1.ebuild b/www-client/firefox/firefox-140.10.1-r1.ebuild
index 84804ce33e9f..7f651df7a83a 100644
--- a/www-client/firefox/firefox-140.10.1-r1.ebuild
+++ b/www-client/firefox/firefox-140.10.1-r1.ebuild
@@ -14,7 +14,7 @@ RUST_NEEDS_LLVM=1
# If not building with clang we need at least rust 1.76
RUST_MIN_VER=1.82.0
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{12..14} )
PYTHON_REQ_USE="ncurses,sqlite,ssl"
VIRTUALX_REQUIRED="manual"
diff --git a/www-client/firefox/firefox-140.10.2.ebuild b/www-client/firefox/firefox-140.10.2.ebuild
index 150308143fba..6174d05a5ccd 100644
--- a/www-client/firefox/firefox-140.10.2.ebuild
+++ b/www-client/firefox/firefox-140.10.2.ebuild
@@ -14,7 +14,7 @@ RUST_NEEDS_LLVM=1
# If not building with clang we need at least rust 1.76
RUST_MIN_VER=1.82.0
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{12..14} )
PYTHON_REQ_USE="ncurses,sqlite,ssl"
VIRTUALX_REQUIRED="manual"
diff --git a/www-client/firefox/firefox-140.11.0.ebuild b/www-client/firefox/firefox-140.11.0.ebuild
new file mode 100644
index 000000000000..8768d8d4b1a4
--- /dev/null
+++ b/www-client/firefox/firefox-140.11.0.ebuild
@@ -0,0 +1,1422 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+FIREFOX_PATCHSET="firefox-140esr-patches-10.tar.xz"
+FIREFOX_LOONG_PATCHSET="firefox-139-loong-patches-02.tar.xz"
+
+LLVM_COMPAT=( 20 21 )
+
+# This will also filter rust versions that don't match LLVM_COMPAT in the non-clang path; this is fine.
+RUST_NEEDS_LLVM=1
+
+# If not building with clang we need at least rust 1.76
+RUST_MIN_VER=1.82.0
+
+PYTHON_COMPAT=( python3_{12..14} )
+PYTHON_REQ_USE="ncurses,sqlite,ssl"
+
+VIRTUALX_REQUIRED="manual"
+
+# Information about the bundled wasi toolchain from
+# https://github.com/WebAssembly/wasi-sdk/
+WASI_SDK_VER=32.0
+WASI_SDK_LLVM_VER=22
+
+MOZ_ESR=yes
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+ SLOT="esr"
+else
+ HOMEPAGE="https://www.firefox.com"
+ SLOT="rapid"
+fi
+
+MOZ_PN="${PN%-bin}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+inherit check-reqs desktop flag-o-matic gnome2-utils linux-info llvm-r1 multiprocessing \
+ optfeature pax-utils python-any-r1 readme.gentoo-r1 rust toolchain-funcs virtualx xdg
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+if [[ ${PV} == *_rc* ]] ; then
+ MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/candidates/${MOZ_PV}-candidates/build${PV##*_rc}"
+fi
+
+PATCH_URIS=(
+ https://dev.gentoo.org/~juippis/mozilla/patchsets/${FIREFOX_PATCHSET}
+)
+
+DESCRIPTION="Firefox Web Browser"
+SRC_URI="${MOZ_SRC_BASE_URI}/source/${MOZ_P}.source.tar.xz -> ${MOZ_P_DISTFILES}.source.tar.xz
+ ${PATCH_URIS[@]}
+ loong? (
+ https://dev.gentoo.org/~xen0n/distfiles/www-client/${MOZ_PN}/${FIREFOX_LOONG_PATCHSET}
+ )
+ wasm-sandbox? (
+ amd64? ( https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VER/.*/}/wasi-sdk-${WASI_SDK_VER}-x86_64-linux.tar.gz )
+ arm64? ( https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VER/.*/}/wasi-sdk-${WASI_SDK_VER}-arm64-linux.tar.gz )
+ )"
+
+S="${WORKDIR}/${PN}-${PV%_*}"
+LICENSE="MPL-2.0 GPL-2 LGPL-2.1"
+KEYWORDS="amd64 arm64 ~loong ~ppc64 ~riscv ~x86"
+
+IUSE="+clang dbus debug eme-free hardened hwaccel jack libproxy pgo pulseaudio selinux sndio"
+IUSE+=" +system-av1 +system-harfbuzz +system-icu +system-jpeg +system-libevent +system-libvpx"
+IUSE+=" system-pipewire system-png +system-webp test wayland wifi +X"
+
+# Firefox-only IUSE
+IUSE+=" +gmp-autoupdate gnome-shell +jumbo-build openh264 +telemetry wasm-sandbox"
+
+REQUIRED_USE="|| ( X wayland )
+ debug? ( !system-av1 )
+ pgo? ( jumbo-build )
+ wasm-sandbox? ( llvm_slot_21 )
+ wayland? ( dbus )
+ wifi? ( dbus )
+"
+
+RESTRICT="!test? ( test )"
+
+FF_ONLY_DEPEND="!www-client/firefox:0
+ selinux? ( sec-policy/selinux-mozilla )"
+BDEPEND="${PYTHON_DEPS}
+ $(llvm_gen_dep '
+ llvm-core/clang:${LLVM_SLOT}
+ llvm-core/llvm:${LLVM_SLOT}
+ clang? (
+ llvm-core/lld:${LLVM_SLOT}
+ pgo? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[profile] )
+ )
+ wasm-sandbox? ( llvm-core/lld:${LLVM_SLOT} )
+ ')
+ app-alternatives/awk
+ app-arch/unzip
+ app-arch/zip
+ >=dev-util/cbindgen-0.27.0
+ net-libs/nodejs
+ virtual/pkgconfig
+ amd64? ( >=dev-lang/nasm-2.14 )
+ x86? ( >=dev-lang/nasm-2.14 )
+ pgo? (
+ X? (
+ sys-devel/gettext
+ x11-base/xorg-server[xvfb]
+ x11-apps/xhost
+ )
+ !X? (
+ gui-wm/tinywl
+ x11-misc/xkeyboard-config
+ )
+ )"
+COMMON_DEPEND="${FF_ONLY_DEPEND}
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ dev-libs/glib:2
+ dev-libs/libffi:=
+ >=dev-libs/nss-3.112.5
+ >=dev-libs/nspr-4.36
+ media-libs/alsa-lib
+ media-libs/fontconfig
+ media-libs/freetype
+ media-libs/mesa
+ media-video/ffmpeg
+ virtual/zlib:=
+ virtual/freedesktop-icon-theme
+ x11-libs/cairo
+ x11-libs/gdk-pixbuf:2
+ x11-libs/libdrm
+ x11-libs/pango
+ x11-libs/pixman
+ dbus? (
+ sys-apps/dbus
+ )
+ jack? ( virtual/jack )
+ pulseaudio? (
+ || (
+ media-libs/libpulse
+ >=media-sound/apulse-0.1.12-r4[sdk]
+ )
+ )
+ libproxy? ( net-libs/libproxy )
+ selinux? ( sec-policy/selinux-mozilla )
+ sndio? ( >=media-sound/sndio-1.8.0-r1 )
+ system-av1? (
+ >=media-libs/dav1d-1.0.0:=
+ >=media-libs/libaom-3.10.0:=
+ )
+ system-harfbuzz? (
+ >=media-libs/harfbuzz-2.8.1:0=
+ !wasm-sandbox? ( >=media-gfx/graphite2-1.3.13 )
+ )
+ system-icu? ( >=dev-libs/icu-76.1:= )
+ system-jpeg? ( >=media-libs/libjpeg-turbo-1.2.1:= )
+ system-libevent? ( >=dev-libs/libevent-2.1.12:0=[threads(+)] )
+ system-libvpx? ( >=media-libs/libvpx-1.8.2:0=[postproc] )
+ system-pipewire? ( >=media-video/pipewire-1.4.7-r2:= )
+ system-png? ( >=media-libs/libpng-1.6.58:0=[apng] )
+ system-webp? ( >=media-libs/libwebp-1.1.0:0= )
+ wayland? (
+ >=media-libs/libepoxy-1.5.10-r1
+ x11-libs/gtk+:3[wayland]
+ )
+ wifi? (
+ kernel_linux? (
+ || (
+ net-misc/networkmanager
+ net-misc/connman[networkmanager]
+ )
+ sys-apps/dbus
+ )
+ )
+ X? (
+ virtual/opengl
+ x11-libs/cairo[X]
+ x11-libs/gtk+:3[X]
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXrandr
+ x11-libs/libxcb:=
+ )"
+RDEPEND="${COMMON_DEPEND}
+ hwaccel? (
+ media-video/libva-utils
+ sys-apps/pciutils
+ )
+ jack? ( virtual/jack )
+ openh264? ( media-libs/openh264:*[plugin] )"
+DEPEND="${COMMON_DEPEND}
+ X? (
+ x11-base/xorg-proto
+ x11-libs/libICE
+ x11-libs/libSM
+ )"
+
+# ESR and rapid dependencies.
+if [[ -n ${MOZ_ESR} ]] ; then
+ RDEPEND+=" !www-client/firefox:rapid"
+else
+ RDEPEND+=" !www-client/firefox:esr"
+fi
+
+# Allow MOZ_GMP_PLUGIN_LIST to be set in an eclass or
+# overridden in the enviromnent (advanced hackers only)
+if [[ -z "${MOZ_GMP_PLUGIN_LIST+set}" ]] ; then
+ MOZ_GMP_PLUGIN_LIST=( gmp-gmpopenh264 gmp-widevinecdm )
+fi
+
+llvm_check_deps() {
+ if ! has_version -b "llvm-core/clang:${LLVM_SLOT}" ; then
+ einfo "llvm-core/clang:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+
+ if use clang && ! tc-ld-is-mold ; then
+ if ! has_version -b "llvm-core/lld:${LLVM_SLOT}" ; then
+ einfo "llvm-core/lld:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+ fi
+
+ if use pgo ; then
+ if ! has_version -b "=llvm-runtimes/compiler-rt-sanitizers-${LLVM_SLOT}*[profile]" ; then
+ einfo "=llvm-runtimes/compiler-rt-sanitizers-${LLVM_SLOT}*[profile] is missing!" >&2
+ einfo "Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+ fi
+
+ einfo "Using LLVM slot ${LLVM_SLOT} to build" >&2
+}
+
+MOZ_LANGS=(
+ af ar ast be bg br ca cak cs cy da de dsb
+ el en-CA en-GB en-US es-AR es-ES et eu
+ fi fr fy-NL ga-IE gd gl he hr hsb hu
+ id is it ja ka kab kk ko lt lv ms nb-NO nl nn-NO
+ pa-IN pl pt-BR pt-PT rm ro ru
+ sk sl sq sr sv-SE th tr uk uz vi zh-CN zh-TW
+)
+
+# Firefox-only LANGS
+MOZ_LANGS+=( ach )
+MOZ_LANGS+=( an )
+MOZ_LANGS+=( az )
+MOZ_LANGS+=( bn )
+MOZ_LANGS+=( bs )
+MOZ_LANGS+=( ca-valencia )
+MOZ_LANGS+=( eo )
+MOZ_LANGS+=( es-CL )
+MOZ_LANGS+=( es-MX )
+MOZ_LANGS+=( fa )
+MOZ_LANGS+=( ff )
+MOZ_LANGS+=( fur )
+MOZ_LANGS+=( gn )
+MOZ_LANGS+=( gu-IN )
+MOZ_LANGS+=( hi-IN )
+MOZ_LANGS+=( hy-AM )
+MOZ_LANGS+=( ia )
+MOZ_LANGS+=( km )
+MOZ_LANGS+=( kn )
+MOZ_LANGS+=( lij )
+MOZ_LANGS+=( mk )
+MOZ_LANGS+=( mr )
+MOZ_LANGS+=( my )
+MOZ_LANGS+=( ne-NP )
+MOZ_LANGS+=( oc )
+MOZ_LANGS+=( sc )
+MOZ_LANGS+=( sco )
+MOZ_LANGS+=( si )
+MOZ_LANGS+=( skr )
+MOZ_LANGS+=( son )
+MOZ_LANGS+=( szl )
+MOZ_LANGS+=( ta )
+MOZ_LANGS+=( te )
+MOZ_LANGS+=( tl )
+MOZ_LANGS+=( trs )
+MOZ_LANGS+=( ur )
+MOZ_LANGS+=( xh )
+
+mozilla_set_globals() {
+ # https://bugs.gentoo.org/587334
+ local MOZ_TOO_REGIONALIZED_FOR_L10N=(
+ fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE
+ )
+
+ local lang xflag
+ for lang in "${MOZ_LANGS[@]}" ; do
+ # en and en_US are handled internally
+ if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then
+ continue
+ fi
+
+ # strip region subtag if $lang is in the list
+ if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then
+ xflag=${lang%%-*}
+ else
+ xflag=${lang}
+ fi
+
+ SRC_URI+=" l10n_${xflag/[_@]/-}? ("
+ SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi"
+ SRC_URI+=" )"
+ IUSE+=" l10n_${xflag/[_@]/-}"
+ done
+}
+mozilla_set_globals
+
+moz_clear_vendor_checksums() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -ne 1 ]] ; then
+ die "${FUNCNAME} requires exact one argument"
+ fi
+
+ einfo "Clearing cargo checksums for ${1} ..."
+
+ sed -i \
+ -e 's/\("files":{\)[^}]*/\1/' \
+ "${S}"/third_party/rust/${1}/.cargo-checksum.json || die
+}
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+mozconfig_add_options_ac() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local reason=${1}
+ shift
+
+ local option
+ for option in ${@} ; do
+ echo "ac_add_options ${option} # ${reason}" >>${MOZCONFIG}
+ done
+}
+
+mozconfig_add_options_mk() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local reason=${1}
+ shift
+
+ local option
+ for option in ${@} ; do
+ echo "mk_add_options ${option} # ${reason}" >>${MOZCONFIG}
+ done
+}
+
+mozconfig_use_enable() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 1 ]] ; then
+ die "${FUNCNAME} requires at least one arguments"
+ fi
+
+ local flag=$(use_enable "${@}")
+ mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}"
+}
+
+mozconfig_use_with() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 1 ]] ; then
+ die "${FUNCNAME} requires at least one arguments"
+ fi
+
+ local flag=$(use_with "${@}")
+ mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}"
+}
+
+virtwl() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ [[ $# -lt 1 ]] && die "${FUNCNAME} needs at least one argument"
+ [[ -n $XDG_RUNTIME_DIR ]] || die "${FUNCNAME} needs XDG_RUNTIME_DIR to be set; try xdg_environment_reset"
+ tinywl -h >/dev/null || die 'tinywl -h failed'
+
+ local VIRTWL VIRTWL_PID
+ coproc VIRTWL { WLR_BACKENDS=headless exec tinywl -s 'echo $WAYLAND_DISPLAY; read _; kill $PPID'; }
+ local -x WAYLAND_DISPLAY
+ read WAYLAND_DISPLAY <&${VIRTWL[0]}
+
+ debug-print "${FUNCNAME}: $@"
+ "$@"
+ local r=$?
+
+ [[ -n $VIRTWL_PID ]] || die "tinywl exited unexpectedly"
+ exec {VIRTWL[0]}<&- {VIRTWL[1]}>&-
+ return $r
+}
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]] ; then
+ # Ensure we have enough disk space to compile
+ if use pgo || use debug ; then
+ CHECKREQS_DISK_BUILD="17000M"
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -ge 16 && [[ -z "${I_KNOW_WHAT_I_AM_DOING}" ]] ; then
+ eerror "Firefox-140esr can't be compiled with +pgo using gcc >= 16. Use:"
+ eerror " 1) gcc < 16 instead, such as stable gcc-15.2.1,"
+ eerror " 2) \"clang\" use flag to compile Firefox-140esr, or"
+ eerror " 3) disable pgo via \"-pgo\" use flag."
+ eerror "Everything else works with gcc-16 except +pgo."
+ eerror ""
+ eerror "Follow Gentoo bug #975851 or upstream bug #2041879 for progress."
+ eerror "To skip this check for testing purposes, export I_KNOW_WHAT_I_AM_DOING=1 env."
+ die "Firefox-${PV} with gcc+pgo cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ elif tc-is-lto ; then
+ CHECKREQS_DISK_BUILD="9900M"
+ else
+ CHECKREQS_DISK_BUILD="9000M"
+ fi
+
+ check-reqs_pkg_pretend
+ fi
+}
+
+pkg_setup() {
+
+ # Get LTO from environment; export after this phase for use in src_configure (etc)
+ use_lto=no
+
+ if [[ ${MERGE_TYPE} != binary ]] ; then
+
+ if tc-is-lto; then
+ use_lto=yes
+ # LTO is handled via configure
+ filter-lto
+ fi
+
+ if use pgo ; then
+ if ! has userpriv ${FEATURES} ; then
+ eerror "Building ${PN} with USE=pgo and FEATURES=-userpriv is not supported!"
+ fi
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -ge 16 && [[ -z "${I_KNOW_WHAT_I_AM_DOING}" ]] ; then
+ eerror "Firefox-140esr can't be compiled with +pgo using gcc >= 16. Use:"
+ eerror " 1) gcc < 16 instead, such as stable gcc-15.2.1,"
+ eerror " 2) \"clang\" use flag to compile Firefox-140esr, or"
+ eerror " 3) disable pgo via \"-pgo\" use flag."
+ eerror "Everything else works with gcc-16, but +pgo doesn't."
+ eerror ""
+ eerror "Follow Gentoo bug #975851 or upstream bug #2041879 to follow progress."
+ eerror "To skip this check for testing purposes, export I_KNOW_WHAT_I_AM_DOING=1 env."
+ die "Firefox-${PV} with gcc+pgo cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ fi
+
+ if [[ ${use_lto} = yes ]]; then
+ # -Werror=lto-type-mismatch -Werror=odr are going to fail with GCC,
+ # bmo#1516758, bgo#942288
+ filter-flags -Werror=lto-type-mismatch -Werror=odr
+ fi
+
+ # Ensure we have enough disk space to compile
+ if use pgo || use debug ; then
+ CHECKREQS_DISK_BUILD="17000M"
+ elif [[ ${use_lto} == "yes" ]] ; then
+ CHECKREQS_DISK_BUILD="9900M"
+ else
+ CHECKREQS_DISK_BUILD="9000M"
+ fi
+
+ check-reqs_pkg_setup
+ llvm-r1_pkg_setup
+ rust_pkg_setup
+ python-any-r1_pkg_setup
+
+ # Avoid PGO profiling problems due to enviroment leakage
+ # These should *always* be cleaned up anyway
+ unset \
+ DBUS_SESSION_BUS_ADDRESS \
+ DISPLAY \
+ ORBIT_SOCKETDIR \
+ SESSION_MANAGER \
+ XAUTHORITY \
+ XDG_CACHE_HOME \
+ XDG_SESSION_COOKIE
+
+ # Build system is using /proc/self/oom_score_adj, bug #604394
+ addpredict /proc/self/oom_score_adj
+
+ if use pgo ; then
+ # Update 105.0: "/proc/self/oom_score_adj" isn't enough anymore with pgo, but not sure
+ # whether that's due to better OOM handling by Firefox (bmo#1771712), or portage
+ # (PORTAGE_SCHEDULING_POLICY) update...
+ addpredict /proc
+
+ # Clear tons of conditions, since PGO is hardware-dependant.
+ addpredict /dev
+ fi
+
+ if ! mountpoint -q /dev/shm ; then
+ # If /dev/shm is not available, configure is known to fail with
+ # a traceback report referencing /usr/lib/pythonN.N/multiprocessing/synchronize.py
+ ewarn "/dev/shm is not mounted -- expect build failures!"
+ fi
+
+ # Google API keys (see http://www.chromium.org/developers/how-tos/api-keys)
+ # Note: These are for Gentoo Linux use ONLY. For your own distribution, please
+ # get your own set of keys.
+ if [[ -z "${MOZ_API_KEY_GOOGLE+set}" ]] ; then
+ MOZ_API_KEY_GOOGLE="AIzaSyDEAOvatFogGaPi0eTgsV_ZlEzx0ObmepsMzfAc"
+ fi
+
+ if [[ -z "${MOZ_API_KEY_LOCATION+set}" ]] ; then
+ MOZ_API_KEY_LOCATION="AIzaSyB2h2OuRgGaPicUgy5N-5hsZqiPW6sH3n_rptiQ"
+ fi
+
+ # Mozilla API keys (see https://location.services.mozilla.com/api)
+ # Note: These are for Gentoo Linux use ONLY. For your own distribution, please
+ # get your own set of keys.
+ if [[ -z "${MOZ_API_KEY_MOZILLA+set}" ]] ; then
+ MOZ_API_KEY_MOZILLA="edb3d487-3a84-46m0ap1e3-9dfd-92b5efaaa005"
+ fi
+
+ # Ensure we use C locale when building, bug #746215
+ export LC_ALL=C
+ fi
+
+ export use_lto
+
+ CONFIG_CHECK="~SECCOMP"
+ WARNING_SECCOMP="CONFIG_SECCOMP not set! This system will be unable to play DRM-protected content."
+ linux-info_pkg_setup
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ unpack ${_src_file}
+ fi
+ done
+}
+
+src_prepare() {
+ if [[ ${use_lto} == "yes" ]]; then
+ rm -v "${WORKDIR}"/firefox-patches/*-LTO-Only-enable-LTO-*.patch || die
+ fi
+
+ # Workaround for bgo#915651 on musl
+ if use elibc_glibc ; then
+ rm -v "${WORKDIR}"/firefox-patches/*bgo-748849-RUST_TARGET_override.patch || die
+ fi
+
+ eapply "${WORKDIR}/firefox-patches"
+ use loong && eapply "${WORKDIR}/firefox-loong-patches"
+
+ # ICU's subslot change should trigger rebuild on Firefox if it is updated 77->78.
+ if use system-icu && has_version ">=dev-libs/icu-78.1" ; then
+ eapply "${FILESDIR}/firefox-146.0.1-icu78.patch" # bgo#967261
+ fi
+
+ # Allow user to apply any additional patches without modifing ebuild
+ eapply_user
+
+ # Make cargo respect MAKEOPTS
+ export CARGO_BUILD_JOBS="$(makeopts_jobs)"
+
+ # Workaround for bgo#915651
+ if ! use elibc_glibc ; then
+ if use amd64 ; then
+ export RUST_TARGET="x86_64-unknown-linux-musl"
+ elif use x86 ; then
+ export RUST_TARGET="i686-unknown-linux-musl"
+ elif use arm64 ; then
+ export RUST_TARGET="aarch64-unknown-linux-musl"
+ elif use loong; then
+ # Only the LP64D ABI of LoongArch64 is actively supported among
+ # the wider Linux ecosystem, so the assumption is safe.
+ export RUST_TARGET="loongarch64-unknown-linux-musl"
+ elif use ppc64 ; then
+ export RUST_TARGET="powerpc64le-unknown-linux-musl"
+ elif use riscv ; then
+ # We can pretty safely rule out any 32-bit riscvs, but 64-bit riscvs also have tons of
+ # different ABIs available. riscv64gc-unknown-linux-musl seems to be the best working
+ # guess right now though.
+ elog "riscv detected, forcing a riscv64 target for now."
+ export RUST_TARGET="riscv64gc-unknown-linux-musl"
+ else
+ die "Unknown musl chost, please post a new bug with your rustc -vV along with emerge --info"
+ fi
+ fi
+
+ # Pre-built wasm-sandbox path manipulation.
+ if use wasm-sandbox ; then
+ if use amd64 ; then
+ export wasi_arch="x86_64"
+ elif use arm64 ; then
+ export wasi_arch="arm64"
+ else
+ die "wasm-sandbox enabled on unknown/unsupported arch!"
+ fi
+
+ sed -i \
+ -e "s:%%PORTAGE_WORKDIR%%:${WORKDIR}:" \
+ -e "s:%%WASI_ARCH%%:${wasi_arch}:" \
+ -e "s:%%WASI_SDK_VER%%:${WASI_SDK_VER}:" \
+ -e "s:%%WASI_SDK_LLVM_VER%%:${WASI_SDK_LLVM_VER}:" \
+ toolkit/moz.configure || die "Failed to update wasi-related paths."
+ fi
+
+ # Make LTO respect MAKEOPTS
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/build/moz.configure/lto-pgo.configure || die "Failed sedding multiprocessing.cpu_count"
+
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/third_party/chromium/build/toolchain/get_cpu_count.py || die "Failed sedding multiprocessing.cpu_count"
+
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/third_party/python/gyp/pylib/gyp/input.py || die "Failed sedding multiprocessing.cpu_count"
+
+ # sed-in toolchain prefix
+ sed -i \
+ -e "s/objdump/${CHOST}-objdump/" \
+ "${S}"/python/mozbuild/mozbuild/configure/check_debug_ranges.py || die "sed failed to set toolchain prefix"
+
+ sed -i \
+ -e 's/ccache_stats = None/return None/' \
+ "${S}"/python/mozbuild/mozbuild/controller/building.py || die "sed failed to disable ccache stats call"
+
+ einfo "Removing pre-built binaries ..."
+
+ find "${S}"/third_party -type f \( -name '*.so' -o -name '*.o' \) -print -delete || die
+
+ # Clear checksums from cargo crates we've manually patched.
+ # moz_clear_vendor_checksums xyz
+ # glslopt: bgo#969412
+ moz_clear_vendor_checksums glslopt
+
+ # Respect choice for "jumbo-build"
+ # Changing the value for FILES_PER_UNIFIED_FILE may not work, see #905431
+ if [[ -n ${FILES_PER_UNIFIED_FILE} ]] && use jumbo-build; then
+ local my_files_per_unified_file=${FILES_PER_UNIFIED_FILE:=16}
+ elog ""
+ elog "jumbo-build defaults modified to ${my_files_per_unified_file}."
+ elog "if you get a build failure, try undefining FILES_PER_UNIFIED_FILE,"
+ elog "if that fails try -jumbo-build before opening a bug report."
+ elog ""
+
+ sed -i -e "s/\"FILES_PER_UNIFIED_FILE\", 16/\"FILES_PER_UNIFIED_FILE\", "${my_files_per_unified_file}"/" \
+ python/mozbuild/mozbuild/frontend/data.py ||
+ die "Failed to adjust FILES_PER_UNIFIED_FILE in python/mozbuild/mozbuild/frontend/data.py"
+ sed -i -e "s/FILES_PER_UNIFIED_FILE = 6/FILES_PER_UNIFIED_FILE = "${my_files_per_unified_file}"/" \
+ js/src/moz.build ||
+ die "Failed to adjust FILES_PER_UNIFIED_FILE in js/src/moz.build"
+ fi
+
+ # Create build dir
+ BUILD_DIR="${WORKDIR}/${PN}_build"
+ mkdir -p "${BUILD_DIR}" || die
+
+ # Write API keys to disk
+ echo -n "${MOZ_API_KEY_GOOGLE//gGaPi/}" > "${S}"/api-google.key || die
+ echo -n "${MOZ_API_KEY_LOCATION//gGaPi/}" > "${S}"/api-location.key || die
+ echo -n "${MOZ_API_KEY_MOZILLA//m0ap1/}" > "${S}"/api-mozilla.key || die
+
+ xdg_environment_reset
+}
+
+src_configure() {
+ # Show flags set at the beginning
+ einfo "Current BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}"
+ einfo "Current CFLAGS:\t\t${CFLAGS:-no value set}"
+ einfo "Current CXXFLAGS:\t\t${CXXFLAGS:-no value set}"
+ einfo "Current LDFLAGS:\t\t${LDFLAGS:-no value set}"
+ einfo "Current RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}"
+
+ local have_switched_compiler=
+ if use clang; then
+ # Force clang
+ einfo "Enforcing the use of clang due to USE=clang ..."
+
+ local version_clang=$(clang --version 2>/dev/null | grep -F -- 'clang version' | awk '{ print $3 }')
+ [[ -n ${version_clang} ]] && version_clang=$(ver_cut 1 "${version_clang}")
+ [[ -z ${version_clang} ]] && die "Failed to read clang version!"
+
+ if tc-is-gcc; then
+ have_switched_compiler=yes
+ fi
+
+ AR=llvm-ar
+ CC=${CHOST}-clang-${version_clang}
+ CXX=${CHOST}-clang++-${version_clang}
+ NM=llvm-nm
+ RANLIB=llvm-ranlib
+ elif ! use clang && ! tc-is-gcc ; then
+ # Force gcc
+ have_switched_compiler=yes
+ einfo "Enforcing the use of gcc due to USE=-clang ..."
+ AR=gcc-ar
+ CC=${CHOST}-gcc
+ CXX=${CHOST}-g++
+ NM=gcc-nm
+ RANLIB=gcc-ranlib
+ fi
+
+ if [[ -n "${have_switched_compiler}" ]] ; then
+ # Because we switched active compiler we have to ensure
+ # that no unsupported flags are set
+ strip-unsupported-flags
+ fi
+
+ # Ensure we use correct toolchain,
+ # AS is used in a non-standard way by upstream, #bmo1654031
+ export HOST_CC="$(tc-getBUILD_CC)"
+ export HOST_CXX="$(tc-getBUILD_CXX)"
+ export AS="$(tc-getCC) -c"
+
+ # Configuration tests expect llvm-readelf output, bug 913130
+ READELF="llvm-readelf"
+
+ tc-export CC CXX LD AR AS NM OBJDUMP RANLIB READELF PKG_CONFIG
+
+ # Pass the correct toolchain paths through cbindgen
+ if tc-is-cross-compiler ; then
+ export BINDGEN_CFLAGS="${SYSROOT:+--sysroot=${ESYSROOT}} --target=${CHOST} ${BINDGEN_CFLAGS-}"
+ fi
+
+ # Set MOZILLA_FIVE_HOME
+ export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${PN}"
+
+ # python/mach/mach/mixin/process.py fails to detect SHELL
+ export SHELL="${EPREFIX}/bin/bash"
+
+ # Set state path
+ export MOZBUILD_STATE_PATH="${BUILD_DIR}"
+
+ # Set MOZCONFIG
+ export MOZCONFIG="${S}/.mozconfig"
+
+ # Initialize MOZCONFIG
+ mozconfig_add_options_ac '' --enable-application=browser
+ mozconfig_add_options_ac '' --enable-project=browser
+
+ # Set Gentoo defaults
+ if use telemetry; then
+ export MOZILLA_OFFICIAL=1
+ fi
+
+ mozconfig_add_options_ac 'Gentoo default' \
+ --allow-addon-sideload \
+ --disable-cargo-incremental \
+ --disable-crashreporter \
+ --disable-disk-remnant-avoidance \
+ --disable-geckodriver \
+ --disable-install-strip \
+ --disable-legacy-profile-creation \
+ --disable-parental-controls \
+ --disable-strip \
+ --disable-updater \
+ --disable-wmf \
+ --enable-negotiateauth \
+ --enable-new-pass-manager \
+ --enable-official-branding \
+ --enable-packed-relative-relocs \
+ --enable-release \
+ --enable-system-policies \
+ --host="${CBUILD:-${CHOST}}" \
+ --libdir="${EPREFIX}/usr/$(get_libdir)" \
+ --prefix="${EPREFIX}/usr" \
+ --target="${CHOST}" \
+ --without-ccache \
+ --with-intl-api \
+ --with-libclang-path="$(llvm-config --libdir)" \
+ --with-system-ffi \
+ --with-system-gbm \
+ --with-system-libdrm \
+ --with-system-nspr \
+ --with-system-nss \
+ --with-system-pixman \
+ --with-system-zlib \
+ --with-toolchain-prefix="${CHOST}-" \
+ --with-unsigned-addon-scopes=app,system
+
+ # Set update channel
+ local update_channel=release
+ [[ -n ${MOZ_ESR} ]] && update_channel=esr
+ mozconfig_add_options_ac '' --enable-update-channel=${update_channel}
+
+ # Whitelist to allow unkeyworded arches to build with "--disable-rust-simd" by default.
+ if use amd64 || use arm64 || use ppc64 || use loong || use riscv ; then
+ mozconfig_add_options_ac '' --enable-rust-simd
+ fi
+
+ # For future keywording: This is currently (97.0) only supported on:
+ # amd64, arm, arm64 & x86.
+ # Might want to flip the logic around if Firefox is to support more arches.
+ # bug 833001, bug 903411#c8
+ if use loong || use ppc64 || use riscv; then
+ mozconfig_add_options_ac '' --disable-sandbox
+ else
+ mozconfig_add_options_ac '' --enable-sandbox
+ fi
+
+ # riscv-related options, bgo#947337, bgo#947338
+ if use riscv ; then
+ mozconfig_add_options_ac 'Disable JIT for RISC-V 64' --disable-jit
+ mozconfig_add_options_ac 'Disable webrtc for RISC-V' --disable-webrtc
+ fi
+
+ if [[ -s "${S}/api-google.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-google.key" | md5sum | awk '{ print $1 }') != 709560c02f94b41f9ad2c49207be6c54 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-google-safebrowsing-api-keyfile="${S}/api-google.key"
+ else
+ einfo "Building without Google API key ..."
+ fi
+
+ if [[ -s "${S}/api-location.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-location.key" | md5sum | awk '{ print $1 }') != ffb7895e35dedf832eb1c5d420ac7420 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-google-location-service-api-keyfile="${S}/api-location.key"
+ else
+ einfo "Building without Location API key ..."
+ fi
+
+ if [[ -s "${S}/api-mozilla.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-mozilla.key" | md5sum | awk '{ print $1 }') != 3927726e9442a8e8fa0e46ccc39caa27 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-mozilla-api-keyfile="${S}/api-mozilla.key"
+ else
+ einfo "Building without Mozilla API key ..."
+ fi
+
+ mozconfig_use_with system-av1
+ mozconfig_use_with system-harfbuzz
+ mozconfig_use_with system-icu
+ mozconfig_use_with system-jpeg
+ mozconfig_use_with system-libevent
+ mozconfig_use_with system-libvpx
+ mozconfig_use_with system-pipewire
+ mozconfig_use_with system-png
+ mozconfig_use_with system-webp
+
+ mozconfig_use_enable dbus
+ mozconfig_use_enable libproxy
+
+ use eme-free && mozconfig_add_options_ac '+eme-free' --disable-eme
+
+ if use hardened ; then
+ mozconfig_add_options_ac "+hardened" --enable-hardening
+ append-ldflags "-Wl,-z,relro -Wl,-z,now"
+
+ # Increase the FORTIFY_SOURCE value, #910071.
+ sed -i -e '/-D_FORTIFY_SOURCE=/s:2:3:' "${S}"/build/moz.configure/toolchain.configure || die
+ fi
+
+ local myaudiobackends=""
+ use jack && myaudiobackends+="jack,"
+ use sndio && myaudiobackends+="sndio,"
+ use pulseaudio && myaudiobackends+="pulseaudio,"
+ ! use pulseaudio && myaudiobackends+="alsa,"
+
+ mozconfig_add_options_ac '--enable-audio-backends' --enable-audio-backends="${myaudiobackends::-1}"
+
+ mozconfig_use_enable wifi necko-wifi
+
+ ! use jumbo-build && mozconfig_add_options_ac '--disable-unified-build' --disable-unified-build
+
+ if use X && use wayland ; then
+ mozconfig_add_options_ac '+x11+wayland' --enable-default-toolkit=cairo-gtk3-x11-wayland
+ elif ! use X && use wayland ; then
+ mozconfig_add_options_ac '+wayland' --enable-default-toolkit=cairo-gtk3-wayland-only
+ else
+ mozconfig_add_options_ac '+x11' --enable-default-toolkit=cairo-gtk3-x11-only
+ fi
+
+ # wasm-sandbox
+ # Since graphite2 is one of the sandboxed libraries, system-graphite2 obviously can't work with +wasm-sandbox.
+ if use wasm-sandbox ; then
+ mozconfig_add_options_ac '+wasm-sandbox' --with-wasi-sysroot="${WORKDIR}/wasi-sdk-${WASI_SDK_VER}-${wasi_arch}-linux/share/wasi-sysroot/"
+ else
+ mozconfig_add_options_ac 'no wasm-sandbox' --without-wasm-sandboxed-libraries
+ mozconfig_use_with system-harfbuzz system-graphite2
+ fi
+
+ if [[ ${use_lto} == "yes" ]] ; then
+ if use clang ; then
+ # Upstream only supports lld or mold when using clang.
+ if tc-ld-is-mold ; then
+ # mold expects the -flto line from *FLAGS configuration, bgo#923119
+ append-ldflags "-flto=thin"
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "forcing ld=lld due to USE=clang and USE=lto" --enable-linker=lld
+ fi
+
+ mozconfig_add_options_ac '+lto' --enable-lto=cross
+
+ else
+ # ThinLTO is currently broken, see bmo#1644409.
+ # mold does not support gcc+lto combination.
+ mozconfig_add_options_ac '+lto' --enable-lto=full
+ mozconfig_add_options_ac "linker is set to bfd" --enable-linker=bfd
+ fi
+
+ else
+ # Avoid auto-magic on linker
+ if use clang ; then
+ # lld is upstream's default
+ if tc-ld-is-mold ; then
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "forcing ld=lld due to USE=clang" --enable-linker=lld
+ fi
+
+ else
+ if tc-ld-is-mold ; then
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "linker is set to bfd due to USE=-clang" --enable-linker=bfd
+ fi
+ fi
+ fi
+
+ # PGO was moved outside lto block to allow building pgo without lto.
+ if use pgo ; then
+ mozconfig_add_options_ac '+pgo' MOZ_PGO=1
+
+ # Avoid compressing just-built instrumented Firefox with
+ # high levels of compression. Just use tar as a container
+ # to save >=10 minutes.
+ export MOZ_PKG_FORMAT=tar
+
+ if use clang ; then
+ # Used in build/pgo/profileserver.py
+ export LLVM_PROFDATA="llvm-profdata"
+ fi
+ fi
+
+ mozconfig_use_enable debug
+ if use debug ; then
+ mozconfig_add_options_ac '+debug' --disable-optimize
+ mozconfig_add_options_ac '+debug' --enable-jemalloc
+ mozconfig_add_options_ac '+debug' --enable-real-time-tracing
+ else
+ mozconfig_add_options_ac 'Gentoo defaults' --disable-real-time-tracing
+
+ if is-flag '-g*' ; then
+ if use clang ; then
+ mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols=$(get-flag '-g*')
+ else
+ mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols
+ fi
+ else
+ mozconfig_add_options_ac 'Gentoo default' --disable-debug-symbols
+ fi
+
+ if is-flag '-O0' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O0
+ elif is-flag '-O4' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O4
+ elif is-flag '-O3' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O3
+ elif is-flag '-O1' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O1
+ elif is-flag '-Os' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-Os
+ else
+ mozconfig_add_options_ac "Gentoo default" --enable-optimize=-O2
+ fi
+ fi
+
+ # Debug flag was handled via configure
+ filter-flags '-g*'
+
+ # Optimization flag was handled via configure
+ filter-flags '-O*'
+
+ # elf-hack
+ # Filter "-z,pack-relative-relocs" and let the build system handle it instead.
+ if use amd64 || use x86 ; then
+ filter-flags "-z,pack-relative-relocs"
+
+ if tc-ld-is-mold ; then
+ # relr-elf-hack is currently broken with mold, bgo#916259
+ mozconfig_add_options_ac 'disable elf-hack with mold linker' --disable-elf-hack
+ else
+ mozconfig_add_options_ac 'relr elf-hack' --enable-elf-hack=relr
+ fi
+ elif use loong || use ppc64 || use riscv ; then
+ # '--disable-elf-hack' is not recognized on loong/ppc64/riscv,
+ # see bgo #917049, #930046
+ :;
+ else
+ mozconfig_add_options_ac 'disable elf-hack on non-supported arches' --disable-elf-hack
+ fi
+
+ if ! use elibc_glibc; then
+ mozconfig_add_options_ac '!elibc_glibc' --disable-jemalloc
+ fi
+
+ # System-av1 fix
+ use system-av1 && append-ldflags "-Wl,--undefined-version"
+
+ # Make revdep-rebuild.sh happy; Also required for musl
+ append-ldflags -Wl,-rpath="${MOZILLA_FIVE_HOME}",--enable-new-dtags
+
+ # Pass $MAKEOPTS to build system
+ export MOZ_MAKE_FLAGS="${MAKEOPTS}"
+
+ # Use system's Python environment
+ export PIP_NETWORK_INSTALL_RESTRICTED_VIRTUALENVS=mach
+
+ export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE="none"
+
+ if ! use telemetry; then
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_CRASHREPORTER=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_DATA_REPORTING=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_SERVICES_HEALTHREPORT=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_TELEMETRY_REPORTING=0"
+ fi
+
+ mozconfig_use_enable test tests
+
+ # Disable notification when build system has finished
+ export MOZ_NOSPAM=1
+
+ # Portage sets XARGS environment variable to "xargs -r" by default which
+ # breaks build system's check_prog() function which doesn't support arguments
+ mozconfig_add_options_ac 'Gentoo default' "XARGS=${EPREFIX}/usr/bin/xargs"
+
+ # Set build dir
+ mozconfig_add_options_mk 'Gentoo default' "MOZ_OBJDIR=${BUILD_DIR}"
+
+ # Show flags we will use
+ einfo "Build BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}"
+ einfo "Build CFLAGS:\t\t${CFLAGS:-no value set}"
+ einfo "Build CXXFLAGS:\t\t${CXXFLAGS:-no value set}"
+ einfo "Build LDFLAGS:\t\t${LDFLAGS:-no value set}"
+ einfo "Build RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}"
+
+ # Handle EXTRA_CONF and show summary
+ local ac opt hash reason
+
+ # Apply EXTRA_ECONF entries to $MOZCONFIG
+ if [[ -n ${EXTRA_ECONF} ]] ; then
+ IFS=\! read -a ac <<<${EXTRA_ECONF// --/\!}
+ for opt in "${ac[@]}"; do
+ mozconfig_add_options_ac "EXTRA_ECONF" --${opt#--}
+ done
+ fi
+
+ echo
+ echo "=========================================================="
+ echo "Building ${PF} with the following configuration"
+ grep ^ac_add_options "${MOZCONFIG}" | while read ac opt hash reason; do
+ [[ -z ${hash} || ${hash} == \# ]] \
+ || die "error reading mozconfig: ${ac} ${opt} ${hash} ${reason}"
+ printf " %-30s %s\n" "${opt}" "${reason:-mozilla.org default}"
+ done
+ echo "=========================================================="
+ echo
+
+ ./mach configure || die
+}
+
+src_compile() {
+ local virtx_cmd=
+
+ if [[ ${use_lto} == "yes" ]] && tc-ld-is-mold ; then
+ # increase ulimit with mold+lto, bugs #892641, #907485
+ if ! ulimit -n 16384 1>/dev/null 2>&1 ; then
+ ewarn "Unable to modify ulimits - building with mold+lto might fail due to low ulimit -n resources."
+ ewarn "Please see bugs #892641 & #907485."
+ else
+ ulimit -n 16384
+ fi
+ fi
+
+ if use pgo; then
+ # Reset and cleanup environment variables used by GNOME/XDG
+ gnome2_environment_reset
+
+ addpredict /root
+
+ if ! use X; then
+ virtx_cmd=virtwl
+ else
+ virtx_cmd=virtx
+ fi
+ fi
+
+ if ! use X; then
+ local -x GDK_BACKEND=wayland
+ else
+ local -x GDK_BACKEND=x11
+ fi
+
+ ${virtx_cmd} ./mach build --verbose || die
+}
+
+src_test() {
+ # https://firefox-source-docs.mozilla.org/testing/automated-testing/index.html
+ local -a failures=()
+
+ # Some tests respect this
+ local -x MOZ_HEADLESS=1
+
+ # Check testing/mach_commands.py
+ einfo "Testing with cppunittest ..."
+ ./mach cppunittest
+ local ret=$?
+ if [[ ${ret} -ne 0 ]]; then
+ eerror "Test suite cppunittest failed with error code ${ret}"
+ failures+=( cppunittest )
+ fi
+
+ if [[ ${#failures} -eq 0 ]]; then
+ einfo "Test suites succeeded"
+ else
+ die "Test suites failed: ${failures[@]}"
+ fi
+}
+
+src_install() {
+ # xpcshell is getting called during install
+ pax-mark m \
+ "${BUILD_DIR}"/dist/bin/xpcshell \
+ "${BUILD_DIR}"/dist/bin/${PN} \
+ "${BUILD_DIR}"/dist/bin/plugin-container
+
+ DESTDIR="${D}" ./mach install || die
+
+ # Upstream cannot ship symlink but we can (bmo#658850)
+ rm "${ED}${MOZILLA_FIVE_HOME}/${PN}-bin" || die
+ dosym ${PN} ${MOZILLA_FIVE_HOME}/${PN}-bin
+
+ # Don't install llvm-symbolizer from llvm-core/llvm package
+ if [[ -f "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" ]] ; then
+ rm -v "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" || die
+ fi
+
+ # Install policy (currently only used to disable application updates)
+ insinto "${MOZILLA_FIVE_HOME}/distribution"
+ newins "${FILESDIR}"/distribution.ini distribution.ini
+ newins "${FILESDIR}"/disable-auto-update.policy.json policies.json
+
+ # Install system-wide preferences
+ local PREFS_DIR="${MOZILLA_FIVE_HOME}/browser/defaults/preferences"
+ insinto "${PREFS_DIR}"
+ newins "${FILESDIR}"/gentoo-default-prefs.js gentoo-prefs.js
+
+ local GENTOO_PREFS="${ED}${PREFS_DIR}/gentoo-prefs.js"
+
+ # Set dictionary path to use system hunspell
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set spellchecker.dictionary_path pref"
+ pref("spellchecker.dictionary_path", "${EPREFIX}/usr/share/myspell");
+ EOF
+
+ # Force hwaccel prefs if USE=hwaccel is enabled
+ if use hwaccel ; then
+ cat "${FILESDIR}"/gentoo-hwaccel-prefs.js-r2 \
+ >>"${GENTOO_PREFS}" \
+ || die "failed to add prefs to force hardware-accelerated rendering to all-gentoo.js"
+
+ if use wayland; then
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set hwaccel wayland prefs"
+ pref("gfx.x11-egl.force-enabled", false);
+ EOF
+ else
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set hwaccel x11 prefs"
+ pref("gfx.x11-egl.force-enabled", true);
+ EOF
+ fi
+
+ # Install the vaapitest binary on supported arches (122.0 supports all platforms, bmo#1865969)
+ exeinto "${MOZILLA_FIVE_HOME}"
+ doexe "${BUILD_DIR}"/dist/bin/vaapitest
+
+ # Install the v4l2test on supported arches (+ arm, + riscv64 when keyworded)
+ if use arm64 ; then
+ exeinto "${MOZILLA_FIVE_HOME}"
+ doexe "${BUILD_DIR}"/dist/bin/v4l2test
+ fi
+ fi
+
+ if ! use gmp-autoupdate ; then
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ einfo "Disabling auto-update for ${plugin} plugin ..."
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable autoupdate for ${plugin} media plugin"
+ pref("media.${plugin}.autoupdate", false);
+ EOF
+ done
+ fi
+
+ # Force the graphite pref if USE=system-harfbuzz is enabled, since the pref cannot disable it
+ if use system-harfbuzz ; then
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set gfx.font_rendering.graphite.enabled pref"
+ sticky_pref("gfx.font_rendering.graphite.enabled", true);
+ EOF
+ fi
+
+ # Add telemetry config prefs, just in case something happens in future and telemetry build
+ # options stop working.
+ if ! use telemetry ; then
+ cat "${FILESDIR}"/gentoo-telemetry-prefs.js >>"${GENTOO_PREFS}" || die "failed to set telemetry prefs"
+ fi
+
+ # Install language packs
+ local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') )
+ if [[ -n "${langpacks}" ]] ; then
+ moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}"
+ fi
+
+ # Install icons
+ local icon_srcdir="${S}/browser/branding/official"
+
+ # Prefer the upstream svg file they use when packaging flatpak so it's always up-to-date.
+ insinto /usr/share/icons/hicolor/symbolic/apps
+ newins "${S}"/browser/installer/linux/app/flatpak/files/share/icons/hicolor/symbolic/apps/org.mozilla.firefox-symbolic.svg firefox-symbolic.svg
+ dosym -r /usr/share/icons/hicolor/symbolic/apps/firefox-symbolic.svg /usr/share/icons/hicolor/symbolic/apps/org.mozilla.firefox-symbolic.svg
+
+ local icon size
+ for icon in "${icon_srcdir}"/default*.png ; do
+ size=${icon%.png}
+ size=${size##*/default}
+
+ if [[ ${size} -eq 48 ]] ; then
+ newicon "${icon}" ${PN}.png
+ fi
+
+ newicon -s ${size} "${icon}" ${PN}.png
+ done
+
+ # Install menu
+ local app_name="Mozilla ${MOZ_PN^}"
+ local desktop_file="${FILESDIR}/icon/${PN}-r3.desktop"
+ local exec_command="${PN}"
+ local icon="${PN}"
+ local use_wayland="false"
+
+ if [[ -n ${MOZ_ESR} ]] ; then
+ local desktop_filename="${PN}-esr.desktop"
+ else
+ local desktop_filename="${PN}.desktop"
+ fi
+
+ if use wayland ; then
+ use_wayland="true"
+ fi
+
+ cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die
+
+ sed -i \
+ -e "s:@NAME@:${app_name}:" \
+ -e "s:@EXEC@:${exec_command}:" \
+ -e "s:@ICON@:${icon}:" \
+ "${WORKDIR}/${PN}.desktop-template" || die
+
+ newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}"
+
+ rm "${WORKDIR}/${PN}.desktop-template" || die
+
+ if use gnome-shell ; then
+ # Install search provider for Gnome
+ insinto /usr/share/gnome-shell/search-providers/
+ doins browser/components/shell/search-provider-files/org.mozilla.firefox.search-provider.ini
+
+ insinto /usr/share/dbus-1/services/
+ doins browser/components/shell/search-provider-files/org.mozilla.firefox.SearchProvider.service
+
+ # Toggle between rapid and esr desktop file names
+ if [[ -n ${MOZ_ESR} ]] ; then
+ sed -e "s/firefox.desktop/${desktop_filename}/g" \
+ -i "${ED}/usr/share/gnome-shell/search-providers/org.mozilla.firefox.search-provider.ini" ||
+ die "Failed to sed org.mozilla.firefox.search-provider.ini file."
+ fi
+
+ # Make the dbus service aware of a previous session, bgo#939196
+ sed -e \
+ "s/Exec=\/usr\/bin\/firefox/Exec=\/usr\/$(get_libdir)\/firefox\/firefox --dbus-service \/usr\/bin\/firefox/g" \
+ -i "${ED}/usr/share/dbus-1/services/org.mozilla.firefox.SearchProvider.service" ||
+ die "Failed to sed org.mozilla.firefox.SearchProvider.service dbus file"
+
+ # Update prefs to enable Gnome search provider
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to enable gnome-search-provider via prefs"
+ pref("browser.gnome-search-provider.enabled", true);
+ EOF
+ fi
+
+ # Install wrapper script
+ [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}"
+ newbin "${FILESDIR}/${PN}-r1.sh" ${PN}
+
+ # Update wrapper
+ sed -i \
+ -e "s:@PREFIX@:${EPREFIX}/usr:" \
+ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \
+ "${ED}/usr/bin/${PN}" || die
+
+ readme.gentoo_create_doc
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+
+ if ! use gmp-autoupdate ; then
+ elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"
+ elog "installing into new profiles:"
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ elog "\t ${plugin}"
+ done
+ elog
+ fi
+
+ # bug 835078
+ if use hwaccel && has_version "x11-drivers/xf86-video-nouveau"; then
+ ewarn "You have nouveau drivers installed in your system and 'hwaccel' "
+ ewarn "enabled for Firefox. Nouveau / your GPU might not support the "
+ ewarn "required EGL, so either disable 'hwaccel' or try the workaround "
+ ewarn "explained in https://bugs.gentoo.org/835078#c5 if Firefox crashes."
+ fi
+
+ readme.gentoo_print_elog
+
+ optfeature_header "Optional programs for extra features:"
+ optfeature "desktop notifications" x11-libs/libnotify
+ optfeature "fallback mouse cursor theme e.g. on WMs" gnome-base/gsettings-desktop-schemas
+ optfeature "screencasting with pipewire" sys-apps/xdg-desktop-portal
+ if use hwaccel && has_version "x11-drivers/nvidia-drivers"; then
+ optfeature "hardware acceleration with NVIDIA cards" media-libs/nvidia-vaapi-driver
+ fi
+
+ if ! has_version "sys-libs/glibc"; then
+ elog
+ elog "glibc not found! You won't be able to play DRM content."
+ elog "See Gentoo bug #910309 or upstream bug #1843683."
+ elog
+ fi
+}
diff --git a/www-client/firefox/firefox-150.0.1.ebuild b/www-client/firefox/firefox-150.0.1.ebuild
index 2e8056cf5a4f..d8fd371c8f53 100644
--- a/www-client/firefox/firefox-150.0.1.ebuild
+++ b/www-client/firefox/firefox-150.0.1.ebuild
@@ -11,7 +11,7 @@ LLVM_COMPAT=( 21 22 )
RUST_NEEDS_LLVM=1
RUST_MIN_VER=1.90.0
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{12..14} )
PYTHON_REQ_USE="ncurses,sqlite,ssl"
VIRTUALX_REQUIRED="manual"
diff --git a/www-client/firefox/firefox-150.0.2.ebuild b/www-client/firefox/firefox-150.0.2.ebuild
index 2e8056cf5a4f..d8fd371c8f53 100644
--- a/www-client/firefox/firefox-150.0.2.ebuild
+++ b/www-client/firefox/firefox-150.0.2.ebuild
@@ -11,7 +11,7 @@ LLVM_COMPAT=( 21 22 )
RUST_NEEDS_LLVM=1
RUST_MIN_VER=1.90.0
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{12..14} )
PYTHON_REQ_USE="ncurses,sqlite,ssl"
VIRTUALX_REQUIRED="manual"
diff --git a/www-client/firefox/firefox-150.0.3.ebuild b/www-client/firefox/firefox-150.0.3.ebuild
index 2e8056cf5a4f..d8fd371c8f53 100644
--- a/www-client/firefox/firefox-150.0.3.ebuild
+++ b/www-client/firefox/firefox-150.0.3.ebuild
@@ -11,7 +11,7 @@ LLVM_COMPAT=( 21 22 )
RUST_NEEDS_LLVM=1
RUST_MIN_VER=1.90.0
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{12..14} )
PYTHON_REQ_USE="ncurses,sqlite,ssl"
VIRTUALX_REQUIRED="manual"
diff --git a/www-client/firefox/firefox-151.0.1.ebuild b/www-client/firefox/firefox-151.0.1.ebuild
new file mode 100644
index 000000000000..f48a37313b20
--- /dev/null
+++ b/www-client/firefox/firefox-151.0.1.ebuild
@@ -0,0 +1,1386 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+FIREFOX_PATCHSET="firefox-151-patches-01.tar.xz"
+
+LLVM_COMPAT=( 21 22 )
+
+# This will also filter rust versions that don't match LLVM_COMPAT in the non-clang path; this is fine.
+RUST_NEEDS_LLVM=1
+RUST_MIN_VER=1.90.0
+
+PYTHON_COMPAT=( python3_{12..14} )
+PYTHON_REQ_USE="ncurses,sqlite,ssl"
+
+VIRTUALX_REQUIRED="manual"
+
+# Information about the bundled wasi toolchain from
+# https://github.com/WebAssembly/wasi-sdk/
+WASI_SDK_VER=32.0
+WASI_SDK_LLVM_VER=22
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+ SLOT="esr"
+else
+ HOMEPAGE="https://www.firefox.com"
+ SLOT="rapid"
+fi
+
+MOZ_PN="${PN%-bin}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+inherit check-reqs desktop flag-o-matic gnome2-utils linux-info llvm-r1 multiprocessing \
+ optfeature pax-utils python-any-r1 readme.gentoo-r1 rust toolchain-funcs virtualx xdg
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+if [[ ${PV} == *_rc* ]] ; then
+ MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/candidates/${MOZ_PV}-candidates/build${PV##*_rc}"
+fi
+
+PATCH_URIS=(
+ https://dev.gentoo.org/~juippis/mozilla/patchsets/${FIREFOX_PATCHSET}
+)
+
+DESCRIPTION="Firefox Web Browser"
+SRC_URI="${MOZ_SRC_BASE_URI}/source/${MOZ_P}.source.tar.xz -> ${MOZ_P_DISTFILES}.source.tar.xz
+ ${PATCH_URIS[@]}
+ wasm-sandbox? (
+ amd64? ( https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VER/.*/}/wasi-sdk-${WASI_SDK_VER}-x86_64-linux.tar.gz )
+ arm64? ( https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VER/.*/}/wasi-sdk-${WASI_SDK_VER}-arm64-linux.tar.gz )
+ )"
+
+S="${WORKDIR}/${PN}-${PV%_*}"
+LICENSE="MPL-2.0 GPL-2 LGPL-2.1"
+KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~riscv ~x86"
+
+IUSE="+clang dbus debug eme-free hardened hwaccel jack libproxy pgo pulseaudio selinux sndio"
+IUSE+=" +system-av1 +system-harfbuzz +system-icu +system-jpeg +system-libevent +system-libvpx"
+IUSE+=" system-pipewire system-png +system-webp test valgrind wayland wifi +X"
+
+# Firefox-only IUSE
+IUSE+=" +gmp-autoupdate gnome-shell jpegxl +jumbo-build openh264 +telemetry wasm-sandbox"
+
+REQUIRED_USE="|| ( X wayland )
+ debug? ( !system-av1 )
+ pgo? ( jumbo-build )
+ wayland? ( dbus )
+ wifi? ( dbus )
+"
+
+RESTRICT="!test? ( test )"
+
+FF_ONLY_DEPEND="!www-client/firefox:0
+ selinux? ( sec-policy/selinux-mozilla )"
+BDEPEND="${PYTHON_DEPS}
+ $(llvm_gen_dep '
+ llvm-core/clang:${LLVM_SLOT}
+ llvm-core/llvm:${LLVM_SLOT}
+ clang? (
+ llvm-core/lld:${LLVM_SLOT}
+ pgo? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[profile] )
+ )
+ wasm-sandbox? ( llvm-core/lld:${LLVM_SLOT} )
+ ')
+ app-alternatives/awk
+ app-arch/unzip
+ app-arch/zip
+ >=dev-util/cbindgen-0.29.1
+ net-libs/nodejs
+ virtual/pkgconfig
+ amd64? ( >=dev-lang/nasm-2.14 )
+ x86? ( >=dev-lang/nasm-2.14 )
+ pgo? (
+ X? (
+ sys-devel/gettext
+ x11-base/xorg-server[xvfb]
+ x11-apps/xhost
+ )
+ !X? (
+ gui-wm/tinywl
+ x11-misc/xkeyboard-config
+ )
+ )"
+COMMON_DEPEND="${FF_ONLY_DEPEND}
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ dev-libs/glib:2
+ dev-libs/libffi:=
+ >=dev-libs/nss-3.123.1
+ >=dev-libs/nspr-4.39
+ media-libs/alsa-lib
+ media-libs/fontconfig
+ media-libs/freetype
+ media-libs/mesa
+ media-video/ffmpeg
+ virtual/zlib:=
+ virtual/freedesktop-icon-theme
+ x11-libs/cairo
+ x11-libs/gdk-pixbuf:2
+ x11-libs/libdrm
+ x11-libs/pango
+ x11-libs/pixman
+ dbus? (
+ sys-apps/dbus
+ )
+ jack? ( virtual/jack )
+ pulseaudio? (
+ || (
+ media-libs/libpulse
+ >=media-sound/apulse-0.1.12-r4[sdk]
+ )
+ )
+ libproxy? ( net-libs/libproxy )
+ selinux? ( sec-policy/selinux-mozilla )
+ sndio? ( >=media-sound/sndio-1.8.0-r1 )
+ system-av1? (
+ >=media-libs/dav1d-1.0.0:=
+ >=media-libs/libaom-3.10.0:=
+ )
+ system-harfbuzz? (
+ >=media-libs/harfbuzz-2.8.1:0=
+ !wasm-sandbox? ( >=media-gfx/graphite2-1.3.13 )
+ )
+ system-icu? ( >=dev-libs/icu-78.1:= )
+ system-jpeg? ( >=media-libs/libjpeg-turbo-1.2.1:= )
+ system-libevent? ( >=dev-libs/libevent-2.1.12:0=[threads(+)] )
+ system-libvpx? ( >=media-libs/libvpx-1.8.2:0=[postproc] )
+ system-pipewire? ( >=media-video/pipewire-1.4.7-r2:= )
+ system-png? ( >=media-libs/libpng-1.6.45:0=[apng] )
+ system-webp? ( >=media-libs/libwebp-1.1.0:0= )
+ valgrind? ( dev-debug/valgrind )
+ wayland? (
+ >=media-libs/libepoxy-1.5.10-r1
+ x11-libs/gtk+:3[wayland]
+ )
+ wifi? (
+ kernel_linux? (
+ || (
+ net-misc/networkmanager
+ net-misc/connman[networkmanager]
+ )
+ sys-apps/dbus
+ )
+ )
+ X? (
+ virtual/opengl
+ x11-libs/cairo[X]
+ x11-libs/gtk+:3[X]
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXrandr
+ x11-libs/libxcb:=
+ )"
+RDEPEND="${COMMON_DEPEND}
+ hwaccel? (
+ media-video/libva-utils
+ sys-apps/pciutils
+ )
+ jack? ( virtual/jack )
+ openh264? ( media-libs/openh264:*[plugin] )"
+DEPEND="${COMMON_DEPEND}
+ X? (
+ x11-base/xorg-proto
+ x11-libs/libICE
+ x11-libs/libSM
+ )"
+
+# ESR and rapid dependencies.
+if [[ -n ${MOZ_ESR} ]] ; then
+ RDEPEND+=" !www-client/firefox:rapid"
+else
+ RDEPEND+=" !www-client/firefox:esr"
+fi
+
+# Firefox-only RDEPEND
+RDEPEND+=" ~www-client/firefox-l10n-${PV}"
+
+# Allow MOZ_GMP_PLUGIN_LIST to be set in an eclass or
+# overridden in the enviromnent (advanced hackers only)
+if [[ -z "${MOZ_GMP_PLUGIN_LIST+set}" ]] ; then
+ MOZ_GMP_PLUGIN_LIST=( gmp-gmpopenh264 gmp-widevinecdm )
+fi
+
+llvm_check_deps() {
+ if ! has_version -b "llvm-core/clang:${LLVM_SLOT}" ; then
+ einfo "llvm-core/clang:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+
+ if use clang && ! tc-ld-is-mold ; then
+ if ! has_version -b "llvm-core/lld:${LLVM_SLOT}" ; then
+ einfo "llvm-core/lld:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+ fi
+
+ if use pgo ; then
+ if ! has_version -b "=llvm-runtimes/compiler-rt-sanitizers-${LLVM_SLOT}*[profile]" ; then
+ einfo "=llvm-runtimes/compiler-rt-sanitizers-${LLVM_SLOT}*[profile] is missing!" >&2
+ einfo "Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+ fi
+
+ einfo "Using LLVM slot ${LLVM_SLOT} to build" >&2
+}
+
+moz_clear_vendor_checksums() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -ne 1 ]] ; then
+ die "${FUNCNAME} requires exact one argument"
+ fi
+
+ einfo "Clearing cargo checksums for ${1} ..."
+
+ sed -i \
+ -e 's/\("files":{\)[^}]*/\1/' \
+ "${S}"/third_party/rust/${1}/.cargo-checksum.json || die
+}
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+mozconfig_add_options_ac() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local reason=${1}
+ shift
+
+ local option
+ for option in ${@} ; do
+ echo "ac_add_options ${option} # ${reason}" >>${MOZCONFIG}
+ done
+}
+
+mozconfig_add_options_mk() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local reason=${1}
+ shift
+
+ local option
+ for option in ${@} ; do
+ echo "mk_add_options ${option} # ${reason}" >>${MOZCONFIG}
+ done
+}
+
+mozconfig_use_enable() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 1 ]] ; then
+ die "${FUNCNAME} requires at least one arguments"
+ fi
+
+ local flag=$(use_enable "${@}")
+ mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}"
+}
+
+mozconfig_use_with() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 1 ]] ; then
+ die "${FUNCNAME} requires at least one arguments"
+ fi
+
+ local flag=$(use_with "${@}")
+ mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}"
+}
+
+virtwl() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ [[ $# -lt 1 ]] && die "${FUNCNAME} needs at least one argument"
+ [[ -n $XDG_RUNTIME_DIR ]] || die "${FUNCNAME} needs XDG_RUNTIME_DIR to be set; try xdg_environment_reset"
+ tinywl -h >/dev/null || die 'tinywl -h failed'
+
+ local VIRTWL VIRTWL_PID
+ coproc VIRTWL { WLR_BACKENDS=headless exec tinywl -s 'echo $WAYLAND_DISPLAY; read _; kill $PPID'; }
+ local -x WAYLAND_DISPLAY
+ read WAYLAND_DISPLAY <&${VIRTWL[0]}
+
+ debug-print "${FUNCNAME}: $@"
+ "$@"
+ local r=$?
+
+ [[ -n $VIRTWL_PID ]] || die "tinywl exited unexpectedly"
+ exec {VIRTWL[0]}<&- {VIRTWL[1]}>&-
+ return $r
+}
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]] ; then
+ # Ensure we have enough disk space to compile
+ if use pgo || use debug ; then
+ CHECKREQS_DISK_BUILD="18700M"
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and pgo detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling pgo."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable pgo when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+pgo cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ elif tc-is-lto ; then
+ CHECKREQS_DISK_BUILD="10900M"
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and lto detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling lto."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable lto when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+lto cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ else
+ CHECKREQS_DISK_BUILD="9700M"
+ fi
+
+ check-reqs_pkg_pretend
+ fi
+}
+
+pkg_setup() {
+
+ # Get LTO from environment; export after this phase for use in src_configure (etc)
+ use_lto=no
+
+ if [[ ${MERGE_TYPE} != binary ]] ; then
+
+ if tc-is-lto; then
+ use_lto=yes
+ # LTO is handled via configure
+ filter-lto
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and pgo detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling lto."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable lto when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+lto cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ fi
+
+ if use pgo ; then
+ if ! has userpriv ${FEATURES} ; then
+ eerror "Building ${PN} with USE=pgo and FEATURES=-userpriv is not supported!"
+ fi
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and lto detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling pgo."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable pgo when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+pgo cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ fi
+
+ if [[ ${use_lto} = yes ]]; then
+ # -Werror=lto-type-mismatch -Werror=odr are going to fail with GCC,
+ # bmo#1516758, bgo#942288
+ filter-flags -Werror=lto-type-mismatch -Werror=odr
+ fi
+
+ # Ensure we have enough disk space to compile
+ if use pgo || use debug ; then
+ CHECKREQS_DISK_BUILD="18700M"
+ elif [[ ${use_lto} == "yes" ]] ; then
+ CHECKREQS_DISK_BUILD="10900M"
+ else
+ CHECKREQS_DISK_BUILD="9700M"
+ fi
+
+ check-reqs_pkg_setup
+ llvm-r1_pkg_setup
+ rust_pkg_setup
+ python-any-r1_pkg_setup
+
+ # Avoid PGO profiling problems due to enviroment leakage
+ # These should *always* be cleaned up anyway
+ unset \
+ DBUS_SESSION_BUS_ADDRESS \
+ DISPLAY \
+ ORBIT_SOCKETDIR \
+ SESSION_MANAGER \
+ XAUTHORITY \
+ XDG_CACHE_HOME \
+ XDG_SESSION_COOKIE
+
+ # Build system is using /proc/self/oom_score_adj, bug #604394
+ addpredict /proc/self/oom_score_adj
+
+ if use pgo ; then
+ # Update 105.0: "/proc/self/oom_score_adj" isn't enough anymore with pgo, but not sure
+ # whether that's due to better OOM handling by Firefox (bmo#1771712), or portage
+ # (PORTAGE_SCHEDULING_POLICY) update...
+ addpredict /proc
+
+ # Clear tons of conditions, since PGO is hardware-dependant.
+ addpredict /dev
+ fi
+
+ if ! mountpoint -q /dev/shm ; then
+ # If /dev/shm is not available, configure is known to fail with
+ # a traceback report referencing /usr/lib/pythonN.N/multiprocessing/synchronize.py
+ ewarn "/dev/shm is not mounted -- expect build failures!"
+ fi
+
+ # Google API keys (see http://www.chromium.org/developers/how-tos/api-keys)
+ # Note: These are for Gentoo Linux use ONLY. For your own distribution, please
+ # get your own set of keys.
+ if [[ -z "${MOZ_API_KEY_GOOGLE+set}" ]] ; then
+ MOZ_API_KEY_GOOGLE="AIzaSyDEAOvatFogGaPi0eTgsV_ZlEzx0ObmepsMzfAc"
+ fi
+
+ if [[ -z "${MOZ_API_KEY_LOCATION+set}" ]] ; then
+ MOZ_API_KEY_LOCATION="AIzaSyB2h2OuRgGaPicUgy5N-5hsZqiPW6sH3n_rptiQ"
+ fi
+
+ # Mozilla API keys (see https://location.services.mozilla.com/api)
+ # Note: These are for Gentoo Linux use ONLY. For your own distribution, please
+ # get your own set of keys.
+ if [[ -z "${MOZ_API_KEY_MOZILLA+set}" ]] ; then
+ MOZ_API_KEY_MOZILLA="edb3d487-3a84-46m0ap1e3-9dfd-92b5efaaa005"
+ fi
+
+ # Ensure we use C locale when building, bug #746215
+ export LC_ALL=C
+ fi
+
+ export use_lto
+
+ CONFIG_CHECK="~SECCOMP"
+ WARNING_SECCOMP="CONFIG_SECCOMP not set! This system will be unable to play DRM-protected content."
+ linux-info_pkg_setup
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ unpack ${_src_file}
+ fi
+ done
+}
+
+src_prepare() {
+ if [[ ${use_lto} == "yes" ]]; then
+ rm -v "${WORKDIR}"/firefox-patches/*-LTO-Only-enable-LTO-*.patch || die
+ fi
+
+ # Workaround for bgo#915651 and bmo#1988166 on musl
+ if use elibc_glibc ; then
+ rm -v "${WORKDIR}"/firefox-patches/*bgo-748849-RUST_TARGET_override.patch || die
+ rm -v "${WORKDIR}"/firefox-patches/*bmo-1988166-musl-remove-nonexisting-system-header-req.patch || die
+ rm -v "${WORKDIR}"/firefox-patches/*bgo-967694-musl-prctrl-exception-on-musl.patch || die
+ fi
+
+ eapply "${WORKDIR}/firefox-patches"
+
+ # Allow user to apply any additional patches without modifing ebuild
+ eapply_user
+
+ # Make cargo respect MAKEOPTS
+ export CARGO_BUILD_JOBS="$(makeopts_jobs)"
+
+ # Workaround for bgo#915651
+ if ! use elibc_glibc ; then
+ if use amd64 ; then
+ export RUST_TARGET="x86_64-unknown-linux-musl"
+ elif use x86 ; then
+ export RUST_TARGET="i686-unknown-linux-musl"
+ elif use arm64 ; then
+ export RUST_TARGET="aarch64-unknown-linux-musl"
+ elif use loong; then
+ # Only the LP64D ABI of LoongArch64 is actively supported among
+ # the wider Linux ecosystem, so the assumption is safe.
+ export RUST_TARGET="loongarch64-unknown-linux-musl"
+ elif use ppc64 ; then
+ export RUST_TARGET="powerpc64le-unknown-linux-musl"
+ elif use riscv ; then
+ # We can pretty safely rule out any 32-bit riscvs, but 64-bit riscvs also have tons of
+ # different ABIs available. riscv64gc-unknown-linux-musl seems to be the best working
+ # guess right now though.
+ elog "riscv detected, forcing a riscv64 target for now."
+ export RUST_TARGET="riscv64gc-unknown-linux-musl"
+ else
+ die "Unknown musl chost, please post a new bug with your rustc -vV along with emerge --info"
+ fi
+ fi
+
+ # Pre-built wasm-sandbox path manipulation.
+ if use wasm-sandbox ; then
+ if use amd64 ; then
+ export wasi_arch="x86_64"
+ elif use arm64 ; then
+ export wasi_arch="arm64"
+ else
+ die "wasm-sandbox enabled on unknown/unsupported arch!"
+ fi
+
+ sed -i \
+ -e "s:%%PORTAGE_WORKDIR%%:${WORKDIR}:" \
+ -e "s:%%WASI_ARCH%%:${wasi_arch}:" \
+ -e "s:%%WASI_SDK_VER%%:${WASI_SDK_VER}:" \
+ -e "s:%%WASI_SDK_LLVM_VER%%:${WASI_SDK_LLVM_VER}:" \
+ toolkit/moz.configure || die "Failed to update wasi-related paths."
+ fi
+
+ # Make LTO respect MAKEOPTS
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/build/moz.configure/lto-pgo.configure || die "Failed sedding multiprocessing.cpu_count"
+
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/third_party/chromium/build/toolchain/get_cpu_count.py || die "Failed sedding multiprocessing.cpu_count"
+
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/third_party/python/gyp/pylib/gyp/input.py || die "Failed sedding multiprocessing.cpu_count"
+
+ # sed-in toolchain prefix
+ sed -i \
+ -e "s/objdump/${CHOST}-objdump/" \
+ "${S}"/python/mozbuild/mozbuild/configure/check_debug_ranges.py || die "sed failed to set toolchain prefix"
+
+ sed -i \
+ -e 's/ccache_stats = None/return None/' \
+ "${S}"/python/mozbuild/mozbuild/controller/building.py || die "sed failed to disable ccache stats call"
+
+ einfo "Removing pre-built binaries ..."
+
+ find "${S}"/third_party -type f \( -name '*.so' -o -name '*.o' \) -print -delete || die
+
+ # Clear checksums from cargo crates we've manually patched.
+ # moz_clear_vendor_checksums xyz
+ # glslopt: bgo#969412
+ moz_clear_vendor_checksums glslopt
+ moz_clear_vendor_checksums encoding_rs
+
+ # Respect choice for "jumbo-build"
+ # Changing the value for FILES_PER_UNIFIED_FILE may not work, see #905431
+ if [[ -n ${FILES_PER_UNIFIED_FILE} ]] && use jumbo-build; then
+ local my_files_per_unified_file=${FILES_PER_UNIFIED_FILE:=16}
+ elog ""
+ elog "jumbo-build defaults modified to ${my_files_per_unified_file}."
+ elog "if you get a build failure, try undefining FILES_PER_UNIFIED_FILE,"
+ elog "if that fails try -jumbo-build before opening a bug report."
+ elog ""
+
+ sed -i -e "s/\"FILES_PER_UNIFIED_FILE\", 16/\"FILES_PER_UNIFIED_FILE\", "${my_files_per_unified_file}"/" \
+ python/mozbuild/mozbuild/frontend/data.py ||
+ die "Failed to adjust FILES_PER_UNIFIED_FILE in python/mozbuild/mozbuild/frontend/data.py"
+ sed -i -e "s/FILES_PER_UNIFIED_FILE = 6/FILES_PER_UNIFIED_FILE = "${my_files_per_unified_file}"/" \
+ js/src/moz.build ||
+ die "Failed to adjust FILES_PER_UNIFIED_FILE in js/src/moz.build"
+ fi
+
+ # Create build dir
+ BUILD_DIR="${WORKDIR}/${PN}_build"
+ mkdir -p "${BUILD_DIR}" || die
+
+ # Write API keys to disk
+ echo -n "${MOZ_API_KEY_GOOGLE//gGaPi/}" > "${S}"/api-google.key || die
+ echo -n "${MOZ_API_KEY_LOCATION//gGaPi/}" > "${S}"/api-location.key || die
+ echo -n "${MOZ_API_KEY_MOZILLA//m0ap1/}" > "${S}"/api-mozilla.key || die
+
+ xdg_environment_reset
+}
+
+src_configure() {
+ # Show flags set at the beginning
+ einfo "Current BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}"
+ einfo "Current CFLAGS:\t\t${CFLAGS:-no value set}"
+ einfo "Current CXXFLAGS:\t\t${CXXFLAGS:-no value set}"
+ einfo "Current LDFLAGS:\t\t${LDFLAGS:-no value set}"
+ einfo "Current RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}"
+
+ local have_switched_compiler=
+ if use clang; then
+ # Force clang
+ einfo "Enforcing the use of clang due to USE=clang ..."
+
+ local version_clang=$(clang --version 2>/dev/null | grep -F -- 'clang version' | awk '{ print $3 }')
+ [[ -n ${version_clang} ]] && version_clang=$(ver_cut 1 "${version_clang}")
+ [[ -z ${version_clang} ]] && die "Failed to read clang version!"
+
+ if tc-is-gcc; then
+ have_switched_compiler=yes
+ fi
+
+ AR=llvm-ar
+ CC=${CHOST}-clang-${version_clang}
+ CXX=${CHOST}-clang++-${version_clang}
+ NM=llvm-nm
+ RANLIB=llvm-ranlib
+ elif ! use clang && ! tc-is-gcc ; then
+ # Force gcc
+ have_switched_compiler=yes
+ einfo "Enforcing the use of gcc due to USE=-clang ..."
+ AR=gcc-ar
+ CC=${CHOST}-gcc
+ CXX=${CHOST}-g++
+ NM=gcc-nm
+ RANLIB=gcc-ranlib
+ fi
+
+ if [[ -n "${have_switched_compiler}" ]] ; then
+ # Because we switched active compiler we have to ensure
+ # that no unsupported flags are set
+ strip-unsupported-flags
+ fi
+
+ # Ensure we use correct toolchain,
+ # AS is used in a non-standard way by upstream, #bmo1654031
+ export HOST_CC="$(tc-getBUILD_CC)"
+ export HOST_CXX="$(tc-getBUILD_CXX)"
+ export AS="$(tc-getCC) -c"
+
+ # Configuration tests expect llvm-readelf output, bug 913130
+ READELF="llvm-readelf"
+
+ tc-export CC CXX LD AR AS NM OBJDUMP RANLIB READELF PKG_CONFIG
+
+ # Pass the correct toolchain paths through cbindgen
+ if tc-is-cross-compiler ; then
+ export BINDGEN_CFLAGS="${SYSROOT:+--sysroot=${ESYSROOT}} --target=${CHOST} ${BINDGEN_CFLAGS-}"
+ fi
+
+ # Set MOZILLA_FIVE_HOME
+ export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${PN}"
+
+ # python/mach/mach/mixin/process.py fails to detect SHELL
+ export SHELL="${EPREFIX}/bin/bash"
+
+ # Set state path
+ export MOZBUILD_STATE_PATH="${BUILD_DIR}"
+
+ # Set MOZCONFIG
+ export MOZCONFIG="${S}/.mozconfig"
+
+ # Initialize MOZCONFIG
+ mozconfig_add_options_ac '' --enable-application=browser
+ mozconfig_add_options_ac '' --enable-project=browser
+
+ # Set Gentoo defaults
+ if use telemetry; then
+ export MOZILLA_OFFICIAL=1
+ fi
+
+ mozconfig_add_options_ac 'Gentoo default' \
+ --allow-addon-sideload \
+ --disable-cargo-incremental \
+ --disable-crashreporter \
+ --disable-disk-remnant-avoidance \
+ --disable-geckodriver \
+ --disable-install-strip \
+ --disable-legacy-profile-creation \
+ --disable-parental-controls \
+ --disable-strip \
+ --disable-updater \
+ --disable-wmf \
+ --enable-negotiateauth \
+ --enable-new-pass-manager \
+ --enable-official-branding \
+ --enable-packed-relative-relocs \
+ --enable-release \
+ --enable-system-policies \
+ --host="${CBUILD:-${CHOST}}" \
+ --libdir="${EPREFIX}/usr/$(get_libdir)" \
+ --prefix="${EPREFIX}/usr" \
+ --target="${CHOST}" \
+ --without-ccache \
+ --with-intl-api \
+ --with-libclang-path="$(llvm-config --libdir)" \
+ --with-system-ffi \
+ --with-system-gbm \
+ --with-system-libdrm \
+ --with-system-nspr \
+ --with-system-nss \
+ --with-system-pixman \
+ --with-system-zlib \
+ --with-toolchain-prefix="${CHOST}-" \
+ --with-unsigned-addon-scopes=app,system
+
+ # Set update channel
+ local update_channel=release
+ [[ -n ${MOZ_ESR} ]] && update_channel=esr
+ mozconfig_add_options_ac '' --enable-update-channel=${update_channel}
+
+ # Whitelist to allow unkeyworded arches to build with "--disable-rust-simd" by default.
+ if use amd64 || use arm64 || use ppc64 || use loong || use riscv ; then
+ mozconfig_add_options_ac '' --enable-rust-simd
+ fi
+
+ # For future keywording: This is currently (97.0) only supported on:
+ # amd64, arm, arm64 & x86.
+ # Might want to flip the logic around if Firefox is to support more arches.
+ # bug 833001, bug 903411#c8
+ if use loong || use ppc64 || use riscv; then
+ mozconfig_add_options_ac '' --disable-sandbox
+ elif use valgrind; then
+ mozconfig_add_options_ac 'valgrind requirement' --disable-sandbox
+ else
+ mozconfig_add_options_ac '' --enable-sandbox
+ fi
+
+ # riscv-related options, bgo#947337, bgo#947338
+ if use riscv ; then
+ mozconfig_add_options_ac 'Disable webrtc for RISC-V' --disable-webrtc
+ fi
+
+ if [[ -s "${S}/api-google.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-google.key" | md5sum | awk '{ print $1 }') != 709560c02f94b41f9ad2c49207be6c54 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-google-safebrowsing-api-keyfile="${S}/api-google.key"
+ else
+ einfo "Building without Google API key ..."
+ fi
+
+ if [[ -s "${S}/api-location.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-location.key" | md5sum | awk '{ print $1 }') != ffb7895e35dedf832eb1c5d420ac7420 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-google-location-service-api-keyfile="${S}/api-location.key"
+ else
+ einfo "Building without Location API key ..."
+ fi
+
+ if [[ -s "${S}/api-mozilla.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-mozilla.key" | md5sum | awk '{ print $1 }') != 3927726e9442a8e8fa0e46ccc39caa27 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-mozilla-api-keyfile="${S}/api-mozilla.key"
+ else
+ einfo "Building without Mozilla API key ..."
+ fi
+
+ mozconfig_use_with system-av1
+ mozconfig_use_with system-harfbuzz
+ mozconfig_use_with system-icu
+ mozconfig_use_with system-jpeg
+ mozconfig_use_with system-libevent
+ mozconfig_use_with system-libvpx
+ mozconfig_use_with system-pipewire
+ mozconfig_use_with system-png
+ mozconfig_use_with system-webp
+
+ mozconfig_use_enable dbus
+ mozconfig_use_enable libproxy
+ mozconfig_use_enable valgrind
+
+ use eme-free && mozconfig_add_options_ac '+eme-free' --disable-eme
+
+ if use hardened ; then
+ mozconfig_add_options_ac "+hardened" --enable-hardening
+ mozconfig_add_options_ac "+hardened stl" --enable-stl-hardening
+ append-ldflags "-Wl,-z,relro -Wl,-z,now"
+
+ # Increase the FORTIFY_SOURCE value, #910071.
+ sed -i -e '/-D_FORTIFY_SOURCE=/s:2:3:' "${S}"/build/moz.configure/toolchain.configure || die
+ fi
+
+ local myaudiobackends=""
+ use jack && myaudiobackends+="jack,"
+ use sndio && myaudiobackends+="sndio,"
+ use pulseaudio && myaudiobackends+="pulseaudio,"
+ ! use pulseaudio && myaudiobackends+="alsa,"
+
+ mozconfig_add_options_ac '--enable-audio-backends' --enable-audio-backends="${myaudiobackends::-1}"
+
+ mozconfig_use_enable wifi necko-wifi
+
+ ! use jumbo-build && mozconfig_add_options_ac '--disable-unified-build' --disable-unified-build
+
+ if use X && use wayland ; then
+ mozconfig_add_options_ac '+x11+wayland' --enable-default-toolkit=cairo-gtk3-x11-wayland
+ elif ! use X && use wayland ; then
+ mozconfig_add_options_ac '+wayland' --enable-default-toolkit=cairo-gtk3-wayland-only
+ else
+ mozconfig_add_options_ac '+x11' --enable-default-toolkit=cairo-gtk3-x11-only
+ fi
+
+ # wasm-sandbox
+ # Since graphite2 is one of the sandboxed libraries, system-graphite2 obviously can't work with +wasm-sandbox.
+ if use wasm-sandbox ; then
+ mozconfig_add_options_ac '+wasm-sandbox' --with-wasi-sysroot="${WORKDIR}/wasi-sdk-${WASI_SDK_VER}-${wasi_arch}-linux/share/wasi-sysroot/"
+ else
+ mozconfig_add_options_ac 'no wasm-sandbox' --without-wasm-sandboxed-libraries
+ mozconfig_use_with system-harfbuzz system-graphite2
+ fi
+
+ ! use jpegxl && mozconfig_add_options_ac '-jpegxl' --disable-jxl
+
+ if [[ ${use_lto} == "yes" ]] ; then
+ if use clang ; then
+ # Upstream only supports lld or mold when using clang.
+ if tc-ld-is-mold ; then
+ # mold expects the -flto line from *FLAGS configuration, bgo#923119
+ append-ldflags "-flto=thin"
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "forcing ld=lld due to USE=clang and USE=lto" --enable-linker=lld
+ fi
+
+ mozconfig_add_options_ac '+lto' --enable-lto=cross
+
+ else
+ # ThinLTO is currently broken, see bmo#1644409.
+ # mold does not support gcc+lto combination.
+ mozconfig_add_options_ac '+lto' --enable-lto=full
+ mozconfig_add_options_ac "linker is set to bfd" --enable-linker=bfd
+ fi
+
+ else
+ # Avoid auto-magic on linker
+ if use clang ; then
+ # lld is upstream's default
+ if tc-ld-is-mold ; then
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "forcing ld=lld due to USE=clang" --enable-linker=lld
+ fi
+
+ else
+ if tc-ld-is-mold ; then
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "linker is set to bfd due to USE=-clang" --enable-linker=bfd
+ fi
+ fi
+ fi
+
+ # PGO was moved outside lto block to allow building pgo without lto.
+ if use pgo ; then
+ mozconfig_add_options_ac '+pgo' MOZ_PGO=1
+
+ # Avoid compressing just-built instrumented Firefox with
+ # high levels of compression. Just use tar as a container
+ # to save >=10 minutes.
+ export MOZ_PKG_FORMAT=tar
+
+ if use clang ; then
+ # Used in build/pgo/profileserver.py
+ export LLVM_PROFDATA="llvm-profdata"
+ else
+ # Attempt to fix pgo hanging with gcc, bgo#966309.
+ export MOZ_REMOTE_SETTINGS_DEVTOOLS=1
+ fi
+ fi
+
+ mozconfig_use_enable debug
+ if use debug ; then
+ mozconfig_add_options_ac '+debug' --disable-optimize
+ mozconfig_add_options_ac '+debug' --enable-jemalloc
+ mozconfig_add_options_ac '+debug' --enable-real-time-tracing
+ else
+ mozconfig_add_options_ac 'Gentoo defaults' --disable-real-time-tracing
+
+ if is-flag '-g*' ; then
+ if use clang ; then
+ mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols=$(get-flag '-g*')
+ else
+ mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols
+ fi
+ else
+ mozconfig_add_options_ac 'Gentoo default' --disable-debug-symbols
+ fi
+
+ if is-flag '-O0' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O0
+ elif is-flag '-O4' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O4
+ elif is-flag '-O3' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O3
+ elif is-flag '-O1' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O1
+ elif is-flag '-Os' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-Os
+ else
+ mozconfig_add_options_ac "Gentoo default" --enable-optimize=-O2
+ fi
+ fi
+
+ # Debug flag was handled via configure
+ filter-flags '-g*'
+
+ # Optimization flag was handled via configure
+ filter-flags '-O*'
+
+ # elf-hack
+ # Filter "-z,pack-relative-relocs" and let the build system handle it instead.
+ if use amd64 || use x86 ; then
+ filter-flags "-z,pack-relative-relocs"
+
+ if tc-ld-is-mold ; then
+ # relr-elf-hack is currently broken with mold, bgo#916259
+ mozconfig_add_options_ac 'disable elf-hack with mold linker' --disable-elf-hack
+ else
+ mozconfig_add_options_ac 'relr elf-hack' --enable-elf-hack=relr
+ fi
+ elif use loong || use ppc64 || use riscv ; then
+ # '--disable-elf-hack' is not recognized on loong/ppc64/riscv,
+ # see bgo #917049, #930046
+ :;
+ else
+ mozconfig_add_options_ac 'disable elf-hack on non-supported arches' --disable-elf-hack
+ fi
+
+ if ! use elibc_glibc; then
+ mozconfig_add_options_ac '!elibc_glibc' --disable-jemalloc
+ fi
+
+ if use valgrind; then
+ mozconfig_add_options_ac 'valgrind requirement' --disable-jemalloc
+ fi
+
+ # System-av1 fix
+ use system-av1 && append-ldflags "-Wl,--undefined-version"
+
+ # Make revdep-rebuild.sh happy; Also required for musl
+ append-ldflags -Wl,-rpath="${MOZILLA_FIVE_HOME}",--enable-new-dtags
+
+ # Pass $MAKEOPTS to build system
+ export MOZ_MAKE_FLAGS="${MAKEOPTS}"
+
+ # Use system's Python environment
+ export PIP_NETWORK_INSTALL_RESTRICTED_VIRTUALENVS=mach
+
+ export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE="none"
+
+ if ! use telemetry; then
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_CRASHREPORTER=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_DATA_REPORTING=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_SERVICES_HEALTHREPORT=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_TELEMETRY_REPORTING=0"
+ fi
+
+ mozconfig_use_enable test tests
+
+ # Disable notification when build system has finished
+ export MOZ_NOSPAM=1
+
+ # Portage sets XARGS environment variable to "xargs -r" by default which
+ # breaks build system's check_prog() function which doesn't support arguments
+ mozconfig_add_options_ac 'Gentoo default' "XARGS=${EPREFIX}/usr/bin/xargs"
+
+ # Set build dir
+ mozconfig_add_options_mk 'Gentoo default' "MOZ_OBJDIR=${BUILD_DIR}"
+
+ # Show flags we will use
+ einfo "Build BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}"
+ einfo "Build CFLAGS:\t\t${CFLAGS:-no value set}"
+ einfo "Build CXXFLAGS:\t\t${CXXFLAGS:-no value set}"
+ einfo "Build LDFLAGS:\t\t${LDFLAGS:-no value set}"
+ einfo "Build RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}"
+
+ # Handle EXTRA_CONF and show summary
+ local ac opt hash reason
+
+ # Apply EXTRA_ECONF entries to $MOZCONFIG
+ if [[ -n ${EXTRA_ECONF} ]] ; then
+ IFS=\! read -a ac <<<${EXTRA_ECONF// --/\!}
+ for opt in "${ac[@]}"; do
+ mozconfig_add_options_ac "EXTRA_ECONF" --${opt#--}
+ done
+ fi
+
+ echo
+ echo "=========================================================="
+ echo "Building ${PF} with the following configuration"
+ grep ^ac_add_options "${MOZCONFIG}" | while read ac opt hash reason; do
+ [[ -z ${hash} || ${hash} == \# ]] \
+ || die "error reading mozconfig: ${ac} ${opt} ${hash} ${reason}"
+ printf " %-30s %s\n" "${opt}" "${reason:-mozilla.org default}"
+ done
+ echo "=========================================================="
+ echo
+
+ if use valgrind; then
+ sed -i -e 's/--enable-optimize=-O[0-9s]/--enable-optimize="-g -O2"/' .mozconfig || die
+ fi
+
+ ./mach configure || die
+}
+
+src_compile() {
+ local virtx_cmd=
+
+ if [[ ${use_lto} == "yes" ]] && tc-ld-is-mold ; then
+ # increase ulimit with mold+lto, bugs #892641, #907485
+ if ! ulimit -n 16384 1>/dev/null 2>&1 ; then
+ ewarn "Unable to modify ulimits - building with mold+lto might fail due to low ulimit -n resources."
+ ewarn "Please see bugs #892641 & #907485."
+ else
+ ulimit -n 16384
+ fi
+ fi
+
+ if use pgo; then
+ # Reset and cleanup environment variables used by GNOME/XDG
+ gnome2_environment_reset
+
+ addpredict /root
+
+ if ! use X; then
+ virtx_cmd=virtwl
+ else
+ virtx_cmd=virtx
+ fi
+ fi
+
+ if ! use X; then
+ local -x GDK_BACKEND=wayland
+ else
+ local -x GDK_BACKEND=x11
+ fi
+
+ ${virtx_cmd} ./mach build --verbose || die
+}
+
+src_test() {
+ # https://firefox-source-docs.mozilla.org/testing/automated-testing/index.html
+ local -a failures=()
+
+ # Some tests respect this
+ local -x MOZ_HEADLESS=1
+
+ # Check testing/mach_commands.py
+ einfo "Testing with cppunittest ..."
+ ./mach cppunittest
+ local ret=$?
+ if [[ ${ret} -ne 0 ]]; then
+ eerror "Test suite cppunittest failed with error code ${ret}"
+ failures+=( cppunittest )
+ fi
+
+ if [[ ${#failures} -eq 0 ]]; then
+ einfo "Test suites succeeded"
+ else
+ die "Test suites failed: ${failures[@]}"
+ fi
+}
+
+src_install() {
+ # xpcshell is getting called during install
+ pax-mark m \
+ "${BUILD_DIR}"/dist/bin/xpcshell \
+ "${BUILD_DIR}"/dist/bin/${PN} \
+ "${BUILD_DIR}"/dist/bin/plugin-container
+
+ DESTDIR="${D}" ./mach install || die
+
+ # Upstream cannot ship symlink but we can (bmo#658850)
+ rm "${ED}${MOZILLA_FIVE_HOME}/${PN}-bin" || die
+ dosym ${PN} ${MOZILLA_FIVE_HOME}/${PN}-bin
+
+ # Don't install llvm-symbolizer from llvm-core/llvm package
+ if [[ -f "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" ]] ; then
+ rm -v "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" || die
+ fi
+
+ # Install policy (currently only used to disable application updates)
+ insinto "${MOZILLA_FIVE_HOME}/distribution"
+ newins "${FILESDIR}"/distribution.ini distribution.ini
+ newins "${FILESDIR}"/disable-auto-update.policy.json policies.json
+
+ # Install system-wide preferences
+ local PREFS_DIR="${MOZILLA_FIVE_HOME}/browser/defaults/preferences"
+ insinto "${PREFS_DIR}"
+ newins "${FILESDIR}"/gentoo-default-prefs.js gentoo-prefs.js
+
+ local GENTOO_PREFS="${ED}${PREFS_DIR}/gentoo-prefs.js"
+
+ # Set dictionary path to use system hunspell
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set spellchecker.dictionary_path pref"
+ pref("spellchecker.dictionary_path", "${EPREFIX}/usr/share/myspell");
+ EOF
+
+ # Force hwaccel prefs if USE=hwaccel is enabled
+ if use hwaccel ; then
+ cat "${FILESDIR}"/gentoo-hwaccel-prefs.js-r2 \
+ >>"${GENTOO_PREFS}" \
+ || die "failed to add prefs to force hardware-accelerated rendering to all-gentoo.js"
+
+ if use wayland; then
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set hwaccel wayland prefs"
+ pref("gfx.x11-egl.force-enabled", false);
+ EOF
+ else
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set hwaccel x11 prefs"
+ pref("gfx.x11-egl.force-enabled", true);
+ EOF
+ fi
+
+ # Install the vaapitest binary on supported arches (122.0 supports all platforms, bmo#1865969)
+ exeinto "${MOZILLA_FIVE_HOME}"
+ doexe "${BUILD_DIR}"/dist/bin/vaapitest
+
+ # Install the v4l2test on supported arches (+ arm, + riscv64 when keyworded)
+ if use arm64 ; then
+ exeinto "${MOZILLA_FIVE_HOME}"
+ doexe "${BUILD_DIR}"/dist/bin/v4l2test
+ fi
+ fi
+
+ if ! use gmp-autoupdate ; then
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ einfo "Disabling auto-update for ${plugin} plugin ..."
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable autoupdate for ${plugin} media plugin"
+ pref("media.${plugin}.autoupdate", false);
+ EOF
+ done
+ fi
+
+ # Force the graphite pref if USE=system-harfbuzz is enabled, since the pref cannot disable it
+ if use system-harfbuzz ; then
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set gfx.font_rendering.graphite.enabled pref"
+ sticky_pref("gfx.font_rendering.graphite.enabled", true);
+ EOF
+ fi
+
+ # Add telemetry config prefs, just in case something happens in future and telemetry build
+ # options stop working.
+ if ! use telemetry ; then
+ cat "${FILESDIR}"/gentoo-telemetry-prefs.js >>"${GENTOO_PREFS}" || die "failed to set telemetry prefs"
+ fi
+
+ # Install icons
+ local icon_srcdir="${S}/browser/branding/official"
+
+ # Prefer the upstream svg file they use when packaging flatpak so it's always up-to-date.
+ insinto /usr/share/icons/hicolor/symbolic/apps
+ newins "${S}"/browser/installer/linux/app/flatpak/files/share/icons/hicolor/symbolic/apps/org.mozilla.firefox-symbolic.svg firefox-symbolic.svg
+ dosym -r /usr/share/icons/hicolor/symbolic/apps/firefox-symbolic.svg /usr/share/icons/hicolor/symbolic/apps/org.mozilla.firefox-symbolic.svg
+
+ local icon size
+ for icon in "${icon_srcdir}"/default*.png ; do
+ size=${icon%.png}
+ size=${size##*/default}
+
+ if [[ ${size} -eq 48 ]] ; then
+ newicon "${icon}" ${PN}.png
+ fi
+
+ newicon -s ${size} "${icon}" ${PN}.png
+ done
+
+ # Install menu
+ local app_name="Mozilla ${MOZ_PN^}"
+ local desktop_file="${FILESDIR}/icon/${PN}-r3.desktop"
+ local exec_command="${PN}"
+ local icon="${PN}"
+ local use_wayland="false"
+
+ if [[ -n ${MOZ_ESR} ]] ; then
+ local desktop_filename="${PN}-esr.desktop"
+ else
+ local desktop_filename="${PN}.desktop"
+ fi
+
+ if use wayland ; then
+ use_wayland="true"
+ fi
+
+ cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die
+
+ sed -i \
+ -e "s:@NAME@:${app_name}:" \
+ -e "s:@EXEC@:${exec_command}:" \
+ -e "s:@ICON@:${icon}:" \
+ "${WORKDIR}/${PN}.desktop-template" || die
+
+ newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}"
+
+ rm "${WORKDIR}/${PN}.desktop-template" || die
+
+ if use gnome-shell ; then
+ # Install search provider for Gnome
+ insinto /usr/share/gnome-shell/search-providers/
+ doins browser/components/shell/search-provider-files/org.mozilla.firefox.search-provider.ini
+
+ insinto /usr/share/dbus-1/services/
+ doins browser/components/shell/search-provider-files/org.mozilla.firefox.SearchProvider.service
+
+ # Toggle between rapid and esr desktop file names
+ if [[ -n ${MOZ_ESR} ]] ; then
+ sed -e "s/firefox.desktop/${desktop_filename}/g" \
+ -i "${ED}/usr/share/gnome-shell/search-providers/org.mozilla.firefox.search-provider.ini" ||
+ die "Failed to sed org.mozilla.firefox.search-provider.ini file."
+ fi
+
+ # Make the dbus service aware of a previous session, bgo#939196
+ sed -e \
+ "s/Exec=\/usr\/bin\/firefox/Exec=\/usr\/$(get_libdir)\/firefox\/firefox --dbus-service \/usr\/bin\/firefox/g" \
+ -i "${ED}/usr/share/dbus-1/services/org.mozilla.firefox.SearchProvider.service" ||
+ die "Failed to sed org.mozilla.firefox.SearchProvider.service dbus file"
+
+ # Update prefs to enable Gnome search provider
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to enable gnome-search-provider via prefs"
+ pref("browser.gnome-search-provider.enabled", true);
+ EOF
+ fi
+
+ # Install wrapper script
+ [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}"
+ newbin "${FILESDIR}/${PN}-r1.sh" ${PN}
+
+ # Update wrapper
+ sed -i \
+ -e "s:@PREFIX@:${EPREFIX}/usr:" \
+ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \
+ "${ED}/usr/bin/${PN}" || die
+
+ readme.gentoo_create_doc
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+
+ if ! use gmp-autoupdate ; then
+ elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"
+ elog "installing into new profiles:"
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ elog "\t ${plugin}"
+ done
+ elog
+ fi
+
+ # bug 835078
+ if use hwaccel && has_version "x11-drivers/xf86-video-nouveau"; then
+ ewarn "You have nouveau drivers installed in your system and 'hwaccel' "
+ ewarn "enabled for Firefox. Nouveau / your GPU might not support the "
+ ewarn "required EGL, so either disable 'hwaccel' or try the workaround "
+ ewarn "explained in https://bugs.gentoo.org/835078#c5 if Firefox crashes."
+ fi
+
+ readme.gentoo_print_elog
+
+ optfeature_header "Optional programs for extra features:"
+ optfeature "desktop notifications" x11-libs/libnotify
+ optfeature "fallback mouse cursor theme e.g. on WMs" gnome-base/gsettings-desktop-schemas
+ optfeature "screencasting with pipewire" sys-apps/xdg-desktop-portal
+ if use hwaccel && has_version "x11-drivers/nvidia-drivers"; then
+ optfeature "hardware acceleration with NVIDIA cards" media-libs/nvidia-vaapi-driver
+ fi
+
+ if ! has_version "sys-libs/glibc"; then
+ elog
+ elog "glibc not found! You won't be able to play DRM content."
+ elog "See Gentoo bug #910309 or upstream bug #1843683."
+ elog
+ fi
+}
diff --git a/www-client/firefox/firefox-151.0.2.ebuild b/www-client/firefox/firefox-151.0.2.ebuild
new file mode 100644
index 000000000000..978966b6adf0
--- /dev/null
+++ b/www-client/firefox/firefox-151.0.2.ebuild
@@ -0,0 +1,1384 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+FIREFOX_PATCHSET="firefox-151-patches-01.tar.xz"
+
+LLVM_COMPAT=( 21 22 )
+
+# This will also filter rust versions that don't match LLVM_COMPAT in the non-clang path; this is fine.
+RUST_NEEDS_LLVM=1
+RUST_MIN_VER=1.90.0
+
+PYTHON_COMPAT=( python3_{12..14} )
+PYTHON_REQ_USE="ncurses,sqlite,ssl"
+
+VIRTUALX_REQUIRED="manual"
+
+# Information about the bundled wasi toolchain from
+# https://github.com/WebAssembly/wasi-sdk/
+WASI_SDK_VER=32.0
+WASI_SDK_LLVM_VER=22
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+ SLOT="esr"
+else
+ HOMEPAGE="https://www.firefox.com"
+ SLOT="rapid"
+fi
+
+MOZ_PN="${PN%-bin}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+inherit check-reqs desktop flag-o-matic gnome2-utils linux-info llvm-r1 multiprocessing \
+ optfeature pax-utils python-any-r1 readme.gentoo-r1 rust toolchain-funcs virtualx xdg
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+if [[ ${PV} == *_rc* ]] ; then
+ MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/candidates/${MOZ_PV}-candidates/build${PV##*_rc}"
+fi
+
+PATCH_URIS=(
+ https://dev.gentoo.org/~juippis/mozilla/patchsets/${FIREFOX_PATCHSET}
+)
+
+DESCRIPTION="Firefox Web Browser"
+SRC_URI="${MOZ_SRC_BASE_URI}/source/${MOZ_P}.source.tar.xz -> ${MOZ_P_DISTFILES}.source.tar.xz
+ ${PATCH_URIS[@]}
+ wasm-sandbox? (
+ amd64? ( https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VER/.*/}/wasi-sdk-${WASI_SDK_VER}-x86_64-linux.tar.gz )
+ arm64? ( https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VER/.*/}/wasi-sdk-${WASI_SDK_VER}-arm64-linux.tar.gz )
+ )"
+
+S="${WORKDIR}/${PN}-${PV%_*}"
+LICENSE="MPL-2.0 GPL-2 LGPL-2.1"
+KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~riscv ~x86"
+
+IUSE="+clang dbus debug eme-free hardened hwaccel jack libproxy pgo pulseaudio selinux sndio"
+IUSE+=" +system-av1 +system-harfbuzz +system-icu +system-jpeg +system-libevent +system-libvpx"
+IUSE+=" system-pipewire system-png +system-webp test valgrind wayland wifi +X"
+
+# Firefox-only IUSE
+IUSE+=" +gmp-autoupdate gnome-shell jpegxl +jumbo-build openh264 +telemetry wasm-sandbox"
+
+REQUIRED_USE="|| ( X wayland )
+ debug? ( !system-av1 )
+ pgo? ( jumbo-build )
+ wayland? ( dbus )
+ wifi? ( dbus )
+"
+
+RESTRICT="!test? ( test )"
+
+FF_ONLY_DEPEND="!www-client/firefox:0
+ selinux? ( sec-policy/selinux-mozilla )"
+BDEPEND="${PYTHON_DEPS}
+ $(llvm_gen_dep '
+ llvm-core/clang:${LLVM_SLOT}
+ llvm-core/llvm:${LLVM_SLOT}
+ clang? (
+ llvm-core/lld:${LLVM_SLOT}
+ pgo? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[profile] )
+ )
+ wasm-sandbox? ( llvm-core/lld:${LLVM_SLOT} )
+ ')
+ app-alternatives/awk
+ app-arch/unzip
+ app-arch/zip
+ >=dev-util/cbindgen-0.29.1
+ net-libs/nodejs
+ virtual/pkgconfig
+ amd64? ( >=dev-lang/nasm-2.14 )
+ x86? ( >=dev-lang/nasm-2.14 )
+ pgo? (
+ X? (
+ sys-devel/gettext
+ x11-base/xorg-server[xvfb]
+ x11-apps/xhost
+ )
+ !X? (
+ gui-wm/tinywl
+ x11-misc/xkeyboard-config
+ )
+ )"
+COMMON_DEPEND="${FF_ONLY_DEPEND}
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ dev-libs/glib:2
+ dev-libs/libffi:=
+ >=dev-libs/nss-3.123.1
+ >=dev-libs/nspr-4.39
+ media-libs/alsa-lib
+ media-libs/fontconfig
+ media-libs/freetype
+ media-libs/mesa
+ media-video/ffmpeg
+ virtual/zlib:=
+ virtual/freedesktop-icon-theme
+ x11-libs/cairo
+ x11-libs/gdk-pixbuf:2
+ x11-libs/libdrm
+ x11-libs/pango
+ x11-libs/pixman
+ dbus? (
+ sys-apps/dbus
+ )
+ jack? ( virtual/jack )
+ pulseaudio? (
+ || (
+ media-libs/libpulse
+ >=media-sound/apulse-0.1.12-r4[sdk]
+ )
+ )
+ libproxy? ( net-libs/libproxy )
+ selinux? ( sec-policy/selinux-mozilla )
+ sndio? ( >=media-sound/sndio-1.8.0-r1 )
+ system-av1? (
+ >=media-libs/dav1d-1.0.0:=
+ >=media-libs/libaom-3.10.0:=
+ )
+ system-harfbuzz? (
+ >=media-libs/harfbuzz-2.8.1:0=
+ !wasm-sandbox? ( >=media-gfx/graphite2-1.3.13 )
+ )
+ system-icu? ( >=dev-libs/icu-78.1:= )
+ system-jpeg? ( >=media-libs/libjpeg-turbo-1.2.1:= )
+ system-libevent? ( >=dev-libs/libevent-2.1.12:0=[threads(+)] )
+ system-libvpx? ( >=media-libs/libvpx-1.8.2:0=[postproc] )
+ system-pipewire? ( >=media-video/pipewire-1.4.7-r2:= )
+ system-png? ( >=media-libs/libpng-1.6.45:0=[apng] )
+ system-webp? ( >=media-libs/libwebp-1.1.0:0= )
+ valgrind? ( dev-debug/valgrind )
+ wayland? (
+ >=media-libs/libepoxy-1.5.10-r1
+ x11-libs/gtk+:3[wayland]
+ )
+ wifi? (
+ kernel_linux? (
+ || (
+ net-misc/networkmanager
+ net-misc/connman[networkmanager]
+ )
+ sys-apps/dbus
+ )
+ )
+ X? (
+ virtual/opengl
+ x11-libs/cairo[X]
+ x11-libs/gtk+:3[X]
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXrandr
+ x11-libs/libxcb:=
+ )"
+RDEPEND="${COMMON_DEPEND}
+ hwaccel? (
+ media-video/libva-utils
+ sys-apps/pciutils
+ )
+ jack? ( virtual/jack )
+ openh264? ( media-libs/openh264:*[plugin] )"
+DEPEND="${COMMON_DEPEND}
+ X? (
+ x11-base/xorg-proto
+ x11-libs/libICE
+ x11-libs/libSM
+ )"
+
+# ESR and rapid dependencies.
+if [[ -n ${MOZ_ESR} ]] ; then
+ RDEPEND+=" !www-client/firefox:rapid"
+else
+ RDEPEND+=" !www-client/firefox:esr"
+fi
+
+# Firefox-only RDEPEND
+RDEPEND+=" ~www-client/firefox-l10n-${PV}"
+
+# Allow MOZ_GMP_PLUGIN_LIST to be set in an eclass or
+# overridden in the enviromnent (advanced hackers only)
+if [[ -z "${MOZ_GMP_PLUGIN_LIST+set}" ]] ; then
+ MOZ_GMP_PLUGIN_LIST=( gmp-gmpopenh264 gmp-widevinecdm )
+fi
+
+llvm_check_deps() {
+ if ! has_version -b "llvm-core/clang:${LLVM_SLOT}" ; then
+ einfo "llvm-core/clang:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+
+ if use clang && ! tc-ld-is-mold ; then
+ if ! has_version -b "llvm-core/lld:${LLVM_SLOT}" ; then
+ einfo "llvm-core/lld:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+ fi
+
+ if use pgo ; then
+ if ! has_version -b "=llvm-runtimes/compiler-rt-sanitizers-${LLVM_SLOT}*[profile]" ; then
+ einfo "=llvm-runtimes/compiler-rt-sanitizers-${LLVM_SLOT}*[profile] is missing!" >&2
+ einfo "Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+ fi
+
+ einfo "Using LLVM slot ${LLVM_SLOT} to build" >&2
+}
+
+moz_clear_vendor_checksums() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -ne 1 ]] ; then
+ die "${FUNCNAME} requires exact one argument"
+ fi
+
+ einfo "Clearing cargo checksums for ${1} ..."
+
+ sed -i \
+ -e 's/\("files":{\)[^}]*/\1/' \
+ "${S}"/third_party/rust/${1}/.cargo-checksum.json || die
+}
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+mozconfig_add_options_ac() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local reason=${1}
+ shift
+
+ local option
+ for option in ${@} ; do
+ echo "ac_add_options ${option} # ${reason}" >>${MOZCONFIG}
+ done
+}
+
+mozconfig_add_options_mk() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local reason=${1}
+ shift
+
+ local option
+ for option in ${@} ; do
+ echo "mk_add_options ${option} # ${reason}" >>${MOZCONFIG}
+ done
+}
+
+mozconfig_use_enable() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 1 ]] ; then
+ die "${FUNCNAME} requires at least one arguments"
+ fi
+
+ local flag=$(use_enable "${@}")
+ mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}"
+}
+
+mozconfig_use_with() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 1 ]] ; then
+ die "${FUNCNAME} requires at least one arguments"
+ fi
+
+ local flag=$(use_with "${@}")
+ mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}"
+}
+
+virtwl() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ [[ $# -lt 1 ]] && die "${FUNCNAME} needs at least one argument"
+ [[ -n $XDG_RUNTIME_DIR ]] || die "${FUNCNAME} needs XDG_RUNTIME_DIR to be set; try xdg_environment_reset"
+ tinywl -h >/dev/null || die 'tinywl -h failed'
+
+ local VIRTWL VIRTWL_PID
+ coproc VIRTWL { WLR_BACKENDS=headless exec tinywl -s 'echo $WAYLAND_DISPLAY; read _; kill $PPID'; }
+ local -x WAYLAND_DISPLAY
+ read WAYLAND_DISPLAY <&${VIRTWL[0]}
+
+ debug-print "${FUNCNAME}: $@"
+ "$@"
+ local r=$?
+
+ [[ -n $VIRTWL_PID ]] || die "tinywl exited unexpectedly"
+ exec {VIRTWL[0]}<&- {VIRTWL[1]}>&-
+ return $r
+}
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]] ; then
+ # Ensure we have enough disk space to compile
+ if use pgo || use debug ; then
+ CHECKREQS_DISK_BUILD="18700M"
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and pgo detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling pgo."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable pgo when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+pgo cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ elif tc-is-lto ; then
+ CHECKREQS_DISK_BUILD="10900M"
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and lto detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling lto."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable lto when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+lto cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ else
+ CHECKREQS_DISK_BUILD="9700M"
+ fi
+
+ check-reqs_pkg_pretend
+ fi
+}
+
+pkg_setup() {
+
+ # Get LTO from environment; export after this phase for use in src_configure (etc)
+ use_lto=no
+
+ if [[ ${MERGE_TYPE} != binary ]] ; then
+
+ if tc-is-lto; then
+ use_lto=yes
+ # LTO is handled via configure
+ filter-lto
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and pgo detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling lto."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable lto when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+lto cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ fi
+
+ if use pgo ; then
+ if ! has userpriv ${FEATURES} ; then
+ eerror "Building ${PN} with USE=pgo and FEATURES=-userpriv is not supported!"
+ fi
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and lto detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling pgo."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable pgo when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+pgo cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ fi
+
+ if [[ ${use_lto} = yes ]]; then
+ # -Werror=lto-type-mismatch -Werror=odr are going to fail with GCC,
+ # bmo#1516758, bgo#942288
+ filter-flags -Werror=lto-type-mismatch -Werror=odr
+ fi
+
+ # Ensure we have enough disk space to compile
+ if use pgo || use debug ; then
+ CHECKREQS_DISK_BUILD="18700M"
+ elif [[ ${use_lto} == "yes" ]] ; then
+ CHECKREQS_DISK_BUILD="10900M"
+ else
+ CHECKREQS_DISK_BUILD="9700M"
+ fi
+
+ check-reqs_pkg_setup
+ llvm-r1_pkg_setup
+ rust_pkg_setup
+ python-any-r1_pkg_setup
+
+ # Avoid PGO profiling problems due to enviroment leakage
+ # These should *always* be cleaned up anyway
+ unset \
+ DBUS_SESSION_BUS_ADDRESS \
+ DISPLAY \
+ ORBIT_SOCKETDIR \
+ SESSION_MANAGER \
+ XAUTHORITY \
+ XDG_CACHE_HOME \
+ XDG_SESSION_COOKIE
+
+ # Build system is using /proc/self/oom_score_adj, bug #604394
+ addpredict /proc/self/oom_score_adj
+
+ if use pgo ; then
+ # Update 105.0: "/proc/self/oom_score_adj" isn't enough anymore with pgo, but not sure
+ # whether that's due to better OOM handling by Firefox (bmo#1771712), or portage
+ # (PORTAGE_SCHEDULING_POLICY) update...
+ addpredict /proc
+
+ # Clear tons of conditions, since PGO is hardware-dependant.
+ addpredict /dev
+ fi
+
+ if ! mountpoint -q /dev/shm ; then
+ # If /dev/shm is not available, configure is known to fail with
+ # a traceback report referencing /usr/lib/pythonN.N/multiprocessing/synchronize.py
+ ewarn "/dev/shm is not mounted -- expect build failures!"
+ fi
+
+ # Google API keys (see http://www.chromium.org/developers/how-tos/api-keys)
+ # Note: These are for Gentoo Linux use ONLY. For your own distribution, please
+ # get your own set of keys.
+ if [[ -z "${MOZ_API_KEY_GOOGLE+set}" ]] ; then
+ MOZ_API_KEY_GOOGLE="AIzaSyDEAOvatFogGaPi0eTgsV_ZlEzx0ObmepsMzfAc"
+ fi
+
+ if [[ -z "${MOZ_API_KEY_LOCATION+set}" ]] ; then
+ MOZ_API_KEY_LOCATION="AIzaSyB2h2OuRgGaPicUgy5N-5hsZqiPW6sH3n_rptiQ"
+ fi
+
+ # Mozilla API keys (see https://location.services.mozilla.com/api)
+ # Note: These are for Gentoo Linux use ONLY. For your own distribution, please
+ # get your own set of keys.
+ if [[ -z "${MOZ_API_KEY_MOZILLA+set}" ]] ; then
+ MOZ_API_KEY_MOZILLA="edb3d487-3a84-46m0ap1e3-9dfd-92b5efaaa005"
+ fi
+
+ # Ensure we use C locale when building, bug #746215
+ export LC_ALL=C
+ fi
+
+ export use_lto
+
+ CONFIG_CHECK="~SECCOMP"
+ WARNING_SECCOMP="CONFIG_SECCOMP not set! This system will be unable to play DRM-protected content."
+ linux-info_pkg_setup
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ unpack ${_src_file}
+ fi
+ done
+}
+
+src_prepare() {
+ if [[ ${use_lto} == "yes" ]]; then
+ rm -v "${WORKDIR}"/firefox-patches/*-LTO-Only-enable-LTO-*.patch || die
+ fi
+
+ # Workaround for bgo#915651 and bmo#1988166 on musl
+ if use elibc_glibc ; then
+ rm -v "${WORKDIR}"/firefox-patches/*bgo-748849-RUST_TARGET_override.patch || die
+ rm -v "${WORKDIR}"/firefox-patches/*bmo-1988166-musl-remove-nonexisting-system-header-req.patch || die
+ rm -v "${WORKDIR}"/firefox-patches/*bgo-967694-musl-prctrl-exception-on-musl.patch || die
+ fi
+
+ eapply "${WORKDIR}/firefox-patches"
+
+ # Allow user to apply any additional patches without modifing ebuild
+ eapply_user
+
+ # Make cargo respect MAKEOPTS
+ export CARGO_BUILD_JOBS="$(makeopts_jobs)"
+
+ # Workaround for bgo#915651
+ if ! use elibc_glibc ; then
+ if use amd64 ; then
+ export RUST_TARGET="x86_64-unknown-linux-musl"
+ elif use x86 ; then
+ export RUST_TARGET="i686-unknown-linux-musl"
+ elif use arm64 ; then
+ export RUST_TARGET="aarch64-unknown-linux-musl"
+ elif use loong; then
+ # Only the LP64D ABI of LoongArch64 is actively supported among
+ # the wider Linux ecosystem, so the assumption is safe.
+ export RUST_TARGET="loongarch64-unknown-linux-musl"
+ elif use ppc64 ; then
+ export RUST_TARGET="powerpc64le-unknown-linux-musl"
+ elif use riscv ; then
+ # We can pretty safely rule out any 32-bit riscvs, but 64-bit riscvs also have tons of
+ # different ABIs available. riscv64gc-unknown-linux-musl seems to be the best working
+ # guess right now though.
+ elog "riscv detected, forcing a riscv64 target for now."
+ export RUST_TARGET="riscv64gc-unknown-linux-musl"
+ else
+ die "Unknown musl chost, please post a new bug with your rustc -vV along with emerge --info"
+ fi
+ fi
+
+ # Pre-built wasm-sandbox path manipulation.
+ if use wasm-sandbox ; then
+ if use amd64 ; then
+ export wasi_arch="x86_64"
+ elif use arm64 ; then
+ export wasi_arch="arm64"
+ else
+ die "wasm-sandbox enabled on unknown/unsupported arch!"
+ fi
+
+ sed -i \
+ -e "s:%%PORTAGE_WORKDIR%%:${WORKDIR}:" \
+ -e "s:%%WASI_ARCH%%:${wasi_arch}:" \
+ -e "s:%%WASI_SDK_VER%%:${WASI_SDK_VER}:" \
+ -e "s:%%WASI_SDK_LLVM_VER%%:${WASI_SDK_LLVM_VER}:" \
+ toolkit/moz.configure || die "Failed to update wasi-related paths."
+ fi
+
+ # Make LTO respect MAKEOPTS
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/build/moz.configure/lto-pgo.configure || die "Failed sedding multiprocessing.cpu_count"
+
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/third_party/chromium/build/toolchain/get_cpu_count.py || die "Failed sedding multiprocessing.cpu_count"
+
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/third_party/python/gyp/pylib/gyp/input.py || die "Failed sedding multiprocessing.cpu_count"
+
+ # sed-in toolchain prefix
+ sed -i \
+ -e "s/objdump/${CHOST}-objdump/" \
+ "${S}"/python/mozbuild/mozbuild/configure/check_debug_ranges.py || die "sed failed to set toolchain prefix"
+
+ sed -i \
+ -e 's/ccache_stats = None/return None/' \
+ "${S}"/python/mozbuild/mozbuild/controller/building.py || die "sed failed to disable ccache stats call"
+
+ einfo "Removing pre-built binaries ..."
+
+ find "${S}"/third_party -type f \( -name '*.so' -o -name '*.o' \) -print -delete || die
+
+ # Clear checksums from cargo crates we've manually patched.
+ # moz_clear_vendor_checksums xyz
+ # glslopt: bgo#969412
+ moz_clear_vendor_checksums glslopt
+ moz_clear_vendor_checksums encoding_rs
+
+ # Respect choice for "jumbo-build"
+ # Changing the value for FILES_PER_UNIFIED_FILE may not work, see #905431
+ if [[ -n ${FILES_PER_UNIFIED_FILE} ]] && use jumbo-build; then
+ local my_files_per_unified_file=${FILES_PER_UNIFIED_FILE:=16}
+ elog ""
+ elog "jumbo-build defaults modified to ${my_files_per_unified_file}."
+ elog "if you get a build failure, try undefining FILES_PER_UNIFIED_FILE,"
+ elog "if that fails try -jumbo-build before opening a bug report."
+ elog ""
+
+ sed -i -e "s/\"FILES_PER_UNIFIED_FILE\", 16/\"FILES_PER_UNIFIED_FILE\", "${my_files_per_unified_file}"/" \
+ python/mozbuild/mozbuild/frontend/data.py ||
+ die "Failed to adjust FILES_PER_UNIFIED_FILE in python/mozbuild/mozbuild/frontend/data.py"
+ sed -i -e "s/FILES_PER_UNIFIED_FILE = 6/FILES_PER_UNIFIED_FILE = "${my_files_per_unified_file}"/" \
+ js/src/moz.build ||
+ die "Failed to adjust FILES_PER_UNIFIED_FILE in js/src/moz.build"
+ fi
+
+ # Create build dir
+ BUILD_DIR="${WORKDIR}/${PN}_build"
+ mkdir -p "${BUILD_DIR}" || die
+
+ # Write API keys to disk
+ echo -n "${MOZ_API_KEY_GOOGLE//gGaPi/}" > "${S}"/api-google.key || die
+ echo -n "${MOZ_API_KEY_LOCATION//gGaPi/}" > "${S}"/api-location.key || die
+ echo -n "${MOZ_API_KEY_MOZILLA//m0ap1/}" > "${S}"/api-mozilla.key || die
+
+ xdg_environment_reset
+}
+
+src_configure() {
+ # Show flags set at the beginning
+ einfo "Current BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}"
+ einfo "Current CFLAGS:\t\t${CFLAGS:-no value set}"
+ einfo "Current CXXFLAGS:\t\t${CXXFLAGS:-no value set}"
+ einfo "Current LDFLAGS:\t\t${LDFLAGS:-no value set}"
+ einfo "Current RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}"
+
+ local have_switched_compiler=
+ if use clang; then
+ # Force clang
+ einfo "Enforcing the use of clang due to USE=clang ..."
+
+ local version_clang=$(clang --version 2>/dev/null | grep -F -- 'clang version' | awk '{ print $3 }')
+ [[ -n ${version_clang} ]] && version_clang=$(ver_cut 1 "${version_clang}")
+ [[ -z ${version_clang} ]] && die "Failed to read clang version!"
+
+ if tc-is-gcc; then
+ have_switched_compiler=yes
+ fi
+
+ AR=llvm-ar
+ CC=${CHOST}-clang-${version_clang}
+ CXX=${CHOST}-clang++-${version_clang}
+ NM=llvm-nm
+ RANLIB=llvm-ranlib
+ elif ! use clang && ! tc-is-gcc ; then
+ # Force gcc
+ have_switched_compiler=yes
+ einfo "Enforcing the use of gcc due to USE=-clang ..."
+ AR=gcc-ar
+ CC=${CHOST}-gcc
+ CXX=${CHOST}-g++
+ NM=gcc-nm
+ RANLIB=gcc-ranlib
+ fi
+
+ if [[ -n "${have_switched_compiler}" ]] ; then
+ # Because we switched active compiler we have to ensure
+ # that no unsupported flags are set
+ strip-unsupported-flags
+ fi
+
+ # Ensure we use correct toolchain,
+ # AS is used in a non-standard way by upstream, #bmo1654031
+ export HOST_CC="$(tc-getBUILD_CC)"
+ export HOST_CXX="$(tc-getBUILD_CXX)"
+ export AS="$(tc-getCC) -c"
+
+ # Configuration tests expect llvm-readelf output, bug 913130
+ READELF="llvm-readelf"
+
+ tc-export CC CXX LD AR AS NM OBJDUMP RANLIB READELF PKG_CONFIG
+
+ # Pass the correct toolchain paths through cbindgen
+ if tc-is-cross-compiler ; then
+ export BINDGEN_CFLAGS="${SYSROOT:+--sysroot=${ESYSROOT}} --target=${CHOST} ${BINDGEN_CFLAGS-}"
+ fi
+
+ # Set MOZILLA_FIVE_HOME
+ export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${PN}"
+
+ # python/mach/mach/mixin/process.py fails to detect SHELL
+ export SHELL="${EPREFIX}/bin/bash"
+
+ # Set state path
+ export MOZBUILD_STATE_PATH="${BUILD_DIR}"
+
+ # Set MOZCONFIG
+ export MOZCONFIG="${S}/.mozconfig"
+
+ # Initialize MOZCONFIG
+ mozconfig_add_options_ac '' --enable-application=browser
+ mozconfig_add_options_ac '' --enable-project=browser
+
+ # Set Gentoo defaults
+ if use telemetry; then
+ export MOZILLA_OFFICIAL=1
+ fi
+
+ mozconfig_add_options_ac 'Gentoo default' \
+ --allow-addon-sideload \
+ --disable-cargo-incremental \
+ --disable-crashreporter \
+ --disable-disk-remnant-avoidance \
+ --disable-geckodriver \
+ --disable-install-strip \
+ --disable-legacy-profile-creation \
+ --disable-parental-controls \
+ --disable-strip \
+ --disable-updater \
+ --disable-wmf \
+ --enable-negotiateauth \
+ --enable-new-pass-manager \
+ --enable-official-branding \
+ --enable-packed-relative-relocs \
+ --enable-release \
+ --enable-system-policies \
+ --host="${CBUILD:-${CHOST}}" \
+ --libdir="${EPREFIX}/usr/$(get_libdir)" \
+ --prefix="${EPREFIX}/usr" \
+ --target="${CHOST}" \
+ --without-ccache \
+ --with-intl-api \
+ --with-libclang-path="$(llvm-config --libdir)" \
+ --with-system-ffi \
+ --with-system-gbm \
+ --with-system-libdrm \
+ --with-system-nspr \
+ --with-system-nss \
+ --with-system-pixman \
+ --with-system-zlib \
+ --with-toolchain-prefix="${CHOST}-" \
+ --with-unsigned-addon-scopes=app,system
+
+ # Set update channel
+ local update_channel=release
+ [[ -n ${MOZ_ESR} ]] && update_channel=esr
+ mozconfig_add_options_ac '' --enable-update-channel=${update_channel}
+
+ # Whitelist to allow unkeyworded arches to build with "--disable-rust-simd" by default.
+ if use amd64 || use arm64 || use ppc64 || use loong || use riscv ; then
+ mozconfig_add_options_ac '' --enable-rust-simd
+ fi
+
+ # For future keywording: This is currently (97.0) only supported on:
+ # amd64, arm, arm64 & x86.
+ # Might want to flip the logic around if Firefox is to support more arches.
+ # bug 833001, bug 903411#c8
+ if use loong || use ppc64 || use riscv; then
+ mozconfig_add_options_ac '' --disable-sandbox
+ elif use valgrind; then
+ mozconfig_add_options_ac 'valgrind requirement' --disable-sandbox
+ else
+ mozconfig_add_options_ac '' --enable-sandbox
+ fi
+
+ # riscv-related options, bgo#947337, bgo#947338
+ if use riscv ; then
+ mozconfig_add_options_ac 'Disable webrtc for RISC-V' --disable-webrtc
+ fi
+
+ if [[ -s "${S}/api-google.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-google.key" | md5sum | awk '{ print $1 }') != 709560c02f94b41f9ad2c49207be6c54 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-google-safebrowsing-api-keyfile="${S}/api-google.key"
+ else
+ einfo "Building without Google API key ..."
+ fi
+
+ if [[ -s "${S}/api-location.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-location.key" | md5sum | awk '{ print $1 }') != ffb7895e35dedf832eb1c5d420ac7420 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-google-location-service-api-keyfile="${S}/api-location.key"
+ else
+ einfo "Building without Location API key ..."
+ fi
+
+ if [[ -s "${S}/api-mozilla.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-mozilla.key" | md5sum | awk '{ print $1 }') != 3927726e9442a8e8fa0e46ccc39caa27 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-mozilla-api-keyfile="${S}/api-mozilla.key"
+ else
+ einfo "Building without Mozilla API key ..."
+ fi
+
+ mozconfig_use_with system-av1
+ mozconfig_use_with system-harfbuzz
+ mozconfig_use_with system-icu
+ mozconfig_use_with system-jpeg
+ mozconfig_use_with system-libevent
+ mozconfig_use_with system-libvpx
+ mozconfig_use_with system-pipewire
+ mozconfig_use_with system-png
+ mozconfig_use_with system-webp
+
+ mozconfig_use_enable dbus
+ mozconfig_use_enable libproxy
+ mozconfig_use_enable valgrind
+
+ use eme-free && mozconfig_add_options_ac '+eme-free' --disable-eme
+
+ if use hardened ; then
+ mozconfig_add_options_ac "+hardened" --enable-hardening
+ mozconfig_add_options_ac "+hardened stl" --enable-stl-hardening
+ append-ldflags "-Wl,-z,relro -Wl,-z,now"
+
+ # Increase the FORTIFY_SOURCE value, #910071.
+ sed -i -e '/-D_FORTIFY_SOURCE=/s:2:3:' "${S}"/build/moz.configure/toolchain.configure || die
+ fi
+
+ local myaudiobackends=""
+ use jack && myaudiobackends+="jack,"
+ use sndio && myaudiobackends+="sndio,"
+ use pulseaudio && myaudiobackends+="pulseaudio,"
+ ! use pulseaudio && myaudiobackends+="alsa,"
+
+ mozconfig_add_options_ac '--enable-audio-backends' --enable-audio-backends="${myaudiobackends::-1}"
+
+ mozconfig_use_enable wifi necko-wifi
+
+ ! use jumbo-build && mozconfig_add_options_ac '--disable-unified-build' --disable-unified-build
+
+ if use X && use wayland ; then
+ mozconfig_add_options_ac '+x11+wayland' --enable-default-toolkit=cairo-gtk3-x11-wayland
+ elif ! use X && use wayland ; then
+ mozconfig_add_options_ac '+wayland' --enable-default-toolkit=cairo-gtk3-wayland-only
+ else
+ mozconfig_add_options_ac '+x11' --enable-default-toolkit=cairo-gtk3-x11-only
+ fi
+
+ # wasm-sandbox
+ # Since graphite2 is one of the sandboxed libraries, system-graphite2 obviously can't work with +wasm-sandbox.
+ if use wasm-sandbox ; then
+ mozconfig_add_options_ac '+wasm-sandbox' --with-wasi-sysroot="${WORKDIR}/wasi-sdk-${WASI_SDK_VER}-${wasi_arch}-linux/share/wasi-sysroot/"
+ else
+ mozconfig_add_options_ac 'no wasm-sandbox' --without-wasm-sandboxed-libraries
+ mozconfig_use_with system-harfbuzz system-graphite2
+ fi
+
+ ! use jpegxl && mozconfig_add_options_ac '-jpegxl' --disable-jxl
+
+ if [[ ${use_lto} == "yes" ]] ; then
+ if use clang ; then
+ # Upstream only supports lld or mold when using clang.
+ if tc-ld-is-mold ; then
+ # mold expects the -flto line from *FLAGS configuration, bgo#923119
+ append-ldflags "-flto=thin"
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "forcing ld=lld due to USE=clang and USE=lto" --enable-linker=lld
+ fi
+
+ mozconfig_add_options_ac '+lto' --enable-lto=cross
+
+ else
+ # ThinLTO is currently broken, see bmo#1644409.
+ # mold does not support gcc+lto combination.
+ mozconfig_add_options_ac '+lto' --enable-lto=full
+ mozconfig_add_options_ac "linker is set to bfd" --enable-linker=bfd
+ fi
+
+ else
+ # Avoid auto-magic on linker
+ if use clang ; then
+ # lld is upstream's default
+ if tc-ld-is-mold ; then
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "forcing ld=lld due to USE=clang" --enable-linker=lld
+ fi
+
+ else
+ if tc-ld-is-mold ; then
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "linker is set to bfd due to USE=-clang" --enable-linker=bfd
+ fi
+ fi
+ fi
+
+ # PGO was moved outside lto block to allow building pgo without lto.
+ if use pgo ; then
+ mozconfig_add_options_ac '+pgo' MOZ_PGO=1
+
+ # Avoid compressing just-built instrumented Firefox with
+ # high levels of compression. Just use tar as a container
+ # to save >=10 minutes.
+ export MOZ_PKG_FORMAT=tar
+
+ if use clang ; then
+ # Used in build/pgo/profileserver.py
+ export LLVM_PROFDATA="llvm-profdata"
+ else
+ # Attempt to fix pgo hanging with gcc, bgo#966309.
+ export MOZ_REMOTE_SETTINGS_DEVTOOLS=1
+ fi
+ fi
+
+ mozconfig_use_enable debug
+ if use debug ; then
+ mozconfig_add_options_ac '+debug' --disable-optimize
+ mozconfig_add_options_ac '+debug' --enable-jemalloc
+ mozconfig_add_options_ac '+debug' --enable-real-time-tracing
+ else
+ mozconfig_add_options_ac 'Gentoo defaults' --disable-real-time-tracing
+
+ if is-flag '-g*' ; then
+ if use clang ; then
+ mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols=$(get-flag '-g*')
+ else
+ mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols
+ fi
+ else
+ mozconfig_add_options_ac 'Gentoo default' --disable-debug-symbols
+ fi
+
+ if is-flag '-O0' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O0
+ elif is-flag '-O4' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O4
+ elif is-flag '-O3' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O3
+ elif is-flag '-O1' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O1
+ elif is-flag '-Os' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-Os
+ else
+ mozconfig_add_options_ac "Gentoo default" --enable-optimize=-O2
+ fi
+ fi
+
+ # Debug flag was handled via configure
+ filter-flags '-g*'
+
+ # Optimization flag was handled via configure
+ filter-flags '-O*'
+
+ # elf-hack
+ # Filter "-z,pack-relative-relocs" and let the build system handle it instead.
+ if use amd64 || use x86 ; then
+ filter-flags "-z,pack-relative-relocs"
+
+ if tc-ld-is-mold ; then
+ # relr-elf-hack is currently broken with mold, bgo#916259
+ mozconfig_add_options_ac 'disable elf-hack with mold linker' --disable-elf-hack
+ else
+ mozconfig_add_options_ac 'relr elf-hack' --enable-elf-hack=relr
+ fi
+ elif use loong || use ppc64 || use riscv ; then
+ # '--disable-elf-hack' is not recognized on loong/ppc64/riscv,
+ # see bgo #917049, #930046
+ :;
+ else
+ mozconfig_add_options_ac 'disable elf-hack on non-supported arches' --disable-elf-hack
+ fi
+
+ if ! use elibc_glibc; then
+ mozconfig_add_options_ac '!elibc_glibc' --disable-jemalloc
+ fi
+
+ if use valgrind; then
+ mozconfig_add_options_ac 'valgrind requirement' --disable-jemalloc
+ fi
+
+ # System-av1 fix
+ use system-av1 && append-ldflags "-Wl,--undefined-version"
+
+ # Make revdep-rebuild.sh happy; Also required for musl
+ append-ldflags -Wl,-rpath="${MOZILLA_FIVE_HOME}",--enable-new-dtags
+
+ # Pass $MAKEOPTS to build system
+ export MOZ_MAKE_FLAGS="${MAKEOPTS}"
+
+ # Use system's Python environment
+ export PIP_NETWORK_INSTALL_RESTRICTED_VIRTUALENVS=mach
+
+ export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE="none"
+
+ if ! use telemetry; then
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_CRASHREPORTER=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_DATA_REPORTING=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_SERVICES_HEALTHREPORT=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_TELEMETRY_REPORTING=0"
+ fi
+
+ mozconfig_use_enable test tests
+
+ # Disable notification when build system has finished
+ export MOZ_NOSPAM=1
+
+ # Portage sets XARGS environment variable to "xargs -r" by default which
+ # breaks build system's check_prog() function which doesn't support arguments
+ mozconfig_add_options_ac 'Gentoo default' "XARGS=${EPREFIX}/usr/bin/xargs"
+
+ # Set build dir
+ mozconfig_add_options_mk 'Gentoo default' "MOZ_OBJDIR=${BUILD_DIR}"
+
+ # Show flags we will use
+ einfo "Build BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}"
+ einfo "Build CFLAGS:\t\t${CFLAGS:-no value set}"
+ einfo "Build CXXFLAGS:\t\t${CXXFLAGS:-no value set}"
+ einfo "Build LDFLAGS:\t\t${LDFLAGS:-no value set}"
+ einfo "Build RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}"
+
+ # Handle EXTRA_CONF and show summary
+ local ac opt hash reason
+
+ # Apply EXTRA_ECONF entries to $MOZCONFIG
+ if [[ -n ${EXTRA_ECONF} ]] ; then
+ IFS=\! read -a ac <<<${EXTRA_ECONF// --/\!}
+ for opt in "${ac[@]}"; do
+ mozconfig_add_options_ac "EXTRA_ECONF" --${opt#--}
+ done
+ fi
+
+ echo
+ echo "=========================================================="
+ echo "Building ${PF} with the following configuration"
+ grep ^ac_add_options "${MOZCONFIG}" | while read ac opt hash reason; do
+ [[ -z ${hash} || ${hash} == \# ]] \
+ || die "error reading mozconfig: ${ac} ${opt} ${hash} ${reason}"
+ printf " %-30s %s\n" "${opt}" "${reason:-mozilla.org default}"
+ done
+ echo "=========================================================="
+ echo
+
+ if use valgrind; then
+ sed -i -e 's/--enable-optimize=-O[0-9s]/--enable-optimize="-g -O2"/' .mozconfig || die
+ fi
+
+ ./mach configure || die
+}
+
+src_compile() {
+ local virtx_cmd=
+
+ if [[ ${use_lto} == "yes" ]] && tc-ld-is-mold ; then
+ # increase ulimit with mold+lto, bugs #892641, #907485
+ if ! ulimit -n 16384 1>/dev/null 2>&1 ; then
+ ewarn "Unable to modify ulimits - building with mold+lto might fail due to low ulimit -n resources."
+ ewarn "Please see bugs #892641 & #907485."
+ else
+ ulimit -n 16384
+ fi
+ fi
+
+ if use pgo; then
+ # Reset and cleanup environment variables used by GNOME/XDG
+ gnome2_environment_reset
+
+ addpredict /root
+
+ if ! use X; then
+ virtx_cmd=virtwl
+ else
+ virtx_cmd=virtx
+ fi
+ fi
+
+ if ! use X; then
+ local -x GDK_BACKEND=wayland
+ else
+ local -x GDK_BACKEND=x11
+ fi
+
+ ${virtx_cmd} ./mach build --verbose || die
+}
+
+src_test() {
+ # https://firefox-source-docs.mozilla.org/testing/automated-testing/index.html
+ local -a failures=()
+
+ # Some tests respect this
+ local -x MOZ_HEADLESS=1
+
+ # Check testing/mach_commands.py
+ einfo "Testing with cppunittest ..."
+ ./mach cppunittest
+ local ret=$?
+ if [[ ${ret} -ne 0 ]]; then
+ eerror "Test suite cppunittest failed with error code ${ret}"
+ failures+=( cppunittest )
+ fi
+
+ if [[ ${#failures} -eq 0 ]]; then
+ einfo "Test suites succeeded"
+ else
+ die "Test suites failed: ${failures[@]}"
+ fi
+}
+
+src_install() {
+ # xpcshell is getting called during install
+ pax-mark m \
+ "${BUILD_DIR}"/dist/bin/xpcshell \
+ "${BUILD_DIR}"/dist/bin/${PN} \
+ "${BUILD_DIR}"/dist/bin/plugin-container
+
+ DESTDIR="${D}" ./mach install || die
+
+ # Upstream cannot ship symlink but we can (bmo#658850)
+ rm "${ED}${MOZILLA_FIVE_HOME}/${PN}-bin" || die
+ dosym ${PN} ${MOZILLA_FIVE_HOME}/${PN}-bin
+
+ # Don't install llvm-symbolizer from llvm-core/llvm package
+ if [[ -f "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" ]] ; then
+ rm -v "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" || die
+ fi
+
+ insinto "${MOZILLA_FIVE_HOME}/distribution"
+ newins "${FILESDIR}"/distribution.ini distribution.ini
+
+ # Install system-wide preferences
+ local PREFS_DIR="${MOZILLA_FIVE_HOME}/browser/defaults/preferences"
+ insinto "${PREFS_DIR}"
+ newins "${FILESDIR}"/gentoo-default-prefs.js gentoo-prefs.js
+
+ local GENTOO_PREFS="${ED}${PREFS_DIR}/gentoo-prefs.js"
+
+ # Set dictionary path to use system hunspell
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set spellchecker.dictionary_path pref"
+ pref("spellchecker.dictionary_path", "${EPREFIX}/usr/share/myspell");
+ EOF
+
+ # Force hwaccel prefs if USE=hwaccel is enabled
+ if use hwaccel ; then
+ cat "${FILESDIR}"/gentoo-hwaccel-prefs.js-r2 \
+ >>"${GENTOO_PREFS}" \
+ || die "failed to add prefs to force hardware-accelerated rendering to all-gentoo.js"
+
+ if use wayland; then
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set hwaccel wayland prefs"
+ pref("gfx.x11-egl.force-enabled", false);
+ EOF
+ else
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set hwaccel x11 prefs"
+ pref("gfx.x11-egl.force-enabled", true);
+ EOF
+ fi
+
+ # Install the vaapitest binary on supported arches (122.0 supports all platforms, bmo#1865969)
+ exeinto "${MOZILLA_FIVE_HOME}"
+ doexe "${BUILD_DIR}"/dist/bin/vaapitest
+
+ # Install the v4l2test on supported arches (+ arm, + riscv64 when keyworded)
+ if use arm64 ; then
+ exeinto "${MOZILLA_FIVE_HOME}"
+ doexe "${BUILD_DIR}"/dist/bin/v4l2test
+ fi
+ fi
+
+ if ! use gmp-autoupdate ; then
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ einfo "Disabling auto-update for ${plugin} plugin ..."
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable autoupdate for ${plugin} media plugin"
+ pref("media.${plugin}.autoupdate", false);
+ EOF
+ done
+ fi
+
+ # Force the graphite pref if USE=system-harfbuzz is enabled, since the pref cannot disable it
+ if use system-harfbuzz ; then
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set gfx.font_rendering.graphite.enabled pref"
+ sticky_pref("gfx.font_rendering.graphite.enabled", true);
+ EOF
+ fi
+
+ # Add telemetry config prefs, just in case something happens in future and telemetry build
+ # options stop working.
+ if ! use telemetry ; then
+ cat "${FILESDIR}"/gentoo-telemetry-prefs.js >>"${GENTOO_PREFS}" || die "failed to set telemetry prefs"
+ fi
+
+ # Install icons
+ local icon_srcdir="${S}/browser/branding/official"
+
+ # Prefer the upstream svg file they use when packaging flatpak so it's always up-to-date.
+ insinto /usr/share/icons/hicolor/symbolic/apps
+ newins "${S}"/browser/installer/linux/app/flatpak/files/share/icons/hicolor/symbolic/apps/org.mozilla.firefox-symbolic.svg firefox-symbolic.svg
+ dosym -r /usr/share/icons/hicolor/symbolic/apps/firefox-symbolic.svg /usr/share/icons/hicolor/symbolic/apps/org.mozilla.firefox-symbolic.svg
+
+ local icon size
+ for icon in "${icon_srcdir}"/default*.png ; do
+ size=${icon%.png}
+ size=${size##*/default}
+
+ if [[ ${size} -eq 48 ]] ; then
+ newicon "${icon}" ${PN}.png
+ fi
+
+ newicon -s ${size} "${icon}" ${PN}.png
+ done
+
+ # Install menu
+ local app_name="Mozilla ${MOZ_PN^}"
+ local desktop_file="${FILESDIR}/icon/${PN}-r3.desktop"
+ local exec_command="${PN}"
+ local icon="${PN}"
+ local use_wayland="false"
+
+ if [[ -n ${MOZ_ESR} ]] ; then
+ local desktop_filename="${PN}-esr.desktop"
+ else
+ local desktop_filename="${PN}.desktop"
+ fi
+
+ if use wayland ; then
+ use_wayland="true"
+ fi
+
+ cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die
+
+ sed -i \
+ -e "s:@NAME@:${app_name}:" \
+ -e "s:@EXEC@:${exec_command}:" \
+ -e "s:@ICON@:${icon}:" \
+ "${WORKDIR}/${PN}.desktop-template" || die
+
+ newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}"
+
+ rm "${WORKDIR}/${PN}.desktop-template" || die
+
+ if use gnome-shell ; then
+ # Install search provider for Gnome
+ insinto /usr/share/gnome-shell/search-providers/
+ doins browser/components/shell/search-provider-files/org.mozilla.firefox.search-provider.ini
+
+ insinto /usr/share/dbus-1/services/
+ doins browser/components/shell/search-provider-files/org.mozilla.firefox.SearchProvider.service
+
+ # Toggle between rapid and esr desktop file names
+ if [[ -n ${MOZ_ESR} ]] ; then
+ sed -e "s/firefox.desktop/${desktop_filename}/g" \
+ -i "${ED}/usr/share/gnome-shell/search-providers/org.mozilla.firefox.search-provider.ini" ||
+ die "Failed to sed org.mozilla.firefox.search-provider.ini file."
+ fi
+
+ # Make the dbus service aware of a previous session, bgo#939196
+ sed -e \
+ "s/Exec=\/usr\/bin\/firefox/Exec=\/usr\/$(get_libdir)\/firefox\/firefox --dbus-service \/usr\/bin\/firefox/g" \
+ -i "${ED}/usr/share/dbus-1/services/org.mozilla.firefox.SearchProvider.service" ||
+ die "Failed to sed org.mozilla.firefox.SearchProvider.service dbus file"
+
+ # Update prefs to enable Gnome search provider
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to enable gnome-search-provider via prefs"
+ pref("browser.gnome-search-provider.enabled", true);
+ EOF
+ fi
+
+ # Install wrapper script
+ [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}"
+ newbin "${FILESDIR}/${PN}-r1.sh" ${PN}
+
+ # Update wrapper
+ sed -i \
+ -e "s:@PREFIX@:${EPREFIX}/usr:" \
+ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \
+ "${ED}/usr/bin/${PN}" || die
+
+ readme.gentoo_create_doc
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+
+ if ! use gmp-autoupdate ; then
+ elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"
+ elog "installing into new profiles:"
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ elog "\t ${plugin}"
+ done
+ elog
+ fi
+
+ # bug 835078
+ if use hwaccel && has_version "x11-drivers/xf86-video-nouveau"; then
+ ewarn "You have nouveau drivers installed in your system and 'hwaccel' "
+ ewarn "enabled for Firefox. Nouveau / your GPU might not support the "
+ ewarn "required EGL, so either disable 'hwaccel' or try the workaround "
+ ewarn "explained in https://bugs.gentoo.org/835078#c5 if Firefox crashes."
+ fi
+
+ readme.gentoo_print_elog
+
+ optfeature_header "Optional programs for extra features:"
+ optfeature "desktop notifications" x11-libs/libnotify
+ optfeature "fallback mouse cursor theme e.g. on WMs" gnome-base/gsettings-desktop-schemas
+ optfeature "screencasting with pipewire" sys-apps/xdg-desktop-portal
+ if use hwaccel && has_version "x11-drivers/nvidia-drivers"; then
+ optfeature "hardware acceleration with NVIDIA cards" media-libs/nvidia-vaapi-driver
+ fi
+
+ if ! has_version "sys-libs/glibc"; then
+ elog
+ elog "glibc not found! You won't be able to play DRM content."
+ elog "See Gentoo bug #910309 or upstream bug #1843683."
+ elog
+ fi
+}
diff --git a/www-client/firefox/firefox-151.0.ebuild b/www-client/firefox/firefox-151.0.ebuild
new file mode 100644
index 000000000000..f48a37313b20
--- /dev/null
+++ b/www-client/firefox/firefox-151.0.ebuild
@@ -0,0 +1,1386 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+FIREFOX_PATCHSET="firefox-151-patches-01.tar.xz"
+
+LLVM_COMPAT=( 21 22 )
+
+# This will also filter rust versions that don't match LLVM_COMPAT in the non-clang path; this is fine.
+RUST_NEEDS_LLVM=1
+RUST_MIN_VER=1.90.0
+
+PYTHON_COMPAT=( python3_{12..14} )
+PYTHON_REQ_USE="ncurses,sqlite,ssl"
+
+VIRTUALX_REQUIRED="manual"
+
+# Information about the bundled wasi toolchain from
+# https://github.com/WebAssembly/wasi-sdk/
+WASI_SDK_VER=32.0
+WASI_SDK_LLVM_VER=22
+
+MOZ_ESR=
+
+MOZ_PV=${PV}
+MOZ_PV_SUFFIX=
+if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then
+ MOZ_PV_SUFFIX=${BASH_REMATCH[1]}
+
+ # Convert the ebuild version to the upstream Mozilla version
+ MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI
+ MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI
+ MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI
+fi
+
+if [[ -n ${MOZ_ESR} ]] ; then
+ # ESR releases have slightly different version numbers
+ MOZ_PV="${MOZ_PV}esr"
+ HOMEPAGE="https://www.firefox.com https://www.firefox.com/enterprise/"
+ SLOT="esr"
+else
+ HOMEPAGE="https://www.firefox.com"
+ SLOT="rapid"
+fi
+
+MOZ_PN="${PN%-bin}"
+MOZ_P="${MOZ_PN}-${MOZ_PV}"
+MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}"
+MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}"
+
+inherit check-reqs desktop flag-o-matic gnome2-utils linux-info llvm-r1 multiprocessing \
+ optfeature pax-utils python-any-r1 readme.gentoo-r1 rust toolchain-funcs virtualx xdg
+
+MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}"
+
+if [[ ${PV} == *_rc* ]] ; then
+ MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/candidates/${MOZ_PV}-candidates/build${PV##*_rc}"
+fi
+
+PATCH_URIS=(
+ https://dev.gentoo.org/~juippis/mozilla/patchsets/${FIREFOX_PATCHSET}
+)
+
+DESCRIPTION="Firefox Web Browser"
+SRC_URI="${MOZ_SRC_BASE_URI}/source/${MOZ_P}.source.tar.xz -> ${MOZ_P_DISTFILES}.source.tar.xz
+ ${PATCH_URIS[@]}
+ wasm-sandbox? (
+ amd64? ( https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VER/.*/}/wasi-sdk-${WASI_SDK_VER}-x86_64-linux.tar.gz )
+ arm64? ( https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_SDK_VER/.*/}/wasi-sdk-${WASI_SDK_VER}-arm64-linux.tar.gz )
+ )"
+
+S="${WORKDIR}/${PN}-${PV%_*}"
+LICENSE="MPL-2.0 GPL-2 LGPL-2.1"
+KEYWORDS="~amd64 ~arm64 ~loong ~ppc64 ~riscv ~x86"
+
+IUSE="+clang dbus debug eme-free hardened hwaccel jack libproxy pgo pulseaudio selinux sndio"
+IUSE+=" +system-av1 +system-harfbuzz +system-icu +system-jpeg +system-libevent +system-libvpx"
+IUSE+=" system-pipewire system-png +system-webp test valgrind wayland wifi +X"
+
+# Firefox-only IUSE
+IUSE+=" +gmp-autoupdate gnome-shell jpegxl +jumbo-build openh264 +telemetry wasm-sandbox"
+
+REQUIRED_USE="|| ( X wayland )
+ debug? ( !system-av1 )
+ pgo? ( jumbo-build )
+ wayland? ( dbus )
+ wifi? ( dbus )
+"
+
+RESTRICT="!test? ( test )"
+
+FF_ONLY_DEPEND="!www-client/firefox:0
+ selinux? ( sec-policy/selinux-mozilla )"
+BDEPEND="${PYTHON_DEPS}
+ $(llvm_gen_dep '
+ llvm-core/clang:${LLVM_SLOT}
+ llvm-core/llvm:${LLVM_SLOT}
+ clang? (
+ llvm-core/lld:${LLVM_SLOT}
+ pgo? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[profile] )
+ )
+ wasm-sandbox? ( llvm-core/lld:${LLVM_SLOT} )
+ ')
+ app-alternatives/awk
+ app-arch/unzip
+ app-arch/zip
+ >=dev-util/cbindgen-0.29.1
+ net-libs/nodejs
+ virtual/pkgconfig
+ amd64? ( >=dev-lang/nasm-2.14 )
+ x86? ( >=dev-lang/nasm-2.14 )
+ pgo? (
+ X? (
+ sys-devel/gettext
+ x11-base/xorg-server[xvfb]
+ x11-apps/xhost
+ )
+ !X? (
+ gui-wm/tinywl
+ x11-misc/xkeyboard-config
+ )
+ )"
+COMMON_DEPEND="${FF_ONLY_DEPEND}
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ dev-libs/glib:2
+ dev-libs/libffi:=
+ >=dev-libs/nss-3.123.1
+ >=dev-libs/nspr-4.39
+ media-libs/alsa-lib
+ media-libs/fontconfig
+ media-libs/freetype
+ media-libs/mesa
+ media-video/ffmpeg
+ virtual/zlib:=
+ virtual/freedesktop-icon-theme
+ x11-libs/cairo
+ x11-libs/gdk-pixbuf:2
+ x11-libs/libdrm
+ x11-libs/pango
+ x11-libs/pixman
+ dbus? (
+ sys-apps/dbus
+ )
+ jack? ( virtual/jack )
+ pulseaudio? (
+ || (
+ media-libs/libpulse
+ >=media-sound/apulse-0.1.12-r4[sdk]
+ )
+ )
+ libproxy? ( net-libs/libproxy )
+ selinux? ( sec-policy/selinux-mozilla )
+ sndio? ( >=media-sound/sndio-1.8.0-r1 )
+ system-av1? (
+ >=media-libs/dav1d-1.0.0:=
+ >=media-libs/libaom-3.10.0:=
+ )
+ system-harfbuzz? (
+ >=media-libs/harfbuzz-2.8.1:0=
+ !wasm-sandbox? ( >=media-gfx/graphite2-1.3.13 )
+ )
+ system-icu? ( >=dev-libs/icu-78.1:= )
+ system-jpeg? ( >=media-libs/libjpeg-turbo-1.2.1:= )
+ system-libevent? ( >=dev-libs/libevent-2.1.12:0=[threads(+)] )
+ system-libvpx? ( >=media-libs/libvpx-1.8.2:0=[postproc] )
+ system-pipewire? ( >=media-video/pipewire-1.4.7-r2:= )
+ system-png? ( >=media-libs/libpng-1.6.45:0=[apng] )
+ system-webp? ( >=media-libs/libwebp-1.1.0:0= )
+ valgrind? ( dev-debug/valgrind )
+ wayland? (
+ >=media-libs/libepoxy-1.5.10-r1
+ x11-libs/gtk+:3[wayland]
+ )
+ wifi? (
+ kernel_linux? (
+ || (
+ net-misc/networkmanager
+ net-misc/connman[networkmanager]
+ )
+ sys-apps/dbus
+ )
+ )
+ X? (
+ virtual/opengl
+ x11-libs/cairo[X]
+ x11-libs/gtk+:3[X]
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXrandr
+ x11-libs/libxcb:=
+ )"
+RDEPEND="${COMMON_DEPEND}
+ hwaccel? (
+ media-video/libva-utils
+ sys-apps/pciutils
+ )
+ jack? ( virtual/jack )
+ openh264? ( media-libs/openh264:*[plugin] )"
+DEPEND="${COMMON_DEPEND}
+ X? (
+ x11-base/xorg-proto
+ x11-libs/libICE
+ x11-libs/libSM
+ )"
+
+# ESR and rapid dependencies.
+if [[ -n ${MOZ_ESR} ]] ; then
+ RDEPEND+=" !www-client/firefox:rapid"
+else
+ RDEPEND+=" !www-client/firefox:esr"
+fi
+
+# Firefox-only RDEPEND
+RDEPEND+=" ~www-client/firefox-l10n-${PV}"
+
+# Allow MOZ_GMP_PLUGIN_LIST to be set in an eclass or
+# overridden in the enviromnent (advanced hackers only)
+if [[ -z "${MOZ_GMP_PLUGIN_LIST+set}" ]] ; then
+ MOZ_GMP_PLUGIN_LIST=( gmp-gmpopenh264 gmp-widevinecdm )
+fi
+
+llvm_check_deps() {
+ if ! has_version -b "llvm-core/clang:${LLVM_SLOT}" ; then
+ einfo "llvm-core/clang:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+
+ if use clang && ! tc-ld-is-mold ; then
+ if ! has_version -b "llvm-core/lld:${LLVM_SLOT}" ; then
+ einfo "llvm-core/lld:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+ fi
+
+ if use pgo ; then
+ if ! has_version -b "=llvm-runtimes/compiler-rt-sanitizers-${LLVM_SLOT}*[profile]" ; then
+ einfo "=llvm-runtimes/compiler-rt-sanitizers-${LLVM_SLOT}*[profile] is missing!" >&2
+ einfo "Cannot use LLVM slot ${LLVM_SLOT} ..." >&2
+ return 1
+ fi
+ fi
+
+ einfo "Using LLVM slot ${LLVM_SLOT} to build" >&2
+}
+
+moz_clear_vendor_checksums() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -ne 1 ]] ; then
+ die "${FUNCNAME} requires exact one argument"
+ fi
+
+ einfo "Clearing cargo checksums for ${1} ..."
+
+ sed -i \
+ -e 's/\("files":{\)[^}]*/\1/' \
+ "${S}"/third_party/rust/${1}/.cargo-checksum.json || die
+}
+
+moz_install_xpi() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local DESTDIR=${1}
+ shift
+
+ insinto "${DESTDIR}"
+
+ local emid xpi_file xpi_tmp_dir
+ for xpi_file in "${@}" ; do
+ emid=
+ xpi_tmp_dir=$(mktemp -d --tmpdir="${T}")
+
+ # Unpack XPI
+ unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die
+
+ # Determine extension ID
+ if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then
+ emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"
+ elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then
+ emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json")
+ [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"
+ else
+ die "failed to determine extension id"
+ fi
+
+ einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..."
+ newins "${xpi_file}" "${emid}.xpi"
+ done
+}
+
+mozconfig_add_options_ac() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local reason=${1}
+ shift
+
+ local option
+ for option in ${@} ; do
+ echo "ac_add_options ${option} # ${reason}" >>${MOZCONFIG}
+ done
+}
+
+mozconfig_add_options_mk() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 2 ]] ; then
+ die "${FUNCNAME} requires at least two arguments"
+ fi
+
+ local reason=${1}
+ shift
+
+ local option
+ for option in ${@} ; do
+ echo "mk_add_options ${option} # ${reason}" >>${MOZCONFIG}
+ done
+}
+
+mozconfig_use_enable() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 1 ]] ; then
+ die "${FUNCNAME} requires at least one arguments"
+ fi
+
+ local flag=$(use_enable "${@}")
+ mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}"
+}
+
+mozconfig_use_with() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ if [[ ${#} -lt 1 ]] ; then
+ die "${FUNCNAME} requires at least one arguments"
+ fi
+
+ local flag=$(use_with "${@}")
+ mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}"
+}
+
+virtwl() {
+ debug-print-function ${FUNCNAME} "$@"
+
+ [[ $# -lt 1 ]] && die "${FUNCNAME} needs at least one argument"
+ [[ -n $XDG_RUNTIME_DIR ]] || die "${FUNCNAME} needs XDG_RUNTIME_DIR to be set; try xdg_environment_reset"
+ tinywl -h >/dev/null || die 'tinywl -h failed'
+
+ local VIRTWL VIRTWL_PID
+ coproc VIRTWL { WLR_BACKENDS=headless exec tinywl -s 'echo $WAYLAND_DISPLAY; read _; kill $PPID'; }
+ local -x WAYLAND_DISPLAY
+ read WAYLAND_DISPLAY <&${VIRTWL[0]}
+
+ debug-print "${FUNCNAME}: $@"
+ "$@"
+ local r=$?
+
+ [[ -n $VIRTWL_PID ]] || die "tinywl exited unexpectedly"
+ exec {VIRTWL[0]}<&- {VIRTWL[1]}>&-
+ return $r
+}
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]] ; then
+ # Ensure we have enough disk space to compile
+ if use pgo || use debug ; then
+ CHECKREQS_DISK_BUILD="18700M"
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and pgo detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling pgo."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable pgo when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+pgo cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ elif tc-is-lto ; then
+ CHECKREQS_DISK_BUILD="10900M"
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and lto detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling lto."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable lto when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+lto cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ else
+ CHECKREQS_DISK_BUILD="9700M"
+ fi
+
+ check-reqs_pkg_pretend
+ fi
+}
+
+pkg_setup() {
+
+ # Get LTO from environment; export after this phase for use in src_configure (etc)
+ use_lto=no
+
+ if [[ ${MERGE_TYPE} != binary ]] ; then
+
+ if tc-is-lto; then
+ use_lto=yes
+ # LTO is handled via configure
+ filter-lto
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and pgo detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling lto."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable lto when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+lto cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ fi
+
+ if use pgo ; then
+ if ! has userpriv ${FEATURES} ; then
+ eerror "Building ${PN} with USE=pgo and FEATURES=-userpriv is not supported!"
+ fi
+
+ if ! use clang ; then
+ if tc-is-gcc && ver_test "$(gcc-major-version)" -eq 15 && has_version -b "<sys-devel/gcc-15.2.1_p20251108-r1:15"; then
+ eerror "<gcc-15.2.1_p20251108-r1:15 and lto detected. Firefox-145.0 can not be compiled"
+ eerror "with this GCC, when also enabling pgo."
+ eerror "See bug https://gcc.gnu.org/PR122620"
+ eerror ""
+ eerror "Your options are:"
+ eerror " 1) upgrade GCC to >=15.2.1_p20251108-r1 - note that even with the 16.0"
+ eerror " releases, make sure the patch set is equal or newer than 16.0.0_p20251109-r1,"
+ eerror " or use the \"trunk\" version,"
+ eerror " 2) compile Firefox with Clang by enabling the \"clang\" USE flag, or"
+ eerror " 3) disable pgo when compiling with GCC for now."
+ die "Firefox-${PV} with gcc+pgo cannot be compiled with the detected gcc version: $(gcc-fullversion)"
+ fi
+ fi
+ fi
+
+ if [[ ${use_lto} = yes ]]; then
+ # -Werror=lto-type-mismatch -Werror=odr are going to fail with GCC,
+ # bmo#1516758, bgo#942288
+ filter-flags -Werror=lto-type-mismatch -Werror=odr
+ fi
+
+ # Ensure we have enough disk space to compile
+ if use pgo || use debug ; then
+ CHECKREQS_DISK_BUILD="18700M"
+ elif [[ ${use_lto} == "yes" ]] ; then
+ CHECKREQS_DISK_BUILD="10900M"
+ else
+ CHECKREQS_DISK_BUILD="9700M"
+ fi
+
+ check-reqs_pkg_setup
+ llvm-r1_pkg_setup
+ rust_pkg_setup
+ python-any-r1_pkg_setup
+
+ # Avoid PGO profiling problems due to enviroment leakage
+ # These should *always* be cleaned up anyway
+ unset \
+ DBUS_SESSION_BUS_ADDRESS \
+ DISPLAY \
+ ORBIT_SOCKETDIR \
+ SESSION_MANAGER \
+ XAUTHORITY \
+ XDG_CACHE_HOME \
+ XDG_SESSION_COOKIE
+
+ # Build system is using /proc/self/oom_score_adj, bug #604394
+ addpredict /proc/self/oom_score_adj
+
+ if use pgo ; then
+ # Update 105.0: "/proc/self/oom_score_adj" isn't enough anymore with pgo, but not sure
+ # whether that's due to better OOM handling by Firefox (bmo#1771712), or portage
+ # (PORTAGE_SCHEDULING_POLICY) update...
+ addpredict /proc
+
+ # Clear tons of conditions, since PGO is hardware-dependant.
+ addpredict /dev
+ fi
+
+ if ! mountpoint -q /dev/shm ; then
+ # If /dev/shm is not available, configure is known to fail with
+ # a traceback report referencing /usr/lib/pythonN.N/multiprocessing/synchronize.py
+ ewarn "/dev/shm is not mounted -- expect build failures!"
+ fi
+
+ # Google API keys (see http://www.chromium.org/developers/how-tos/api-keys)
+ # Note: These are for Gentoo Linux use ONLY. For your own distribution, please
+ # get your own set of keys.
+ if [[ -z "${MOZ_API_KEY_GOOGLE+set}" ]] ; then
+ MOZ_API_KEY_GOOGLE="AIzaSyDEAOvatFogGaPi0eTgsV_ZlEzx0ObmepsMzfAc"
+ fi
+
+ if [[ -z "${MOZ_API_KEY_LOCATION+set}" ]] ; then
+ MOZ_API_KEY_LOCATION="AIzaSyB2h2OuRgGaPicUgy5N-5hsZqiPW6sH3n_rptiQ"
+ fi
+
+ # Mozilla API keys (see https://location.services.mozilla.com/api)
+ # Note: These are for Gentoo Linux use ONLY. For your own distribution, please
+ # get your own set of keys.
+ if [[ -z "${MOZ_API_KEY_MOZILLA+set}" ]] ; then
+ MOZ_API_KEY_MOZILLA="edb3d487-3a84-46m0ap1e3-9dfd-92b5efaaa005"
+ fi
+
+ # Ensure we use C locale when building, bug #746215
+ export LC_ALL=C
+ fi
+
+ export use_lto
+
+ CONFIG_CHECK="~SECCOMP"
+ WARNING_SECCOMP="CONFIG_SECCOMP not set! This system will be unable to play DRM-protected content."
+ linux-info_pkg_setup
+}
+
+src_unpack() {
+ local _lp_dir="${WORKDIR}/language_packs"
+ local _src_file
+
+ if [[ ! -d "${_lp_dir}" ]] ; then
+ mkdir "${_lp_dir}" || die
+ fi
+
+ for _src_file in ${A} ; do
+ if [[ ${_src_file} == *.xpi ]]; then
+ cp "${DISTDIR}/${_src_file}" "${_lp_dir}" || die "Failed to copy '${_src_file}' to '${_lp_dir}'!"
+ else
+ unpack ${_src_file}
+ fi
+ done
+}
+
+src_prepare() {
+ if [[ ${use_lto} == "yes" ]]; then
+ rm -v "${WORKDIR}"/firefox-patches/*-LTO-Only-enable-LTO-*.patch || die
+ fi
+
+ # Workaround for bgo#915651 and bmo#1988166 on musl
+ if use elibc_glibc ; then
+ rm -v "${WORKDIR}"/firefox-patches/*bgo-748849-RUST_TARGET_override.patch || die
+ rm -v "${WORKDIR}"/firefox-patches/*bmo-1988166-musl-remove-nonexisting-system-header-req.patch || die
+ rm -v "${WORKDIR}"/firefox-patches/*bgo-967694-musl-prctrl-exception-on-musl.patch || die
+ fi
+
+ eapply "${WORKDIR}/firefox-patches"
+
+ # Allow user to apply any additional patches without modifing ebuild
+ eapply_user
+
+ # Make cargo respect MAKEOPTS
+ export CARGO_BUILD_JOBS="$(makeopts_jobs)"
+
+ # Workaround for bgo#915651
+ if ! use elibc_glibc ; then
+ if use amd64 ; then
+ export RUST_TARGET="x86_64-unknown-linux-musl"
+ elif use x86 ; then
+ export RUST_TARGET="i686-unknown-linux-musl"
+ elif use arm64 ; then
+ export RUST_TARGET="aarch64-unknown-linux-musl"
+ elif use loong; then
+ # Only the LP64D ABI of LoongArch64 is actively supported among
+ # the wider Linux ecosystem, so the assumption is safe.
+ export RUST_TARGET="loongarch64-unknown-linux-musl"
+ elif use ppc64 ; then
+ export RUST_TARGET="powerpc64le-unknown-linux-musl"
+ elif use riscv ; then
+ # We can pretty safely rule out any 32-bit riscvs, but 64-bit riscvs also have tons of
+ # different ABIs available. riscv64gc-unknown-linux-musl seems to be the best working
+ # guess right now though.
+ elog "riscv detected, forcing a riscv64 target for now."
+ export RUST_TARGET="riscv64gc-unknown-linux-musl"
+ else
+ die "Unknown musl chost, please post a new bug with your rustc -vV along with emerge --info"
+ fi
+ fi
+
+ # Pre-built wasm-sandbox path manipulation.
+ if use wasm-sandbox ; then
+ if use amd64 ; then
+ export wasi_arch="x86_64"
+ elif use arm64 ; then
+ export wasi_arch="arm64"
+ else
+ die "wasm-sandbox enabled on unknown/unsupported arch!"
+ fi
+
+ sed -i \
+ -e "s:%%PORTAGE_WORKDIR%%:${WORKDIR}:" \
+ -e "s:%%WASI_ARCH%%:${wasi_arch}:" \
+ -e "s:%%WASI_SDK_VER%%:${WASI_SDK_VER}:" \
+ -e "s:%%WASI_SDK_LLVM_VER%%:${WASI_SDK_LLVM_VER}:" \
+ toolkit/moz.configure || die "Failed to update wasi-related paths."
+ fi
+
+ # Make LTO respect MAKEOPTS
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/build/moz.configure/lto-pgo.configure || die "Failed sedding multiprocessing.cpu_count"
+
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/third_party/chromium/build/toolchain/get_cpu_count.py || die "Failed sedding multiprocessing.cpu_count"
+
+ sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" \
+ "${S}"/third_party/python/gyp/pylib/gyp/input.py || die "Failed sedding multiprocessing.cpu_count"
+
+ # sed-in toolchain prefix
+ sed -i \
+ -e "s/objdump/${CHOST}-objdump/" \
+ "${S}"/python/mozbuild/mozbuild/configure/check_debug_ranges.py || die "sed failed to set toolchain prefix"
+
+ sed -i \
+ -e 's/ccache_stats = None/return None/' \
+ "${S}"/python/mozbuild/mozbuild/controller/building.py || die "sed failed to disable ccache stats call"
+
+ einfo "Removing pre-built binaries ..."
+
+ find "${S}"/third_party -type f \( -name '*.so' -o -name '*.o' \) -print -delete || die
+
+ # Clear checksums from cargo crates we've manually patched.
+ # moz_clear_vendor_checksums xyz
+ # glslopt: bgo#969412
+ moz_clear_vendor_checksums glslopt
+ moz_clear_vendor_checksums encoding_rs
+
+ # Respect choice for "jumbo-build"
+ # Changing the value for FILES_PER_UNIFIED_FILE may not work, see #905431
+ if [[ -n ${FILES_PER_UNIFIED_FILE} ]] && use jumbo-build; then
+ local my_files_per_unified_file=${FILES_PER_UNIFIED_FILE:=16}
+ elog ""
+ elog "jumbo-build defaults modified to ${my_files_per_unified_file}."
+ elog "if you get a build failure, try undefining FILES_PER_UNIFIED_FILE,"
+ elog "if that fails try -jumbo-build before opening a bug report."
+ elog ""
+
+ sed -i -e "s/\"FILES_PER_UNIFIED_FILE\", 16/\"FILES_PER_UNIFIED_FILE\", "${my_files_per_unified_file}"/" \
+ python/mozbuild/mozbuild/frontend/data.py ||
+ die "Failed to adjust FILES_PER_UNIFIED_FILE in python/mozbuild/mozbuild/frontend/data.py"
+ sed -i -e "s/FILES_PER_UNIFIED_FILE = 6/FILES_PER_UNIFIED_FILE = "${my_files_per_unified_file}"/" \
+ js/src/moz.build ||
+ die "Failed to adjust FILES_PER_UNIFIED_FILE in js/src/moz.build"
+ fi
+
+ # Create build dir
+ BUILD_DIR="${WORKDIR}/${PN}_build"
+ mkdir -p "${BUILD_DIR}" || die
+
+ # Write API keys to disk
+ echo -n "${MOZ_API_KEY_GOOGLE//gGaPi/}" > "${S}"/api-google.key || die
+ echo -n "${MOZ_API_KEY_LOCATION//gGaPi/}" > "${S}"/api-location.key || die
+ echo -n "${MOZ_API_KEY_MOZILLA//m0ap1/}" > "${S}"/api-mozilla.key || die
+
+ xdg_environment_reset
+}
+
+src_configure() {
+ # Show flags set at the beginning
+ einfo "Current BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}"
+ einfo "Current CFLAGS:\t\t${CFLAGS:-no value set}"
+ einfo "Current CXXFLAGS:\t\t${CXXFLAGS:-no value set}"
+ einfo "Current LDFLAGS:\t\t${LDFLAGS:-no value set}"
+ einfo "Current RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}"
+
+ local have_switched_compiler=
+ if use clang; then
+ # Force clang
+ einfo "Enforcing the use of clang due to USE=clang ..."
+
+ local version_clang=$(clang --version 2>/dev/null | grep -F -- 'clang version' | awk '{ print $3 }')
+ [[ -n ${version_clang} ]] && version_clang=$(ver_cut 1 "${version_clang}")
+ [[ -z ${version_clang} ]] && die "Failed to read clang version!"
+
+ if tc-is-gcc; then
+ have_switched_compiler=yes
+ fi
+
+ AR=llvm-ar
+ CC=${CHOST}-clang-${version_clang}
+ CXX=${CHOST}-clang++-${version_clang}
+ NM=llvm-nm
+ RANLIB=llvm-ranlib
+ elif ! use clang && ! tc-is-gcc ; then
+ # Force gcc
+ have_switched_compiler=yes
+ einfo "Enforcing the use of gcc due to USE=-clang ..."
+ AR=gcc-ar
+ CC=${CHOST}-gcc
+ CXX=${CHOST}-g++
+ NM=gcc-nm
+ RANLIB=gcc-ranlib
+ fi
+
+ if [[ -n "${have_switched_compiler}" ]] ; then
+ # Because we switched active compiler we have to ensure
+ # that no unsupported flags are set
+ strip-unsupported-flags
+ fi
+
+ # Ensure we use correct toolchain,
+ # AS is used in a non-standard way by upstream, #bmo1654031
+ export HOST_CC="$(tc-getBUILD_CC)"
+ export HOST_CXX="$(tc-getBUILD_CXX)"
+ export AS="$(tc-getCC) -c"
+
+ # Configuration tests expect llvm-readelf output, bug 913130
+ READELF="llvm-readelf"
+
+ tc-export CC CXX LD AR AS NM OBJDUMP RANLIB READELF PKG_CONFIG
+
+ # Pass the correct toolchain paths through cbindgen
+ if tc-is-cross-compiler ; then
+ export BINDGEN_CFLAGS="${SYSROOT:+--sysroot=${ESYSROOT}} --target=${CHOST} ${BINDGEN_CFLAGS-}"
+ fi
+
+ # Set MOZILLA_FIVE_HOME
+ export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${PN}"
+
+ # python/mach/mach/mixin/process.py fails to detect SHELL
+ export SHELL="${EPREFIX}/bin/bash"
+
+ # Set state path
+ export MOZBUILD_STATE_PATH="${BUILD_DIR}"
+
+ # Set MOZCONFIG
+ export MOZCONFIG="${S}/.mozconfig"
+
+ # Initialize MOZCONFIG
+ mozconfig_add_options_ac '' --enable-application=browser
+ mozconfig_add_options_ac '' --enable-project=browser
+
+ # Set Gentoo defaults
+ if use telemetry; then
+ export MOZILLA_OFFICIAL=1
+ fi
+
+ mozconfig_add_options_ac 'Gentoo default' \
+ --allow-addon-sideload \
+ --disable-cargo-incremental \
+ --disable-crashreporter \
+ --disable-disk-remnant-avoidance \
+ --disable-geckodriver \
+ --disable-install-strip \
+ --disable-legacy-profile-creation \
+ --disable-parental-controls \
+ --disable-strip \
+ --disable-updater \
+ --disable-wmf \
+ --enable-negotiateauth \
+ --enable-new-pass-manager \
+ --enable-official-branding \
+ --enable-packed-relative-relocs \
+ --enable-release \
+ --enable-system-policies \
+ --host="${CBUILD:-${CHOST}}" \
+ --libdir="${EPREFIX}/usr/$(get_libdir)" \
+ --prefix="${EPREFIX}/usr" \
+ --target="${CHOST}" \
+ --without-ccache \
+ --with-intl-api \
+ --with-libclang-path="$(llvm-config --libdir)" \
+ --with-system-ffi \
+ --with-system-gbm \
+ --with-system-libdrm \
+ --with-system-nspr \
+ --with-system-nss \
+ --with-system-pixman \
+ --with-system-zlib \
+ --with-toolchain-prefix="${CHOST}-" \
+ --with-unsigned-addon-scopes=app,system
+
+ # Set update channel
+ local update_channel=release
+ [[ -n ${MOZ_ESR} ]] && update_channel=esr
+ mozconfig_add_options_ac '' --enable-update-channel=${update_channel}
+
+ # Whitelist to allow unkeyworded arches to build with "--disable-rust-simd" by default.
+ if use amd64 || use arm64 || use ppc64 || use loong || use riscv ; then
+ mozconfig_add_options_ac '' --enable-rust-simd
+ fi
+
+ # For future keywording: This is currently (97.0) only supported on:
+ # amd64, arm, arm64 & x86.
+ # Might want to flip the logic around if Firefox is to support more arches.
+ # bug 833001, bug 903411#c8
+ if use loong || use ppc64 || use riscv; then
+ mozconfig_add_options_ac '' --disable-sandbox
+ elif use valgrind; then
+ mozconfig_add_options_ac 'valgrind requirement' --disable-sandbox
+ else
+ mozconfig_add_options_ac '' --enable-sandbox
+ fi
+
+ # riscv-related options, bgo#947337, bgo#947338
+ if use riscv ; then
+ mozconfig_add_options_ac 'Disable webrtc for RISC-V' --disable-webrtc
+ fi
+
+ if [[ -s "${S}/api-google.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-google.key" | md5sum | awk '{ print $1 }') != 709560c02f94b41f9ad2c49207be6c54 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-google-safebrowsing-api-keyfile="${S}/api-google.key"
+ else
+ einfo "Building without Google API key ..."
+ fi
+
+ if [[ -s "${S}/api-location.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-location.key" | md5sum | awk '{ print $1 }') != ffb7895e35dedf832eb1c5d420ac7420 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-google-location-service-api-keyfile="${S}/api-location.key"
+ else
+ einfo "Building without Location API key ..."
+ fi
+
+ if [[ -s "${S}/api-mozilla.key" ]] ; then
+ local key_origin="Gentoo default"
+ if [[ $(cat "${S}/api-mozilla.key" | md5sum | awk '{ print $1 }') != 3927726e9442a8e8fa0e46ccc39caa27 ]] ; then
+ key_origin="User value"
+ fi
+
+ mozconfig_add_options_ac "${key_origin}" \
+ --with-mozilla-api-keyfile="${S}/api-mozilla.key"
+ else
+ einfo "Building without Mozilla API key ..."
+ fi
+
+ mozconfig_use_with system-av1
+ mozconfig_use_with system-harfbuzz
+ mozconfig_use_with system-icu
+ mozconfig_use_with system-jpeg
+ mozconfig_use_with system-libevent
+ mozconfig_use_with system-libvpx
+ mozconfig_use_with system-pipewire
+ mozconfig_use_with system-png
+ mozconfig_use_with system-webp
+
+ mozconfig_use_enable dbus
+ mozconfig_use_enable libproxy
+ mozconfig_use_enable valgrind
+
+ use eme-free && mozconfig_add_options_ac '+eme-free' --disable-eme
+
+ if use hardened ; then
+ mozconfig_add_options_ac "+hardened" --enable-hardening
+ mozconfig_add_options_ac "+hardened stl" --enable-stl-hardening
+ append-ldflags "-Wl,-z,relro -Wl,-z,now"
+
+ # Increase the FORTIFY_SOURCE value, #910071.
+ sed -i -e '/-D_FORTIFY_SOURCE=/s:2:3:' "${S}"/build/moz.configure/toolchain.configure || die
+ fi
+
+ local myaudiobackends=""
+ use jack && myaudiobackends+="jack,"
+ use sndio && myaudiobackends+="sndio,"
+ use pulseaudio && myaudiobackends+="pulseaudio,"
+ ! use pulseaudio && myaudiobackends+="alsa,"
+
+ mozconfig_add_options_ac '--enable-audio-backends' --enable-audio-backends="${myaudiobackends::-1}"
+
+ mozconfig_use_enable wifi necko-wifi
+
+ ! use jumbo-build && mozconfig_add_options_ac '--disable-unified-build' --disable-unified-build
+
+ if use X && use wayland ; then
+ mozconfig_add_options_ac '+x11+wayland' --enable-default-toolkit=cairo-gtk3-x11-wayland
+ elif ! use X && use wayland ; then
+ mozconfig_add_options_ac '+wayland' --enable-default-toolkit=cairo-gtk3-wayland-only
+ else
+ mozconfig_add_options_ac '+x11' --enable-default-toolkit=cairo-gtk3-x11-only
+ fi
+
+ # wasm-sandbox
+ # Since graphite2 is one of the sandboxed libraries, system-graphite2 obviously can't work with +wasm-sandbox.
+ if use wasm-sandbox ; then
+ mozconfig_add_options_ac '+wasm-sandbox' --with-wasi-sysroot="${WORKDIR}/wasi-sdk-${WASI_SDK_VER}-${wasi_arch}-linux/share/wasi-sysroot/"
+ else
+ mozconfig_add_options_ac 'no wasm-sandbox' --without-wasm-sandboxed-libraries
+ mozconfig_use_with system-harfbuzz system-graphite2
+ fi
+
+ ! use jpegxl && mozconfig_add_options_ac '-jpegxl' --disable-jxl
+
+ if [[ ${use_lto} == "yes" ]] ; then
+ if use clang ; then
+ # Upstream only supports lld or mold when using clang.
+ if tc-ld-is-mold ; then
+ # mold expects the -flto line from *FLAGS configuration, bgo#923119
+ append-ldflags "-flto=thin"
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "forcing ld=lld due to USE=clang and USE=lto" --enable-linker=lld
+ fi
+
+ mozconfig_add_options_ac '+lto' --enable-lto=cross
+
+ else
+ # ThinLTO is currently broken, see bmo#1644409.
+ # mold does not support gcc+lto combination.
+ mozconfig_add_options_ac '+lto' --enable-lto=full
+ mozconfig_add_options_ac "linker is set to bfd" --enable-linker=bfd
+ fi
+
+ else
+ # Avoid auto-magic on linker
+ if use clang ; then
+ # lld is upstream's default
+ if tc-ld-is-mold ; then
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "forcing ld=lld due to USE=clang" --enable-linker=lld
+ fi
+
+ else
+ if tc-ld-is-mold ; then
+ mozconfig_add_options_ac "using ld=mold due to system selection" --enable-linker=mold
+ else
+ mozconfig_add_options_ac "linker is set to bfd due to USE=-clang" --enable-linker=bfd
+ fi
+ fi
+ fi
+
+ # PGO was moved outside lto block to allow building pgo without lto.
+ if use pgo ; then
+ mozconfig_add_options_ac '+pgo' MOZ_PGO=1
+
+ # Avoid compressing just-built instrumented Firefox with
+ # high levels of compression. Just use tar as a container
+ # to save >=10 minutes.
+ export MOZ_PKG_FORMAT=tar
+
+ if use clang ; then
+ # Used in build/pgo/profileserver.py
+ export LLVM_PROFDATA="llvm-profdata"
+ else
+ # Attempt to fix pgo hanging with gcc, bgo#966309.
+ export MOZ_REMOTE_SETTINGS_DEVTOOLS=1
+ fi
+ fi
+
+ mozconfig_use_enable debug
+ if use debug ; then
+ mozconfig_add_options_ac '+debug' --disable-optimize
+ mozconfig_add_options_ac '+debug' --enable-jemalloc
+ mozconfig_add_options_ac '+debug' --enable-real-time-tracing
+ else
+ mozconfig_add_options_ac 'Gentoo defaults' --disable-real-time-tracing
+
+ if is-flag '-g*' ; then
+ if use clang ; then
+ mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols=$(get-flag '-g*')
+ else
+ mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols
+ fi
+ else
+ mozconfig_add_options_ac 'Gentoo default' --disable-debug-symbols
+ fi
+
+ if is-flag '-O0' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O0
+ elif is-flag '-O4' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O4
+ elif is-flag '-O3' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O3
+ elif is-flag '-O1' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O1
+ elif is-flag '-Os' ; then
+ mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-Os
+ else
+ mozconfig_add_options_ac "Gentoo default" --enable-optimize=-O2
+ fi
+ fi
+
+ # Debug flag was handled via configure
+ filter-flags '-g*'
+
+ # Optimization flag was handled via configure
+ filter-flags '-O*'
+
+ # elf-hack
+ # Filter "-z,pack-relative-relocs" and let the build system handle it instead.
+ if use amd64 || use x86 ; then
+ filter-flags "-z,pack-relative-relocs"
+
+ if tc-ld-is-mold ; then
+ # relr-elf-hack is currently broken with mold, bgo#916259
+ mozconfig_add_options_ac 'disable elf-hack with mold linker' --disable-elf-hack
+ else
+ mozconfig_add_options_ac 'relr elf-hack' --enable-elf-hack=relr
+ fi
+ elif use loong || use ppc64 || use riscv ; then
+ # '--disable-elf-hack' is not recognized on loong/ppc64/riscv,
+ # see bgo #917049, #930046
+ :;
+ else
+ mozconfig_add_options_ac 'disable elf-hack on non-supported arches' --disable-elf-hack
+ fi
+
+ if ! use elibc_glibc; then
+ mozconfig_add_options_ac '!elibc_glibc' --disable-jemalloc
+ fi
+
+ if use valgrind; then
+ mozconfig_add_options_ac 'valgrind requirement' --disable-jemalloc
+ fi
+
+ # System-av1 fix
+ use system-av1 && append-ldflags "-Wl,--undefined-version"
+
+ # Make revdep-rebuild.sh happy; Also required for musl
+ append-ldflags -Wl,-rpath="${MOZILLA_FIVE_HOME}",--enable-new-dtags
+
+ # Pass $MAKEOPTS to build system
+ export MOZ_MAKE_FLAGS="${MAKEOPTS}"
+
+ # Use system's Python environment
+ export PIP_NETWORK_INSTALL_RESTRICTED_VIRTUALENVS=mach
+
+ export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE="none"
+
+ if ! use telemetry; then
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_CRASHREPORTER=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_DATA_REPORTING=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_SERVICES_HEALTHREPORT=0"
+ mozconfig_add_options_mk '-telemetry setting' "MOZ_TELEMETRY_REPORTING=0"
+ fi
+
+ mozconfig_use_enable test tests
+
+ # Disable notification when build system has finished
+ export MOZ_NOSPAM=1
+
+ # Portage sets XARGS environment variable to "xargs -r" by default which
+ # breaks build system's check_prog() function which doesn't support arguments
+ mozconfig_add_options_ac 'Gentoo default' "XARGS=${EPREFIX}/usr/bin/xargs"
+
+ # Set build dir
+ mozconfig_add_options_mk 'Gentoo default' "MOZ_OBJDIR=${BUILD_DIR}"
+
+ # Show flags we will use
+ einfo "Build BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}"
+ einfo "Build CFLAGS:\t\t${CFLAGS:-no value set}"
+ einfo "Build CXXFLAGS:\t\t${CXXFLAGS:-no value set}"
+ einfo "Build LDFLAGS:\t\t${LDFLAGS:-no value set}"
+ einfo "Build RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}"
+
+ # Handle EXTRA_CONF and show summary
+ local ac opt hash reason
+
+ # Apply EXTRA_ECONF entries to $MOZCONFIG
+ if [[ -n ${EXTRA_ECONF} ]] ; then
+ IFS=\! read -a ac <<<${EXTRA_ECONF// --/\!}
+ for opt in "${ac[@]}"; do
+ mozconfig_add_options_ac "EXTRA_ECONF" --${opt#--}
+ done
+ fi
+
+ echo
+ echo "=========================================================="
+ echo "Building ${PF} with the following configuration"
+ grep ^ac_add_options "${MOZCONFIG}" | while read ac opt hash reason; do
+ [[ -z ${hash} || ${hash} == \# ]] \
+ || die "error reading mozconfig: ${ac} ${opt} ${hash} ${reason}"
+ printf " %-30s %s\n" "${opt}" "${reason:-mozilla.org default}"
+ done
+ echo "=========================================================="
+ echo
+
+ if use valgrind; then
+ sed -i -e 's/--enable-optimize=-O[0-9s]/--enable-optimize="-g -O2"/' .mozconfig || die
+ fi
+
+ ./mach configure || die
+}
+
+src_compile() {
+ local virtx_cmd=
+
+ if [[ ${use_lto} == "yes" ]] && tc-ld-is-mold ; then
+ # increase ulimit with mold+lto, bugs #892641, #907485
+ if ! ulimit -n 16384 1>/dev/null 2>&1 ; then
+ ewarn "Unable to modify ulimits - building with mold+lto might fail due to low ulimit -n resources."
+ ewarn "Please see bugs #892641 & #907485."
+ else
+ ulimit -n 16384
+ fi
+ fi
+
+ if use pgo; then
+ # Reset and cleanup environment variables used by GNOME/XDG
+ gnome2_environment_reset
+
+ addpredict /root
+
+ if ! use X; then
+ virtx_cmd=virtwl
+ else
+ virtx_cmd=virtx
+ fi
+ fi
+
+ if ! use X; then
+ local -x GDK_BACKEND=wayland
+ else
+ local -x GDK_BACKEND=x11
+ fi
+
+ ${virtx_cmd} ./mach build --verbose || die
+}
+
+src_test() {
+ # https://firefox-source-docs.mozilla.org/testing/automated-testing/index.html
+ local -a failures=()
+
+ # Some tests respect this
+ local -x MOZ_HEADLESS=1
+
+ # Check testing/mach_commands.py
+ einfo "Testing with cppunittest ..."
+ ./mach cppunittest
+ local ret=$?
+ if [[ ${ret} -ne 0 ]]; then
+ eerror "Test suite cppunittest failed with error code ${ret}"
+ failures+=( cppunittest )
+ fi
+
+ if [[ ${#failures} -eq 0 ]]; then
+ einfo "Test suites succeeded"
+ else
+ die "Test suites failed: ${failures[@]}"
+ fi
+}
+
+src_install() {
+ # xpcshell is getting called during install
+ pax-mark m \
+ "${BUILD_DIR}"/dist/bin/xpcshell \
+ "${BUILD_DIR}"/dist/bin/${PN} \
+ "${BUILD_DIR}"/dist/bin/plugin-container
+
+ DESTDIR="${D}" ./mach install || die
+
+ # Upstream cannot ship symlink but we can (bmo#658850)
+ rm "${ED}${MOZILLA_FIVE_HOME}/${PN}-bin" || die
+ dosym ${PN} ${MOZILLA_FIVE_HOME}/${PN}-bin
+
+ # Don't install llvm-symbolizer from llvm-core/llvm package
+ if [[ -f "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" ]] ; then
+ rm -v "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" || die
+ fi
+
+ # Install policy (currently only used to disable application updates)
+ insinto "${MOZILLA_FIVE_HOME}/distribution"
+ newins "${FILESDIR}"/distribution.ini distribution.ini
+ newins "${FILESDIR}"/disable-auto-update.policy.json policies.json
+
+ # Install system-wide preferences
+ local PREFS_DIR="${MOZILLA_FIVE_HOME}/browser/defaults/preferences"
+ insinto "${PREFS_DIR}"
+ newins "${FILESDIR}"/gentoo-default-prefs.js gentoo-prefs.js
+
+ local GENTOO_PREFS="${ED}${PREFS_DIR}/gentoo-prefs.js"
+
+ # Set dictionary path to use system hunspell
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set spellchecker.dictionary_path pref"
+ pref("spellchecker.dictionary_path", "${EPREFIX}/usr/share/myspell");
+ EOF
+
+ # Force hwaccel prefs if USE=hwaccel is enabled
+ if use hwaccel ; then
+ cat "${FILESDIR}"/gentoo-hwaccel-prefs.js-r2 \
+ >>"${GENTOO_PREFS}" \
+ || die "failed to add prefs to force hardware-accelerated rendering to all-gentoo.js"
+
+ if use wayland; then
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set hwaccel wayland prefs"
+ pref("gfx.x11-egl.force-enabled", false);
+ EOF
+ else
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set hwaccel x11 prefs"
+ pref("gfx.x11-egl.force-enabled", true);
+ EOF
+ fi
+
+ # Install the vaapitest binary on supported arches (122.0 supports all platforms, bmo#1865969)
+ exeinto "${MOZILLA_FIVE_HOME}"
+ doexe "${BUILD_DIR}"/dist/bin/vaapitest
+
+ # Install the v4l2test on supported arches (+ arm, + riscv64 when keyworded)
+ if use arm64 ; then
+ exeinto "${MOZILLA_FIVE_HOME}"
+ doexe "${BUILD_DIR}"/dist/bin/v4l2test
+ fi
+ fi
+
+ if ! use gmp-autoupdate ; then
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ einfo "Disabling auto-update for ${plugin} plugin ..."
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable autoupdate for ${plugin} media plugin"
+ pref("media.${plugin}.autoupdate", false);
+ EOF
+ done
+ fi
+
+ # Force the graphite pref if USE=system-harfbuzz is enabled, since the pref cannot disable it
+ if use system-harfbuzz ; then
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set gfx.font_rendering.graphite.enabled pref"
+ sticky_pref("gfx.font_rendering.graphite.enabled", true);
+ EOF
+ fi
+
+ # Add telemetry config prefs, just in case something happens in future and telemetry build
+ # options stop working.
+ if ! use telemetry ; then
+ cat "${FILESDIR}"/gentoo-telemetry-prefs.js >>"${GENTOO_PREFS}" || die "failed to set telemetry prefs"
+ fi
+
+ # Install icons
+ local icon_srcdir="${S}/browser/branding/official"
+
+ # Prefer the upstream svg file they use when packaging flatpak so it's always up-to-date.
+ insinto /usr/share/icons/hicolor/symbolic/apps
+ newins "${S}"/browser/installer/linux/app/flatpak/files/share/icons/hicolor/symbolic/apps/org.mozilla.firefox-symbolic.svg firefox-symbolic.svg
+ dosym -r /usr/share/icons/hicolor/symbolic/apps/firefox-symbolic.svg /usr/share/icons/hicolor/symbolic/apps/org.mozilla.firefox-symbolic.svg
+
+ local icon size
+ for icon in "${icon_srcdir}"/default*.png ; do
+ size=${icon%.png}
+ size=${size##*/default}
+
+ if [[ ${size} -eq 48 ]] ; then
+ newicon "${icon}" ${PN}.png
+ fi
+
+ newicon -s ${size} "${icon}" ${PN}.png
+ done
+
+ # Install menu
+ local app_name="Mozilla ${MOZ_PN^}"
+ local desktop_file="${FILESDIR}/icon/${PN}-r3.desktop"
+ local exec_command="${PN}"
+ local icon="${PN}"
+ local use_wayland="false"
+
+ if [[ -n ${MOZ_ESR} ]] ; then
+ local desktop_filename="${PN}-esr.desktop"
+ else
+ local desktop_filename="${PN}.desktop"
+ fi
+
+ if use wayland ; then
+ use_wayland="true"
+ fi
+
+ cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die
+
+ sed -i \
+ -e "s:@NAME@:${app_name}:" \
+ -e "s:@EXEC@:${exec_command}:" \
+ -e "s:@ICON@:${icon}:" \
+ "${WORKDIR}/${PN}.desktop-template" || die
+
+ newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}"
+
+ rm "${WORKDIR}/${PN}.desktop-template" || die
+
+ if use gnome-shell ; then
+ # Install search provider for Gnome
+ insinto /usr/share/gnome-shell/search-providers/
+ doins browser/components/shell/search-provider-files/org.mozilla.firefox.search-provider.ini
+
+ insinto /usr/share/dbus-1/services/
+ doins browser/components/shell/search-provider-files/org.mozilla.firefox.SearchProvider.service
+
+ # Toggle between rapid and esr desktop file names
+ if [[ -n ${MOZ_ESR} ]] ; then
+ sed -e "s/firefox.desktop/${desktop_filename}/g" \
+ -i "${ED}/usr/share/gnome-shell/search-providers/org.mozilla.firefox.search-provider.ini" ||
+ die "Failed to sed org.mozilla.firefox.search-provider.ini file."
+ fi
+
+ # Make the dbus service aware of a previous session, bgo#939196
+ sed -e \
+ "s/Exec=\/usr\/bin\/firefox/Exec=\/usr\/$(get_libdir)\/firefox\/firefox --dbus-service \/usr\/bin\/firefox/g" \
+ -i "${ED}/usr/share/dbus-1/services/org.mozilla.firefox.SearchProvider.service" ||
+ die "Failed to sed org.mozilla.firefox.SearchProvider.service dbus file"
+
+ # Update prefs to enable Gnome search provider
+ cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to enable gnome-search-provider via prefs"
+ pref("browser.gnome-search-provider.enabled", true);
+ EOF
+ fi
+
+ # Install wrapper script
+ [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}"
+ newbin "${FILESDIR}/${PN}-r1.sh" ${PN}
+
+ # Update wrapper
+ sed -i \
+ -e "s:@PREFIX@:${EPREFIX}/usr:" \
+ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \
+ "${ED}/usr/bin/${PN}" || die
+
+ readme.gentoo_create_doc
+}
+
+pkg_postinst() {
+ xdg_pkg_postinst
+
+ if ! use gmp-autoupdate ; then
+ elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"
+ elog "installing into new profiles:"
+ local plugin
+ for plugin in "${MOZ_GMP_PLUGIN_LIST[@]}" ; do
+ elog "\t ${plugin}"
+ done
+ elog
+ fi
+
+ # bug 835078
+ if use hwaccel && has_version "x11-drivers/xf86-video-nouveau"; then
+ ewarn "You have nouveau drivers installed in your system and 'hwaccel' "
+ ewarn "enabled for Firefox. Nouveau / your GPU might not support the "
+ ewarn "required EGL, so either disable 'hwaccel' or try the workaround "
+ ewarn "explained in https://bugs.gentoo.org/835078#c5 if Firefox crashes."
+ fi
+
+ readme.gentoo_print_elog
+
+ optfeature_header "Optional programs for extra features:"
+ optfeature "desktop notifications" x11-libs/libnotify
+ optfeature "fallback mouse cursor theme e.g. on WMs" gnome-base/gsettings-desktop-schemas
+ optfeature "screencasting with pipewire" sys-apps/xdg-desktop-portal
+ if use hwaccel && has_version "x11-drivers/nvidia-drivers"; then
+ optfeature "hardware acceleration with NVIDIA cards" media-libs/nvidia-vaapi-driver
+ fi
+
+ if ! has_version "sys-libs/glibc"; then
+ elog
+ elog "glibc not found! You won't be able to play DRM content."
+ elog "See Gentoo bug #910309 or upstream bug #1843683."
+ elog
+ fi
+}
diff --git a/www-client/firefox/metadata.xml b/www-client/firefox/metadata.xml
index 81855373bae5..3c765712ec42 100644
--- a/www-client/firefox/metadata.xml
+++ b/www-client/firefox/metadata.xml
@@ -46,5 +46,5 @@
<flag name="wifi">Enable necko-wifi for NetworkManager integration, and access point MAC
address scanning for better precision with opt-in geolocation services</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/google-chrome-beta/Manifest b/www-client/google-chrome-beta/Manifest
index 5b666f747e13..01d3048b4111 100644
--- a/www-client/google-chrome-beta/Manifest
+++ b/www-client/google-chrome-beta/Manifest
@@ -1,3 +1,3 @@
-DIST google-chrome-beta_148.0.7778.96-1_amd64.deb 130226380 BLAKE2B 95b2be3a525ee8b775ebd79ed8d0c3188b85fb6142fada28e413df359e081adcf707da0516f368b48af84563ac93bd5d71f64406343ae93f4c2a78bd98b12251 SHA512 56f450070dae6ffa327ad25982672fcb0b430865e95c996cc3bc02304cfb97603caa77a82128de10df0b0ce0b2b39cb2ade100cc157ace9eda2299e423e1ff53
DIST google-chrome-beta_149.0.7827.14-1_amd64.deb 130208972 BLAKE2B 53ff1d579c4aefbf13e9f680e83b1db736ade11b25e9f86f3d4f8e73ba0cf87de0a574ab060d5b7a69daa3ab395a9de5cf4e45f76fcbf8bbc8db07201cdce1bc SHA512 0f8faed507ea01cb11a91994c7b1a07860b72bcda81daa7e5f5be5da48a8892e9d0039e16fff3042ba866cd140976dc0fa0a6b035f7be2cce062b34f7dd4017c
-DIST google-chrome-beta_149.0.7827.3-1_amd64.deb 130377820 BLAKE2B 33c6756714d1b20a0abfa64ad0e458bc6d476395c137dbcde6b1f8f1eb5f72a7afeb6eeee7e7bd319c14a11b6ba7c7ae0501b3ea5248522aa5bff35ce5eacbfd SHA512 15d3a56f22506c5a1195d507f43790d6241cd43366e25339c9c5eb72a275ea45c72c176681b79933dec5bab926613b8046b0eca7036c953380bd746693d20c2d
+DIST google-chrome-beta_149.0.7827.22-1_amd64.deb 130360996 BLAKE2B 7f67f6f3304b33ad34049d43c4f34bed1b227dc7888b3d4ad583c3312cf2ffcca88fc399b2d75412a1c0f3132c2bde7e3710178038847a7ed57fc26b040091a4 SHA512 83e900eb0d803d4d70577eafa8d8b0aafec1c49878d3abfda7c1ad267cc18fae6cb3e410d2978670998746a35b14626be704e61da273aa96bae532503d066755
+DIST google-chrome-beta_149.0.7827.53-1_amd64.deb 130395104 BLAKE2B e17eb9b3d002fd956b1cefc4e7c79f99930fdbfd8dce62740ef222445edc4619ff6a8d9d34693a090453537891ab06c79886199fc047f9333f95ba3e9531d329 SHA512 467434bc3908cb9e9dff56a0c27c931d533f12f2bc195096bcd8b37910d2dc21318bc70f871a602dc147c019f95e9813a0bdcf6f5b2f606adb84551953755581
diff --git a/www-client/google-chrome-beta/google-chrome-beta-148.0.7778.96.ebuild b/www-client/google-chrome-beta/google-chrome-beta-149.0.7827.22.ebuild
index 0f1f3ed4361a..0f1f3ed4361a 100644
--- a/www-client/google-chrome-beta/google-chrome-beta-148.0.7778.96.ebuild
+++ b/www-client/google-chrome-beta/google-chrome-beta-149.0.7827.22.ebuild
diff --git a/www-client/google-chrome-beta/google-chrome-beta-149.0.7827.3.ebuild b/www-client/google-chrome-beta/google-chrome-beta-149.0.7827.53.ebuild
index 0f1f3ed4361a..0f1f3ed4361a 100644
--- a/www-client/google-chrome-beta/google-chrome-beta-149.0.7827.3.ebuild
+++ b/www-client/google-chrome-beta/google-chrome-beta-149.0.7827.53.ebuild
diff --git a/www-client/google-chrome-beta/metadata.xml b/www-client/google-chrome-beta/metadata.xml
index 2ba83b95e902..4ec78c22ef60 100644
--- a/www-client/google-chrome-beta/metadata.xml
+++ b/www-client/google-chrome-beta/metadata.xml
@@ -12,5 +12,5 @@
<upstream>
<remote-id type="cpe">cpe:/a:google:chrome</remote-id>
</upstream>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/google-chrome-unstable/Manifest b/www-client/google-chrome-unstable/Manifest
index 075b777a7f01..e2e4b171805a 100644
--- a/www-client/google-chrome-unstable/Manifest
+++ b/www-client/google-chrome-unstable/Manifest
@@ -1,2 +1,3 @@
DIST google-chrome-unstable_150.0.7828.2-1_amd64.deb 130693424 BLAKE2B 58e60c36f7c1fb7475f066964898c7c3a9f912d0a028261289e08180bb2e4d2bd4dbe04c04f2379eb1d2c7110b3d74c0ccdbc4991ff83257c51cf13560fad289 SHA512 c3fee580dd3aef80bd00a012727257f8853c242fe0b862c2211cc1a91350e814a44eada1b1caafcbcde04a7e1a8e41c9d8f430f48fee6a8bb7a0228c198210d4
DIST google-chrome-unstable_150.0.7838.0-1_amd64.deb 130783808 BLAKE2B e6688cc842b72b464c43e8d941790fda69484e1063fedd04339b1b18b8bb6c72e40ea190303d65fec88772536e4ce263fdf41c4880e63ff26ccd3671ec7773d9 SHA512 70aad0b462a5e939ab24e3565544c56ef1822e01e37d1904bc5f7ffe677e5315a6c09d1dbf52cbb6230122641ce28bb058e8f08fc76453718a12f0836d7e399d
+DIST google-chrome-unstable_150.0.7846.4-1_amd64.deb 131201324 BLAKE2B 502ff9b6360b6aa3a03765aaaa92d2d03b09e3321964a82c6544849351b3e95a9bbef4272d868b548b06cd1fb6e4390e41f4f712b522fc8d705de758b1fe4e56 SHA512 89a98512a3210775c3a2416441b57052e2b127a5de908cb94ddd265bf0027b7c5e75b350cc947d974dbd244dd9dd6cacff59d69b74dc458fb547ed193206c44c
diff --git a/www-client/google-chrome-unstable/google-chrome-unstable-150.0.7846.4.ebuild b/www-client/google-chrome-unstable/google-chrome-unstable-150.0.7846.4.ebuild
new file mode 100644
index 000000000000..0f1f3ed4361a
--- /dev/null
+++ b/www-client/google-chrome-unstable/google-chrome-unstable-150.0.7846.4.ebuild
@@ -0,0 +1,129 @@
+# Copyright 2011-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu he
+ hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr
+ sv sw ta te th tr uk ur vi zh-CN zh-TW"
+
+inherit chromium-2 desktop pax-utils unpacker xdg
+
+DESCRIPTION="The web browser from Google"
+HOMEPAGE="https://www.google.com/chrome/"
+
+if [[ ${PN} == google-chrome ]]; then
+ MY_PN=${PN}-stable
+else
+ MY_PN=${PN}
+fi
+
+MY_P="${MY_PN}_${PV}-1"
+SRC_URI="https://dl.google.com/linux/chrome/deb/pool/main/g/${MY_PN}/${MY_P}_amd64.deb"
+S=${WORKDIR}
+
+LICENSE="google-chrome"
+SLOT="0"
+KEYWORDS="-* ~amd64"
+
+IUSE="qt6 selinux"
+
+RESTRICT="bindist mirror strip"
+
+RDEPEND="
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ app-misc/ca-certificates
+ dev-libs/expat
+ dev-libs/glib:2
+ dev-libs/nspr
+ >=dev-libs/nss-3.26
+ media-fonts/liberation-fonts
+ media-libs/alsa-lib
+ media-libs/mesa[gbm(+)]
+ net-misc/curl
+ net-print/cups
+ sys-apps/dbus
+ sys-libs/glibc
+ sys-libs/libcap
+ x11-libs/cairo
+ x11-libs/gdk-pixbuf:2
+ || (
+ x11-libs/gtk+:3[X]
+ gui-libs/gtk:4[X]
+ )
+ x11-libs/libdrm
+ >=x11-libs/libX11-1.5.0
+ x11-libs/libXcomposite
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXrandr
+ x11-libs/libxcb
+ x11-libs/libxkbcommon
+ x11-libs/libxshmfence
+ x11-libs/pango
+ x11-misc/xdg-utils
+ qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ selinux? ( sec-policy/selinux-chromium )
+"
+
+QA_PREBUILT="*"
+QA_DESKTOP_FILE="usr/share/applications/google-chrome.*\\.desktop"
+CHROME_HOME="opt/google/chrome${PN#google-chrome}"
+
+pkg_nofetch() {
+ eerror "Please wait 24 hours and sync your tree before reporting a bug for google-chrome fetch failures."
+}
+
+pkg_pretend() {
+ # Protect against people using autounmask overzealously
+ use amd64 || die "google-chrome only works on amd64"
+}
+
+pkg_setup() {
+ chromium_suid_sandbox_check_kernel_config
+}
+
+src_unpack() {
+ :
+}
+
+src_install() {
+ dodir /
+ cd "${ED}" || die
+ unpacker
+
+ mv usr/share/doc/${MY_PN} usr/share/doc/${PF} || die
+
+ # Since M141 Google Chrome comes with its own bundled cron
+ # scripts which invoke `apt` directly. Useless on Gentoo!
+ rm -r etc/cron.daily || die "Failed to remove cron scripts"
+ rm -r "${CHROME_HOME}"/cron || die "Failed to remove cron scripts"
+
+ gzip -d usr/share/doc/${PF}/changelog.gz || die
+ gzip -d usr/share/man/man1/${MY_PN}.1.gz || die
+ if [[ -L usr/share/man/man1/google-chrome.1.gz ]]; then
+ rm usr/share/man/man1/google-chrome.1.gz || die
+ dosym ${MY_PN}.1 usr/share/man/man1/google-chrome.1
+ fi
+
+ pushd "${CHROME_HOME}/locales" > /dev/null || die
+ chromium_remove_language_paks
+ popd > /dev/null || die
+
+ rm "${CHROME_HOME}/libqt5_shim.so" || die
+ if ! use qt6; then
+ rm "${CHROME_HOME}/libqt6_shim.so" || die
+ fi
+
+ local suffix=
+ [[ ${PN} == google-chrome-beta ]] && suffix=_beta
+ [[ ${PN} == google-chrome-unstable ]] && suffix=_dev
+
+ local size
+ for size in 16 24 32 48 64 128 256 ; do
+ newicon -s ${size} "${CHROME_HOME}/product_logo_${size}${suffix}.png" ${PN}.png
+ done
+
+ pax-mark m "${CHROME_HOME}/chrome"
+}
diff --git a/www-client/google-chrome-unstable/metadata.xml b/www-client/google-chrome-unstable/metadata.xml
index 2ba83b95e902..4ec78c22ef60 100644
--- a/www-client/google-chrome-unstable/metadata.xml
+++ b/www-client/google-chrome-unstable/metadata.xml
@@ -12,5 +12,5 @@
<upstream>
<remote-id type="cpe">cpe:/a:google:chrome</remote-id>
</upstream>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/google-chrome/Manifest b/www-client/google-chrome/Manifest
index c798dc2a0f23..e7dbb48c46be 100644
--- a/www-client/google-chrome/Manifest
+++ b/www-client/google-chrome/Manifest
@@ -1,3 +1,3 @@
-DIST google-chrome-stable_146.0.7680.177-1_amd64.deb 127819904 BLAKE2B 45e5e5b9068617c99c3418aef43db9c42b4054029f4aa33c3390f10bf05e8e152367fa14e38ac4c901e46a8e56b7ba69e4fdb72c5a7ff8e0016ac5ab45f64b33 SHA512 8be9a3e2052657b73ae2b957a4b24007f19d368e0cab3a8e0fc28e498b4dd4fcef6621a6f150249a51c005dc3c97b3300d8f195960584bd711b22128ce62367a
-DIST google-chrome-stable_147.0.7727.137-1_amd64.deb 124847388 BLAKE2B a78a63532cb8a62bd5c4cfd264d47bbc6077107149953cdcc191267c4b17f979ecee503273410ac6164e6711211dafdbc935475e089e99fb6faf559b14150c19 SHA512 f9548c62c554aa11f2ec55495131a99dc890060ea4290ea911e4b3336c1d54b5939d406655d924a63d15aade8985b56c8d5e3a82946e5be6edb10e959b44e244
DIST google-chrome-stable_148.0.7778.167-1_amd64.deb 130047612 BLAKE2B 4319e02458e79597a76ccc96cae13891d8142e0b4043548173dcf4d886629b60ac9a1c31b2906b6d2e3c87fed11e2666fbdd9890f2bc3fb51e599b2b9ee8f2ef SHA512 d84abda401d55783043a8b2702a15e10f20828211617e20590d61987054540066951fd7439296adecd5e1cd9dac462f10e06fbb138403cec72d991a9721673f3
+DIST google-chrome-stable_148.0.7778.178-1_amd64.deb 129520856 BLAKE2B e71df1b18f1474aadee22366e10c5344325cccfc0289c01beffc800b54c5d13790af1e124daa486a9c21866f6f4142735b6db11d2c4e5f5a5965f39600eee829 SHA512 e9ff36a1ae98193e62ddba35b97b66809c472efa820b1f669fd297b82a7451758d7cc6278df77649c8bf62d139f410da6d1ae9aa8212d1bdea87ce0da76f9a10
+DIST google-chrome-stable_148.0.7778.215-1_amd64.deb 129833324 BLAKE2B c5db9d3457a32d85fe7b4bfd05ea779d86aa6a4476259a3c77ec407b0831c661e941fc068802e1cbb6d5504a6484d24d10793c9bd6264e7b4212c86d3c1fffb5 SHA512 f03c199eb67a79604ce4e1af68ba0414f387a65049a16a54bf938805527b904816284240dc41b9389718c723e95e56788649b0da1a71da18676a63b993a28759
diff --git a/www-client/google-chrome/google-chrome-146.0.7680.177.ebuild b/www-client/google-chrome/google-chrome-148.0.7778.178.ebuild
index 1325717ace16..1325717ace16 100644
--- a/www-client/google-chrome/google-chrome-146.0.7680.177.ebuild
+++ b/www-client/google-chrome/google-chrome-148.0.7778.178.ebuild
diff --git a/www-client/google-chrome/google-chrome-147.0.7727.137.ebuild b/www-client/google-chrome/google-chrome-148.0.7778.215.ebuild
index 1325717ace16..1325717ace16 100644
--- a/www-client/google-chrome/google-chrome-147.0.7727.137.ebuild
+++ b/www-client/google-chrome/google-chrome-148.0.7778.215.ebuild
diff --git a/www-client/google-chrome/metadata.xml b/www-client/google-chrome/metadata.xml
index 2ba83b95e902..4ec78c22ef60 100644
--- a/www-client/google-chrome/metadata.xml
+++ b/www-client/google-chrome/metadata.xml
@@ -12,5 +12,5 @@
<upstream>
<remote-id type="cpe">cpe:/a:google:chrome</remote-id>
</upstream>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/helium-bin/Manifest b/www-client/helium-bin/Manifest
index 67eb33ca7b50..0baec5672956 100644
--- a/www-client/helium-bin/Manifest
+++ b/www-client/helium-bin/Manifest
@@ -1,6 +1,6 @@
-DIST helium-bin-0.10.8.1-amd64.tar.xz 117355324 BLAKE2B 3c29ffdb66ac9f70f333acf0fbfe10fff986c0c88edea4a118973807010b595addffd0306e998d3723bce11671ed9ef625a1dbcf6b69b4821024022d68780f58 SHA512 2a7f7af2ef9a3fb8f0c1e72f2624b9a81d5420545c0f42b6c1994b1c9c16c40e7c5d31df910adeddd191113bd99b122dd0023c36a7548adeab077f442219e86e
-DIST helium-bin-0.10.8.1-arm64.tar.xz 111740300 BLAKE2B e985ebe7b07de3c4f55d7dc742e55b4c4a4571e9d3a29195cbd2fddd4b116bffc1aa7dd256cbe0ba000bf3dfc08e9b93c4563c0724d7abafed5b5c6b8528e0e8 SHA512 ad7493ad39daaf0c06cf40d3e7b94804648944b118c366988a151783d2854202778f1181b564ac4e8cf975d3fe1b90c532e6220a5bfb5f2c337e2267a3737040
-DIST helium-bin-0.11.2.1-amd64.tar.xz 113947632 BLAKE2B 7b248804572742bf681efe9f08e9705affc488854b41fa5cbbff96890114e38c49238bd091355c0401f50077d113ef2e197f3f3b7fbb1e12e6b3cf4f42ffa3ca SHA512 f14b91d3676bd5aeb2315b9413015ed4faa3c50e9799cef6c4240ed7ed4152cf371f735d7daba803312f704af606601a798c25b7e549beb038c0ae30682e17d7
-DIST helium-bin-0.11.2.1-arm64.tar.xz 108584880 BLAKE2B ae7802e99d963a26b71c2cb5eaf29cface437d46751e941f052223480ab0b2c04c02c0342321cf99bb993086b842ec754fd2e203a93e2461caa9d14ceea13887 SHA512 fadb451f9ef017edebc6876f2f140c8585dad88035ac906a9eb4290a8bce92d9d59f2f05b04b9859c749a68bb0ae8d6c9e2bfd4f81904feb8f3d0cd9c6722e0f
DIST helium-bin-0.11.5.1-amd64.tar.xz 114348108 BLAKE2B 1e048fc6b930285fba1235ca2771077c3f33b957adfe6b3b64f5c8934a2aa5f4240ea77c98d3f1e4cb98d3cd9c78d0e9cf83b67a89a754c9ec14e294fd5f7ff7 SHA512 cecec58fc8d0c0eb9b0169c78f959338726aeb21de564e64877fd882e4be7b51fb2672437c8171d39264c1cbe4807365f64f1211e7e87553d93e6ef4b3433465
DIST helium-bin-0.11.5.1-arm64.tar.xz 108635984 BLAKE2B 6642eddaf747d1ecd736cf65e8a6ad81a7a499bc68236b4c2e3ba8a5077e12c8916ff8aa09925539e8d130992b142bf08d26039db0d7720848b8eda95b37bce3 SHA512 5b9ff07dcfdd6a4c695e7f986e16b8fb7bba6b089730b9e169b5f0b75076f730f17aa806bde0bcd6389e9259ff8e03e8c48a2872aef63bad4993f700d247e5e0
+DIST helium-bin-0.12.3.1-amd64.tar.xz 116581244 BLAKE2B 0791c0c4e4a10eb2a19c60316c08f5d5fcc78c8905b498c5ae6a82bf1bfc899a5670883a9adbc8e84953219751b12b4332133947203d6253ba63330ceef3aa04 SHA512 842654076aace35d2e463d1ff64d508bb841861774d521a46e11acd5d1f37956493bd2d240568d30093105c1573758de92dae541223a7ac0bbd5ed6b0cb843ed
+DIST helium-bin-0.12.3.1-arm64.tar.xz 110843524 BLAKE2B 600f6e64713aa212de25f3969c5f0bff1b58599cce0d35eda18b3f06aa09ad6f98fca744bf0e086008555a9481b127b01749a7b96827d8b6a444efce2e0f0b8a SHA512 d70b76b9aa6267754aff6494a38b31f96bdd2fa3bc5f9d20bcd45021a25ff6d16c02585a780be9274bcca2b22e3c210ce477d3ac823d51d15ed2ff9716e833e6
+DIST helium-bin-0.12.5.1-amd64.tar.xz 115974988 BLAKE2B 4c1bb5d5e8b0ea4637eb3c107553efef61ece873b5e1ba874da5111e17fc17d5b257dd47437d238ac12978bdd1e47ade187ac819db8eacb775ac15bccdb8adfe SHA512 79a74584165d2404c10b0199cc08ff9347a9d77717503678867c8badb8da399cf3f7109263800d55ca15ac1c35ba8232d9337d223d05ebdf056cd08f8b1f0a34
+DIST helium-bin-0.12.5.1-arm64.tar.xz 110915064 BLAKE2B ef4dd31302464aa2a95c6e9c18d1dce6d88db5ae64b94e12a54b5147f9e779c6b8f9fe5a8df5f302cf72c67e3c41b3c8d52b96bc8172ae5634ac52f9c7db18f4 SHA512 2ae58c4b01a45bb951b0fa6a0a4efef50b2236edb18006eb6d44f347d89d7a7e104c66b6c2e7ef07f6d5c90550247d476aeba9a57db6e6f8ce8c384b9c928a20
diff --git a/www-client/helium-bin/helium-bin-0.10.8.1.ebuild b/www-client/helium-bin/helium-bin-0.12.3.1.ebuild
index 8a170a17cfa9..8a170a17cfa9 100644
--- a/www-client/helium-bin/helium-bin-0.10.8.1.ebuild
+++ b/www-client/helium-bin/helium-bin-0.12.3.1.ebuild
diff --git a/www-client/helium-bin/helium-bin-0.11.2.1.ebuild b/www-client/helium-bin/helium-bin-0.12.5.1.ebuild
index 8a170a17cfa9..8a170a17cfa9 100644
--- a/www-client/helium-bin/helium-bin-0.11.2.1.ebuild
+++ b/www-client/helium-bin/helium-bin-0.12.5.1.ebuild
diff --git a/www-client/helium-bin/metadata.xml b/www-client/helium-bin/metadata.xml
index f35686a64409..e8f48a47268e 100644
--- a/www-client/helium-bin/metadata.xml
+++ b/www-client/helium-bin/metadata.xml
@@ -8,5 +8,5 @@
<upstream>
<bugs-to>https://github.com/imputnet/helium/issues</bugs-to>
</upstream>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/httrack/metadata.xml b/www-client/httrack/metadata.xml
index f82d5fb66a8f..75fd62d4e4ec 100644
--- a/www-client/httrack/metadata.xml
+++ b/www-client/httrack/metadata.xml
@@ -11,5 +11,5 @@
<upstream>
<remote-id type="cpe">cpe:/a:httrack:httrack</remote-id>
</upstream>
- <origin>ports</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/jd/metadata.xml b/www-client/jd/metadata.xml
index 623ccb80e6b1..097d2682389a 100644
--- a/www-client/jd/metadata.xml
+++ b/www-client/jd/metadata.xml
@@ -10,5 +10,5 @@
<flag name="migemo">Enable migemo support for Japanese</flag>
<flag name="oniguruma">Use <pkg>dev-libs/oniguruma</pkg> for regular expression</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/librewolf-bin/Manifest b/www-client/librewolf-bin/Manifest
index 12257041a251..2b09898877e6 100644
--- a/www-client/librewolf-bin/Manifest
+++ b/www-client/librewolf-bin/Manifest
@@ -1,4 +1,4 @@
-DIST librewolf-150.0.2-1-linux-arm64-package.tar.xz 86449020 BLAKE2B ebd3774a338abcc1269e90224cdf9e225d73bcbfc4af628de6b8ed45ca04b1b1020a2183e4f2840cf7f69d43bfd2f3c8930d698e9be27d58c4aca42a8674a962 SHA512 90e5a4e67433c8a8cc7236821a9f95cdb23c03ae6638af572f347525006dbc3bf23103c29e139ee4c7450f8c658798590e76211b02b5ea6f5382a147af46d43c
-DIST librewolf-150.0.2-1-linux-x86_64-package.tar.xz 98072376 BLAKE2B e95f2b14a4f681a18ef00fb4a7b84460f0ac3e4067756b0b579b98703317209ff3531d69abaa1ab53181f114b6f991d3556036eb64934a91be4955e66f8ec006 SHA512 e9fbccc04353c382a126bdde8134b153aebbb9c0a2f046561fd5ab4390177543aaf9271138d286cecb02ba089afe15db38ebabaa1d27c099057266d8f3fc0077
DIST librewolf-150.0.3-1-linux-arm64-package.tar.xz 86476272 BLAKE2B e77997bed1f60e7190702a61b54d24a786fcc0830e948a3568eafec38c21f54cc608d311ec630822f5fe6df435a213691158004060d112886afe564831384069 SHA512 3a1a95bd3a7e297f016c818d015b033e599e394b52f643b0b25a79d50a16b0d6c0571a3343b2bd263829167f648999943bfa51e879957b299469aa92b5ebd3b2
DIST librewolf-150.0.3-1-linux-x86_64-package.tar.xz 98082236 BLAKE2B 67f76bd60e5b4d4a0b46b962d9b8fbcaed8a9a9a2440ae09c40674a11b50da6c6f721553363c3502f1d0d1c76b218f6cc4359209c3201f7889c644b56b5d138e SHA512 8f0a3c90e96eb0b0705d5022dfb1febfca94e70a55de0e13a0e9662ab1d9820076f0e04f7a6e0e23024f9d130d69e06c91323688364be2c9ac555ada1192e42c
+DIST librewolf-151.0.1-2-linux-arm64-package.tar.xz 85332096 BLAKE2B d2e16a5b8fc1491ccc459f0d93e4c876c34f1521c9f946be451922c07c41bbe796e6e48499a489dbaca8eb6532f11d9afd65b387283e0aa9f84370e42037c98c SHA512 c9fa9aea0bd95e2b43933ea9daa098aac7bb9cb512285aa3a3af5a23b491f37aaa0ce23b005c6f6c0bee559e47e2b14197f2dce7945ea6143f19fdb62b7aa08b
+DIST librewolf-151.0.1-2-linux-x86_64-package.tar.xz 95821356 BLAKE2B 0604355dfa66401dd0ee7779c2d95738405aa2f533e257b86cb757dc54ef170eb9934a0603e21dba47b211d4b53b7cbe007334b215890b8a74c0dcf57d9f122c SHA512 4a50fe39d9ba7310afa10c74d726354909d14edb46a5d17f66111005177afcf6100c606418b1768f81dccc31a8b3bf82a8db358867a303175bc86fb6031468ea
diff --git a/www-client/librewolf-bin/librewolf-bin-150.0.2_p1.ebuild b/www-client/librewolf-bin/librewolf-bin-151.0.1_p2.ebuild
index 41265ec9d748..41265ec9d748 100644
--- a/www-client/librewolf-bin/librewolf-bin-150.0.2_p1.ebuild
+++ b/www-client/librewolf-bin/librewolf-bin-151.0.1_p2.ebuild
diff --git a/www-client/librewolf-bin/metadata.xml b/www-client/librewolf-bin/metadata.xml
index 38b5fdeffd91..9a975651d4d3 100644
--- a/www-client/librewolf-bin/metadata.xml
+++ b/www-client/librewolf-bin/metadata.xml
@@ -6,5 +6,5 @@
<name>James McClain</name>
</maintainer>
- <origin>librewolf-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/librewolf/Manifest b/www-client/librewolf/Manifest
index a2161c4f795b..bbb41abe13c7 100644
--- a/www-client/librewolf/Manifest
+++ b/www-client/librewolf/Manifest
@@ -1,4 +1,4 @@
-DIST firefox-150-patches-02.tar.xz 13452 BLAKE2B 3c6f1b824f4ac01e97c9b795a5ba62c19dd5cb2115df6d5c7da99d725206f9d10d7f536389e12f0ee18475347693bd270333f4349f1642dda68b5d4be11f2eb2 SHA512 057b2242cfa1cebbe7e4e47b2e51eae3e5a15669d507fbd32cad3fdc80586bbee4b853964ac329cf75751af2e04a66eeccdfd4d2b2aad8c49813582abfc38d47
-DIST librewolf-150.0.3-1.source.tar.gz 1097259332 BLAKE2B 5ffde77f3ed27e0c2d03038837632399596a6699c73ee36781fb1447de84f7f7ce0813b29862d64a27ce65f1f12d9dfd774dc53ef7d73256e55a6916f9abf651 SHA512 1af281b41b96cb5226f2d082df8188f58c3066cf154b8385ac5e484b96b37f21e7b3748ad29afed774e1055257dd1dd027e6dc32c905e7dda8ef25d1e5446583
+DIST firefox-151-patches-01.tar.xz 12784 BLAKE2B 3f50f9a6ee6f4a172d5e1ba4cd887a08c4dca38dc35b24c9917505032898215a6b17cd1c6c5590891e9b3b40f2ada5fccdcec0b53992bb1d7b6ee8e53d0b351c SHA512 4afcdde73781edca646b6e7a06d55a94ebee471bf0d3b2a2fca94b511f784071c03cc405178b8f9e624fe296e6e1963f8c59e65094f4723feac725d11eb707ee
+DIST librewolf-151.0.1-2.source.tar.gz 1132988415 BLAKE2B 5fa9765e1722b7bc575ec870a6539b9990844d2e4b3499aeb5aefc4996a059ee89b97de6c7999fc2ac173d502469e0719466b6a7d97763f25900f8738c1b5493 SHA512 0cb52807e7b19ae85beaf146aa0203b71879bba88b439171f469aa0e2596fcbb76664c23ab5170870348e93ab030ff48a4c1d5b3f739ed4d1231dbfd7a7bcf90
DIST wasi-sdk-32.0-arm64-linux.tar.gz 142940986 BLAKE2B 45712415f916c2749bac9002157def84f75d005bcac0403cb9b5a814623a1e0c2a2f24092d55478ca5204afa82c7499cabf405b8e5c6e95a514351801da4a91c SHA512 e39f3130290e63a7c2674e8838bd6569ca6a630c0231e2a303d6bd4a6b7f9c78b59a99606193c3ba3e200d93d9221339d23653e98ef720632d54c5c6866dde69
DIST wasi-sdk-32.0-x86_64-linux.tar.gz 143157058 BLAKE2B 62b83e2db70b24361962b392551c604b21c59535b8d34a5e652447d7b722b033327334f0e17381d28eaa6dcb31fb02aad9978c66b761fb592b6de502012aeb57 SHA512 f77c08d1eb0f8e765bed4955d4794b33bb38149df5a144bebbe43e91fce3cfda7210cdf57073c0ff23c1d3c68105b6c69b4782af1643a0be2f3310001a2398f0
diff --git a/www-client/librewolf/librewolf-150.0.3_p1.ebuild b/www-client/librewolf/librewolf-151.0.1_p2.ebuild
index 90d0134805cd..b09105455918 100644
--- a/www-client/librewolf/librewolf-150.0.3_p1.ebuild
+++ b/www-client/librewolf/librewolf-151.0.1_p2.ebuild
@@ -3,7 +3,7 @@
EAPI=8
-FIREFOX_PATCHSET="firefox-150-patches-02.tar.xz"
+FIREFOX_PATCHSET="firefox-151-patches-01.tar.xz"
LLVM_COMPAT=( 21 22 )
@@ -11,7 +11,7 @@ LLVM_COMPAT=( 21 22 )
RUST_NEEDS_LLVM=1
RUST_MIN_VER=1.90.0
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{12..14} )
PYTHON_REQ_USE="ncurses,sqlite,ssl"
VIRTUALX_REQUIRED="manual"
@@ -105,7 +105,7 @@ COMMON_DEPEND="${FF_ONLY_DEPEND}
dev-libs/glib:2
dev-libs/libffi:=
>=dev-libs/nss-3.123.1
- >=dev-libs/nspr-4.38
+ >=dev-libs/nspr-4.39
media-libs/alsa-lib
media-libs/fontconfig
media-libs/freetype
diff --git a/www-client/librewolf/metadata.xml b/www-client/librewolf/metadata.xml
index 2183ace027d2..0f06ef621359 100644
--- a/www-client/librewolf/metadata.xml
+++ b/www-client/librewolf/metadata.xml
@@ -42,5 +42,5 @@
<flag name="wifi">Enable necko-wifi for NetworkManager integration, and access point MAC
address scanning for better precision with opt-in geolocation services</flag>
</use>
- <origin>librewolf-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/links/metadata.xml b/www-client/links/metadata.xml
index c4673ee172a6..bb100ea70d96 100644
--- a/www-client/links/metadata.xml
+++ b/www-client/links/metadata.xml
@@ -20,5 +20,5 @@
<flag name="libevent">Enable <pkg>dev-libs/libevent</pkg> support</flag>
<flag name="lzip">Enable <pkg>app-arch/lzip</pkg> support</flag>
</use>
- <origin>ports</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/luakit/metadata.xml b/www-client/luakit/metadata.xml
index 3835802d5923..69ca42335ada 100644
--- a/www-client/luakit/metadata.xml
+++ b/www-client/luakit/metadata.xml
@@ -18,5 +18,5 @@
interface.
</longdescription>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/lynx/metadata.xml b/www-client/lynx/metadata.xml
index 14cd4c075ff5..efbe85396195 100644
--- a/www-client/lynx/metadata.xml
+++ b/www-client/lynx/metadata.xml
@@ -8,5 +8,5 @@
<flag name="ssl">Enable HTTPS support.</flag>
<flag name="gnutls">Use gnutls library for HTTPS support (openssl is the default library for HTTPS support).</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/microsoft-edge-beta/Manifest b/www-client/microsoft-edge-beta/Manifest
index 8bedc43a57d4..70b32d1992c2 100644
--- a/www-client/microsoft-edge-beta/Manifest
+++ b/www-client/microsoft-edge-beta/Manifest
@@ -1,3 +1,3 @@
-DIST microsoft-edge-beta_148.0.3967.52-1_amd64.deb 181942010 BLAKE2B c89396e7a99f9c48761fa9ca1103a3a925e58b9de240c8c01c437682c53d0692da6e283611219b92287867df81693e4745ef27e8e4ffb4777d258e2fc22a728f SHA512 5dfbb75d7795ad0a077ad258ea083b995419d0cfe71ed1ce19aac007e24a0cd952faeaf0e7a1e9065ded2b3fb39e12e13a54de6da1f75488b823a5228d26da6c
-DIST microsoft-edge-beta_148.0.3967.54-1_amd64.deb 181888218 BLAKE2B 779ce2be8ead9d9377e34e4adb12141c0b49ba77f4bf046722236c0f65139c04fafacdc46dd2b6babc974fd305a3ce176ae57b8921ca4442f0d19ba59198c9e4 SHA512 eab3f8e49e013d8031def719b93a27cfbe4fe1a73a66ab6296b10d89ab069e057a01056fb54e3eef42a0d8ed4519fc91649510277ec784931f8365fd2860f687
-DIST microsoft-edge-beta_149.0.4022.8-1_amd64.deb 183983962 BLAKE2B 5561a6bc58bf785768adf461b72d6d6bab41573bac1f2f1572226db3f7f835e51a6e6294121e8e5c3ee011a826f8b3113c158fd9cd94ffca5bfa1023101b8a92 SHA512 11d86d87661bf2cce60678dd426e05629568552d629a21bba2aa1e017914857cd4f1a357f4a8ada876223f2e7eb661a6a9bfaba5c68da306249b270ca45a1dc1
+DIST microsoft-edge-beta_149.0.4022.16-1_amd64.deb 183973010 BLAKE2B 0024739568a9992d353e7adf6f6c080dd05ab8a285614944d4209bbd137261cfd9c7a6f88c9682a97b74d4900426c78c8f744a07151bede3b848bc8ee9915c16 SHA512 e24d5eee084e8ecabdc2d7159e19edf3bae6d2b6f53f2e2403385599c6dcd869e8112ac889b9dee1ed43aa9d0ca8fc280b06751a9ea7c78c9a6ce06bfff81d43
+DIST microsoft-edge-beta_149.0.4022.24-1_amd64.deb 184059698 BLAKE2B 8859c319eaef04d03bb8cd4be1400eb915c4f6d2dd7d51f7e050956f96783b617a2a4b246c51a6083869aa861186307a4bb50f1e9e4778b5d7a474f4ec368a69 SHA512 bb682c339153546ce474a7df5662fd634cf41a20d6cc6b887d2a663674aeb71e0d27e366d835eecae9e25e865b1950ec71970be643b5c7a02dd51bb7e6165922
+DIST microsoft-edge-beta_149.0.4022.33-1_amd64.deb 184088494 BLAKE2B e9e2c56bf0ecb793af04fb32182fec67af3a28f7592ac39a991df4bf3984655058d77b87a3a6b3559fd87b5bca5b6ab135ae92a2e91c30968f2fa00947498405 SHA512 4132157c4d5fb2843a06356a000591278fa626b6c7513c5bc43312257d139c14e336d9c5289c25782df17e39e6d0cbdb8601fce23e2b97324e1cc95c3a1526cf
diff --git a/www-client/microsoft-edge-beta/metadata.xml b/www-client/microsoft-edge-beta/metadata.xml
index 8a3defbac255..14e06a496a99 100644
--- a/www-client/microsoft-edge-beta/metadata.xml
+++ b/www-client/microsoft-edge-beta/metadata.xml
@@ -13,5 +13,5 @@
<use>
<flag name="mip">Install Microsoft Information Protection plugin.</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/microsoft-edge-beta/microsoft-edge-beta-148.0.3967.52.ebuild b/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.16.ebuild
index 5df628cd26aa..b5d7a187244f 100644
--- a/www-client/microsoft-edge-beta/microsoft-edge-beta-148.0.3967.52.ebuild
+++ b/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.16.ebuild
@@ -22,7 +22,7 @@ LICENSE="microsoft-edge"
SLOT="0"
KEYWORDS="-* ~amd64"
-IUSE="+mip qt6"
+IUSE="+mip qt6 selinux"
RESTRICT="bindist mirror strip"
RDEPEND="
@@ -60,6 +60,7 @@ RDEPEND="
|| ( dev-libs/libxml2-compat:2/2 dev-libs/libxml2:2/2 )
)
qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ selinux? ( sec-policy/selinux-chromium )
"
QA_PREBUILT="*"
@@ -113,7 +114,7 @@ src_install() {
done
if ! use mip; then
- rm "${EDGE_HOME}"/libmip_{core,protection_sdk}.so || die
+ rm "${EDGE_HOME}"/libmip_core_gn.so || die
fi
rm "${EDGE_HOME}/libqt5_shim.so" || die
diff --git a/www-client/microsoft-edge-beta/microsoft-edge-beta-148.0.3967.54.ebuild b/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.24.ebuild
index 5df628cd26aa..b5d7a187244f 100644
--- a/www-client/microsoft-edge-beta/microsoft-edge-beta-148.0.3967.54.ebuild
+++ b/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.24.ebuild
@@ -22,7 +22,7 @@ LICENSE="microsoft-edge"
SLOT="0"
KEYWORDS="-* ~amd64"
-IUSE="+mip qt6"
+IUSE="+mip qt6 selinux"
RESTRICT="bindist mirror strip"
RDEPEND="
@@ -60,6 +60,7 @@ RDEPEND="
|| ( dev-libs/libxml2-compat:2/2 dev-libs/libxml2:2/2 )
)
qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ selinux? ( sec-policy/selinux-chromium )
"
QA_PREBUILT="*"
@@ -113,7 +114,7 @@ src_install() {
done
if ! use mip; then
- rm "${EDGE_HOME}"/libmip_{core,protection_sdk}.so || die
+ rm "${EDGE_HOME}"/libmip_core_gn.so || die
fi
rm "${EDGE_HOME}/libqt5_shim.so" || die
diff --git a/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.33.ebuild b/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.33.ebuild
new file mode 100644
index 000000000000..b5d7a187244f
--- /dev/null
+++ b/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.33.ebuild
@@ -0,0 +1,126 @@
+# Copyright 2011-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="8"
+
+inherit chromium-2 desktop pax-utils unpacker xdg
+
+DESCRIPTION="The web browser from Microsoft"
+HOMEPAGE="https://www.microsoft.com/edge"
+
+if [[ ${PN} == microsoft-edge ]]; then
+ MY_PN=${PN}-stable
+else
+ MY_PN=${PN}
+fi
+
+MY_P="${MY_PN}_${PV}-1"
+SRC_URI="https://packages.microsoft.com/repos/edge/pool/main/m/${MY_PN}/${MY_P}_amd64.deb"
+S=${WORKDIR}
+
+LICENSE="microsoft-edge"
+SLOT="0"
+KEYWORDS="-* ~amd64"
+
+IUSE="+mip qt6 selinux"
+RESTRICT="bindist mirror strip"
+
+RDEPEND="
+ >=app-accessibility/at-spi2-core-2.46.0:2
+ app-misc/ca-certificates
+ dev-libs/expat
+ dev-libs/glib:2
+ dev-libs/nspr
+ dev-libs/nss
+ media-fonts/liberation-fonts
+ media-libs/alsa-lib
+ media-libs/mesa[gbm(+)]
+ net-misc/curl[ssl]
+ net-print/cups
+ sys-apps/dbus
+ sys-apps/util-linux
+ sys-libs/glibc
+ x11-libs/cairo
+ x11-libs/gdk-pixbuf:2
+ x11-libs/gtk+:3[X]
+ x11-libs/libdrm
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ x11-libs/libXrandr
+ x11-libs/libxcb
+ x11-libs/libxkbcommon
+ x11-libs/libxshmfence
+ x11-libs/pango
+ x11-misc/xdg-utils
+ mip? (
+ app-crypt/libsecret
+ || ( dev-libs/libxml2-compat:2/2 dev-libs/libxml2:2/2 )
+ )
+ qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ selinux? ( sec-policy/selinux-chromium )
+"
+
+QA_PREBUILT="*"
+QA_DESKTOP_FILE="usr/share/applications/microsoft-edge.*\\.desktop"
+EDGE_HOME="opt/microsoft/msedge${PN#microsoft-edge}"
+
+pkg_nofetch() {
+ eerror "Please wait 24 hours and sync your tree before reporting a bug for microsoft-edge fetch failures."
+}
+
+pkg_pretend() {
+ # Protect against people using autounmask overzealously
+ use amd64 || die "microsoft-edge only works on amd64"
+}
+
+pkg_setup() {
+ chromium_suid_sandbox_check_kernel_config
+}
+
+src_unpack() {
+ :
+}
+
+src_install() {
+ dodir /
+ cd "${ED}" || die
+ unpacker
+
+ rm -f _gpgorigin || die
+
+ mv usr/share/doc/${MY_PN} usr/share/doc/${PF} || die
+
+ # Microsoft Edge comes with its own bundled cron
+ # scripts which invoke `apt` directly. Useless on Gentoo!
+ rm -r etc/cron.daily || die "Failed to remove cron scripts"
+ rm -r "${EDGE_HOME}"/cron || die "Failed to remove cron scripts"
+
+ gzip -d usr/share/doc/${PF}/changelog.gz || die
+ gzip -d usr/share/man/man1/${MY_PN}.1.gz || die
+ if [[ -L usr/share/man/man1/${PN}.1.gz ]]; then
+ rm usr/share/man/man1/${PN}.1.gz || die
+ dosym ${MY_PN}.1 usr/share/man/man1/${PN}.1
+ fi
+
+ local size
+ # channel suffix: "" stable, "_channel" for beta/dev.
+ local channel=${PN#microsoft-edge}
+ channel=${channel/-/_}
+ for size in 16 24 32 48 64 128 256 ; do
+ newicon -s ${size} "${EDGE_HOME}/product_logo_${size}${channel}.png" ${PN}.png
+ done
+
+ if ! use mip; then
+ rm "${EDGE_HOME}"/libmip_core_gn.so || die
+ fi
+
+ rm "${EDGE_HOME}/libqt5_shim.so" || die
+ if ! use qt6; then
+ rm "${EDGE_HOME}/libqt6_shim.so" || die
+ fi
+
+ pax-mark m "${EDGE_HOME}/msedge"
+}
diff --git a/www-client/microsoft-edge-dev/Manifest b/www-client/microsoft-edge-dev/Manifest
index ad5855b24c4f..386811553fc2 100644
--- a/www-client/microsoft-edge-dev/Manifest
+++ b/www-client/microsoft-edge-dev/Manifest
@@ -1,3 +1,3 @@
-DIST microsoft-edge-dev_149.0.4009.0-1_amd64.deb 183241386 BLAKE2B 47d3f17711e58043d05d6bee46b47532ba69c73f372fd1d5a80ad7e67619cba1c7b645aa5b4b6b0a6671d836ec4cc3eb9f22c766ea3e52d7ab015829a09219af SHA512 05cfdbf602318c76295f2a024a3f162e39c844262f4f95ce60fbf13e5674f1bf271e1ae1f0805a2d9304e2b4699ac88c6a4493277b7f0a11716a93216627131d
-DIST microsoft-edge-dev_149.0.4022.4-1_amd64.deb 183935046 BLAKE2B c39fda6e46183926ee3a27b695e3a1043440c2c0eba74757527625f1f66824c5a8ef5560479395975fc4be4583b0538fa01905fa935758d63d9865beabf4d7c9 SHA512 d3c46b847b0d8021892870793a7f105e22971a7b02fd27588486841284cbb90405cc9d8db33ec94c72cdcdafa3f07473892a3336e8dccf3b1a85bc1cd2f8450e
DIST microsoft-edge-dev_149.0.4022.8-1_amd64.deb 183974538 BLAKE2B ed5fc0678dc7871945bdccc8e6c2f71574619e1eb01eae3f19604889645184f131e697396ba7e09180e0a1223b6c92d6b703248e53e56ffda21afe8cd634e355 SHA512 f7212623fc8f57837da1abd6c0d656b308ca33d0e53f0ceda2b6fd66634302b3ee26783e8aa9e6109328e6253cdd5d087039cb2a8072371954904359a78ebaf5
+DIST microsoft-edge-dev_150.0.4041.0-1_amd64.deb 184713858 BLAKE2B 49390d0a6183323a8f0870fbea0cf53a0602f157743b93245cafdf07cc2ae5738f03376432bc1f38426880ef5a10a022a21bd56383e6666542733d6242951704 SHA512 970dca1f0a57314a9cc968eb4ad3ca237e03d9481dfa8de2e3328190e3480c78152c358008c0a81c0d056eaf2a8ac1ba12b07cedeadc8d094cf9a1909661950c
+DIST microsoft-edge-dev_150.0.4055.0-1_amd64.deb 185235918 BLAKE2B 4612e4c2b2cdf125867a938f53eb4af3373e815f57026a81298fe012e7d4abf0292c012075f25ced3402e12b2b0de1719ddbf199014b0c877033350bd38f8105 SHA512 74f8eed4c8e885db3241512992a44991f89ba00d3e0b4e76bd12cf43361a049491627c2be21b216d7b4416c834071d9273fb09865f70f836e7b1a80ad97e6a50
diff --git a/www-client/microsoft-edge-dev/metadata.xml b/www-client/microsoft-edge-dev/metadata.xml
index 8a3defbac255..14e06a496a99 100644
--- a/www-client/microsoft-edge-dev/metadata.xml
+++ b/www-client/microsoft-edge-dev/metadata.xml
@@ -13,5 +13,5 @@
<use>
<flag name="mip">Install Microsoft Information Protection plugin.</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.4.ebuild b/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.4.ebuild
deleted file mode 100644
index 5df628cd26aa..000000000000
--- a/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.4.ebuild
+++ /dev/null
@@ -1,125 +0,0 @@
-# Copyright 2011-2026 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI="8"
-
-inherit chromium-2 desktop pax-utils unpacker xdg
-
-DESCRIPTION="The web browser from Microsoft"
-HOMEPAGE="https://www.microsoft.com/edge"
-
-if [[ ${PN} == microsoft-edge ]]; then
- MY_PN=${PN}-stable
-else
- MY_PN=${PN}
-fi
-
-MY_P="${MY_PN}_${PV}-1"
-SRC_URI="https://packages.microsoft.com/repos/edge/pool/main/m/${MY_PN}/${MY_P}_amd64.deb"
-S=${WORKDIR}
-
-LICENSE="microsoft-edge"
-SLOT="0"
-KEYWORDS="-* ~amd64"
-
-IUSE="+mip qt6"
-RESTRICT="bindist mirror strip"
-
-RDEPEND="
- >=app-accessibility/at-spi2-core-2.46.0:2
- app-misc/ca-certificates
- dev-libs/expat
- dev-libs/glib:2
- dev-libs/nspr
- dev-libs/nss
- media-fonts/liberation-fonts
- media-libs/alsa-lib
- media-libs/mesa[gbm(+)]
- net-misc/curl[ssl]
- net-print/cups
- sys-apps/dbus
- sys-apps/util-linux
- sys-libs/glibc
- x11-libs/cairo
- x11-libs/gdk-pixbuf:2
- x11-libs/gtk+:3[X]
- x11-libs/libdrm
- x11-libs/libX11
- x11-libs/libXcomposite
- x11-libs/libXdamage
- x11-libs/libXext
- x11-libs/libXfixes
- x11-libs/libXrandr
- x11-libs/libxcb
- x11-libs/libxkbcommon
- x11-libs/libxshmfence
- x11-libs/pango
- x11-misc/xdg-utils
- mip? (
- app-crypt/libsecret
- || ( dev-libs/libxml2-compat:2/2 dev-libs/libxml2:2/2 )
- )
- qt6? ( dev-qt/qtbase:6[gui,widgets] )
-"
-
-QA_PREBUILT="*"
-QA_DESKTOP_FILE="usr/share/applications/microsoft-edge.*\\.desktop"
-EDGE_HOME="opt/microsoft/msedge${PN#microsoft-edge}"
-
-pkg_nofetch() {
- eerror "Please wait 24 hours and sync your tree before reporting a bug for microsoft-edge fetch failures."
-}
-
-pkg_pretend() {
- # Protect against people using autounmask overzealously
- use amd64 || die "microsoft-edge only works on amd64"
-}
-
-pkg_setup() {
- chromium_suid_sandbox_check_kernel_config
-}
-
-src_unpack() {
- :
-}
-
-src_install() {
- dodir /
- cd "${ED}" || die
- unpacker
-
- rm -f _gpgorigin || die
-
- mv usr/share/doc/${MY_PN} usr/share/doc/${PF} || die
-
- # Microsoft Edge comes with its own bundled cron
- # scripts which invoke `apt` directly. Useless on Gentoo!
- rm -r etc/cron.daily || die "Failed to remove cron scripts"
- rm -r "${EDGE_HOME}"/cron || die "Failed to remove cron scripts"
-
- gzip -d usr/share/doc/${PF}/changelog.gz || die
- gzip -d usr/share/man/man1/${MY_PN}.1.gz || die
- if [[ -L usr/share/man/man1/${PN}.1.gz ]]; then
- rm usr/share/man/man1/${PN}.1.gz || die
- dosym ${MY_PN}.1 usr/share/man/man1/${PN}.1
- fi
-
- local size
- # channel suffix: "" stable, "_channel" for beta/dev.
- local channel=${PN#microsoft-edge}
- channel=${channel/-/_}
- for size in 16 24 32 48 64 128 256 ; do
- newicon -s ${size} "${EDGE_HOME}/product_logo_${size}${channel}.png" ${PN}.png
- done
-
- if ! use mip; then
- rm "${EDGE_HOME}"/libmip_{core,protection_sdk}.so || die
- fi
-
- rm "${EDGE_HOME}/libqt5_shim.so" || die
- if ! use qt6; then
- rm "${EDGE_HOME}/libqt6_shim.so" || die
- fi
-
- pax-mark m "${EDGE_HOME}/msedge"
-}
diff --git a/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.8.ebuild b/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.8.ebuild
index 5df628cd26aa..4a155cc26040 100644
--- a/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.8.ebuild
+++ b/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4022.8.ebuild
@@ -113,7 +113,7 @@ src_install() {
done
if ! use mip; then
- rm "${EDGE_HOME}"/libmip_{core,protection_sdk}.so || die
+ rm "${EDGE_HOME}"/libmip_core_gn.so || die
fi
rm "${EDGE_HOME}/libqt5_shim.so" || die
diff --git a/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.8.ebuild b/www-client/microsoft-edge-dev/microsoft-edge-dev-150.0.4041.0.ebuild
index 5df628cd26aa..4a155cc26040 100644
--- a/www-client/microsoft-edge-beta/microsoft-edge-beta-149.0.4022.8.ebuild
+++ b/www-client/microsoft-edge-dev/microsoft-edge-dev-150.0.4041.0.ebuild
@@ -113,7 +113,7 @@ src_install() {
done
if ! use mip; then
- rm "${EDGE_HOME}"/libmip_{core,protection_sdk}.so || die
+ rm "${EDGE_HOME}"/libmip_core_gn.so || die
fi
rm "${EDGE_HOME}/libqt5_shim.so" || die
diff --git a/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4009.0.ebuild b/www-client/microsoft-edge-dev/microsoft-edge-dev-150.0.4055.0.ebuild
index 5df628cd26aa..4a155cc26040 100644
--- a/www-client/microsoft-edge-dev/microsoft-edge-dev-149.0.4009.0.ebuild
+++ b/www-client/microsoft-edge-dev/microsoft-edge-dev-150.0.4055.0.ebuild
@@ -113,7 +113,7 @@ src_install() {
done
if ! use mip; then
- rm "${EDGE_HOME}"/libmip_{core,protection_sdk}.so || die
+ rm "${EDGE_HOME}"/libmip_core_gn.so || die
fi
rm "${EDGE_HOME}/libqt5_shim.so" || die
diff --git a/www-client/microsoft-edge/Manifest b/www-client/microsoft-edge/Manifest
index c28c6515f637..39a432a2f9d1 100644
--- a/www-client/microsoft-edge/Manifest
+++ b/www-client/microsoft-edge/Manifest
@@ -1 +1 @@
-DIST microsoft-edge-stable_148.0.3967.54-1_amd64.deb 181930214 BLAKE2B 35eb069550a11e02e4f90b13bc77f96c2337d08dacacb14e158c3f88092573faa24b9054123bd7fd24364c53c0473aebce57748fc8fa9f3bbcf23b2bf806c9d1 SHA512 c61ed01810736d6629cc30a4749e3662d8f8a49d4401114fc989f6e9cf3c70abc0871270e53cd571da8be1a669a17c2a7b01fd04ca0c3fa0f4b59c72952c1781
+DIST microsoft-edge-stable_148.0.3967.96-1_amd64.deb 182094938 BLAKE2B 9db9636d7b50b50baa85c161485b99871c9905222ed06d3e07765b7210b7647c7d82d8ba2d69a5376f3d3bb1a5390553a8175594ba6fefa14d69c5f604d428ab SHA512 af7950d5f695755e34cb2e07489923742e70bcbb938ad55efa57c409bc129504b3734d9afa859bbdb3865cad62159fc01b107cfe1446af84080ee3675d25027f
diff --git a/www-client/microsoft-edge/metadata.xml b/www-client/microsoft-edge/metadata.xml
index 8a3defbac255..14e06a496a99 100644
--- a/www-client/microsoft-edge/metadata.xml
+++ b/www-client/microsoft-edge/metadata.xml
@@ -13,5 +13,5 @@
<use>
<flag name="mip">Install Microsoft Information Protection plugin.</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/microsoft-edge/microsoft-edge-148.0.3967.54.ebuild b/www-client/microsoft-edge/microsoft-edge-148.0.3967.96.ebuild
index eb8ec1029e07..8a580fe9c620 100644
--- a/www-client/microsoft-edge/microsoft-edge-148.0.3967.54.ebuild
+++ b/www-client/microsoft-edge/microsoft-edge-148.0.3967.96.ebuild
@@ -22,7 +22,7 @@ LICENSE="microsoft-edge"
SLOT="0"
KEYWORDS="-* amd64"
-IUSE="+mip qt6"
+IUSE="+mip qt6 selinux"
RESTRICT="bindist mirror strip"
RDEPEND="
@@ -60,6 +60,7 @@ RDEPEND="
|| ( dev-libs/libxml2-compat:2/2 dev-libs/libxml2:2/2 )
)
qt6? ( dev-qt/qtbase:6[gui,widgets] )
+ selinux? ( sec-policy/selinux-chromium )
"
QA_PREBUILT="*"
@@ -113,7 +114,7 @@ src_install() {
done
if ! use mip; then
- rm "${EDGE_HOME}"/libmip_{core,protection_sdk}.so || die
+ rm "${EDGE_HOME}"/libmip_core_gn.so || die
fi
rm "${EDGE_HOME}/libqt5_shim.so" || die
diff --git a/www-client/mullvad-browser-bin/Manifest b/www-client/mullvad-browser-bin/Manifest
index 26899ff41260..edbd67914b99 100644
--- a/www-client/mullvad-browser-bin/Manifest
+++ b/www-client/mullvad-browser-bin/Manifest
@@ -1,2 +1,2 @@
-DIST mullvad-browser-bin-15.0.12.tar.xz 117001392 BLAKE2B 9988c2a7b7e7a18836a4ee1db6ba065f8e8b7abc49828a6d51ea0df7eac5d49e0bb04d987e7e12baeab0c4d56c29f9e90953f66355ac9fecbb14a9e50389807a SHA512 deadfdbca655b193eceded3cd37efa9d7c89e64c6c6d81c5d33fe570d41cdc459a9d5bf18da423fdbd3b59fcf01f7586979cb7710d24c9fa269fb8fc0915aafc
-DIST mullvad-browser-bin-15.0.12.tar.xz.asc 833 BLAKE2B 34859b7a3ca1d6fef8cce2788aa5de1ea0599f43015659120db291a4de9b78cdba762106f13cc73875faf3d6a16b691f3fa0363f0c1a9350ec429397a7d0bffb SHA512 6ba1a9b6e9f7ee62645fb1f7b6ad2af3bad9164bc239426d0e808d4eab835ee4aa1e30ffa27dc8611cbcab631d23a7028f54f484e6ce4ed4f158ce066973059d
+DIST mullvad-browser-bin-15.0.14.tar.xz 116969068 BLAKE2B ff4b08184596a89bf58c874d5e12fa9336f067b310ac23e60e21b5aa77513f93f16a1e991dee60a6b6621102257a9aeec1e2aaffc6b42a3627907bbd959d04ac SHA512 8ff157e7028c43a08cd41f303274ca59e97a76a99043512abb1d7aa3816c2ef4a61e505b2424b8730780b41de6614a37feab3fce20a4a6f169290c4b3dab7cb4
+DIST mullvad-browser-bin-15.0.14.tar.xz.asc 833 BLAKE2B 617ce48b5be82e0181ad6fbec333864431d69deec48f5677ed6c72103b48c2c52b9af87b61bd8f18a44d3d1f36c76cbe40aa2a09d39791d83f77ecffe77e4dbe SHA512 4a7e8adb806ac17f724e0c24aba305d23b4293e6dbe34fc90fd8d07acc7bf618c05c889b8906e883225399039a4f6c779de405eb9968c39b87232aba6c16b713
diff --git a/www-client/mullvad-browser-bin/metadata.xml b/www-client/mullvad-browser-bin/metadata.xml
index 954ad1a7e485..1ea2603576ea 100644
--- a/www-client/mullvad-browser-bin/metadata.xml
+++ b/www-client/mullvad-browser-bin/metadata.xml
@@ -6,5 +6,5 @@
<name>Justin</name>
</maintainer>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/mullvad-browser-bin/mullvad-browser-bin-15.0.12.ebuild b/www-client/mullvad-browser-bin/mullvad-browser-bin-15.0.14.ebuild
index d8b3a434bc84..d8b3a434bc84 100644
--- a/www-client/mullvad-browser-bin/mullvad-browser-bin-15.0.12.ebuild
+++ b/www-client/mullvad-browser-bin/mullvad-browser-bin-15.0.14.ebuild
diff --git a/www-client/netrik/metadata.xml b/www-client/netrik/metadata.xml
index 0f6a7fbb05b0..8d857ba9f647 100644
--- a/www-client/netrik/metadata.xml
+++ b/www-client/netrik/metadata.xml
@@ -4,5 +4,5 @@
<upstream>
<bugs-to>https://sourceforge.net/p/netrik/bugs/</bugs-to>
</upstream>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/netsurf/metadata.xml b/www-client/netsurf/metadata.xml
index 0e1dea530304..35f1ec5af521 100644
--- a/www-client/netsurf/metadata.xml
+++ b/www-client/netsurf/metadata.xml
@@ -46,5 +46,5 @@
frontend
</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/nyxt/metadata.xml b/www-client/nyxt/metadata.xml
index d699dccf3fef..c64511d7a2fc 100644
--- a/www-client/nyxt/metadata.xml
+++ b/www-client/nyxt/metadata.xml
@@ -17,5 +17,5 @@
<bugs-to>https://github.com/atlas-engineer/nyxt/issues</bugs-to>
<doc>https://nyxt.atlas.engineer/documentation</doc>
</upstream>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/opera-beta/metadata.xml b/www-client/opera-beta/metadata.xml
index 5615e1c6c948..47a090e25d52 100644
--- a/www-client/opera-beta/metadata.xml
+++ b/www-client/opera-beta/metadata.xml
@@ -12,5 +12,5 @@
<flag name="ffmpeg-chromium">Use Chromium FFmpeg fork (<pkg>media-video/ffmpeg-chromium</pkg>) rather than mainline FFmpeg (<pkg>media-video/ffmpeg</pkg>)</flag>
<flag name="proprietary-codecs">Enable codecs for patent-encumbered audio and video formats.</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/opera-developer/Manifest b/www-client/opera-developer/Manifest
index 7b00430a9c0c..0d7307dc9ef1 100644
--- a/www-client/opera-developer/Manifest
+++ b/www-client/opera-developer/Manifest
@@ -1,3 +1,3 @@
-DIST opera-developer_132.0.5883.0_amd64.deb 135149752 BLAKE2B 167ddb05b985d1df9b0c16c5056acf120a5cb34b192f7a000fd905d72f737199bac00500a69a92591c18e6b3709f5f727469a1742161180f49f7058c9afd3bdc SHA512 00ce2a83d58b17bf3d4e42f928cedb7553f4e793bfefda3872a8964803393c1969d7a62ecb3057f9d16b786dea28f0429249984abbc6f47e5011a6715f187c4a
-DIST opera-developer_132.0.5889.0_amd64.deb 135132360 BLAKE2B 685c26fbad7716c1f3d71937827010439627a9b581115e6fd457c8dc32c9fee64d46f36a19f40174daef5d2dcae0ddad1f84e38b41d7fa82dc13fa9a1156e4cb SHA512 93265408e7129c8785d28c75211f907361a8bf8f9aa2d82a5d0593aab31eb104eab543172e402185e37d857b5ff641e0a858f97d14d19a6ac312f6f80d735e1f
DIST opera-developer_132.0.5898.0_amd64.deb 135171356 BLAKE2B b5e3b5b223362360bd5a4f05ade66bbaf71b4b0ad9204a7dcfb8cf3a05a0dd4ad4843af43555e7aace54d1bcf54ffcdc65f78af441def9bb266263e3cc966a9b SHA512 e006e5471f081361019fad65604628134c7e570f0583966bb4778dbc7f8b890b14f241eedb2f2a18a1b32f0f08410075fd2cceea0c7023f9e3c6a12f7264d3ee
+DIST opera-developer_132.0.5903.0_amd64.deb 136510068 BLAKE2B 466c690d0765f8db71a2d3078b3093b345c3c9ca7f217a386b8b45e927ab260f664be55166ebc3ddd37d72298c4963b5490609fd2f0bf8a22ca6acda519ff461 SHA512 db0bb432198382efbd9d865e69b132d03992c493dcc1e5861dcfb17ca5c63ef52f136e7bcc181b6d5713356042ef9f8166aecd81416cbc86b2d46c461b644a55
+DIST opera-developer_133.0.5910.0_amd64.deb 136563316 BLAKE2B 5718f7335284b0946e328b4270d6af50c2290291017e90aac0d3e1d1de3895bfe15194ffa6b0d2c1fb8bd25f9181bd095aaccd0a02664445e38c5b2254f178b3 SHA512 23ce6c03f438f6f2b9bc7c8003f7b03a60bfe619fbe8567f236ffa644be986f7bdbc735cb22d0169447c7bea90bd08e99c48489877b57a96e77abb7a3101c6dc
diff --git a/www-client/opera-developer/metadata.xml b/www-client/opera-developer/metadata.xml
index 5615e1c6c948..47a090e25d52 100644
--- a/www-client/opera-developer/metadata.xml
+++ b/www-client/opera-developer/metadata.xml
@@ -12,5 +12,5 @@
<flag name="ffmpeg-chromium">Use Chromium FFmpeg fork (<pkg>media-video/ffmpeg-chromium</pkg>) rather than mainline FFmpeg (<pkg>media-video/ffmpeg</pkg>)</flag>
<flag name="proprietary-codecs">Enable codecs for patent-encumbered audio and video formats.</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/opera-developer/opera-developer-132.0.5883.0.ebuild b/www-client/opera-developer/opera-developer-132.0.5903.0.ebuild
index ad5493188f5b..ad5493188f5b 100644
--- a/www-client/opera-developer/opera-developer-132.0.5883.0.ebuild
+++ b/www-client/opera-developer/opera-developer-132.0.5903.0.ebuild
diff --git a/www-client/opera-developer/opera-developer-132.0.5889.0.ebuild b/www-client/opera-developer/opera-developer-133.0.5910.0.ebuild
index ad5493188f5b..4a429d706e60 100644
--- a/www-client/opera-developer/opera-developer-132.0.5889.0.ebuild
+++ b/www-client/opera-developer/opera-developer-133.0.5910.0.ebuild
@@ -31,7 +31,7 @@ fi
# Commit ref from `strings libffmpeg.so | grep -F "FFmpeg version"` matches this Chromium version
# or use Chromicler to handle bumps.
# Does not _need_ to be updated for every new version of Opera, only when it breaks.
-CHROMIUM_VERSION="147"
+CHROMIUM_VERSION="148"
SRC_URI="${SRC_URI_BASE[*]/%//${PV}/linux/${MY_PN}_${PV}_amd64.deb}"
S=${WORKDIR}
diff --git a/www-client/opera-gx-bin/metadata.xml b/www-client/opera-gx-bin/metadata.xml
index 8cc21a0c8773..57143f6da4f6 100644
--- a/www-client/opera-gx-bin/metadata.xml
+++ b/www-client/opera-gx-bin/metadata.xml
@@ -6,5 +6,5 @@
<name>Andrey Lir</name>
</maintainer>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/opera-gx/metadata.xml b/www-client/opera-gx/metadata.xml
index 7d50c21d5798..aafbc5f40667 100644
--- a/www-client/opera-gx/metadata.xml
+++ b/www-client/opera-gx/metadata.xml
@@ -10,5 +10,5 @@
<flag name="ffmpeg-chromium">Use Chromium FFmpeg fork (<pkg>media-video/ffmpeg-chromium</pkg>) rather than mainline FFmpeg (<pkg>media-video/ffmpeg</pkg>)</flag>
<flag name="proprietary-codecs">Enable codecs for patent-encumbered audio and video formats.</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/opera/Manifest b/www-client/opera/Manifest
index 21e14e68681f..73e5e1ed0926 100644
--- a/www-client/opera/Manifest
+++ b/www-client/opera/Manifest
@@ -1 +1 @@
-DIST opera-stable_131.0.5877.55_amd64.deb 135039248 BLAKE2B 77129999c4e06ca0f239ddd54f0b408a6758ca30f9f5f220b47e27166906d854a2f5f1ccae0818ee6898089ba7c5bbf9218db366dbbed355549da30326370c75 SHA512 5c5efd7fc85aa3838c9bbf936691da76d69211c1c67bc86993a35ecd03165dd33f109e11084a3f2dd4da2ef87d2482ccedf5de1cc16689c1b2c99e5801d318c8
+DIST opera-stable_132.0.5905.11_amd64.deb 136535512 BLAKE2B 2252e0bad0cfff62ac405bcb99db4313be4e6468fabeed954eebcc7877d68635fa12bd4d23840a4973f383f89797e9e4a319cc5750afab353502a7d8e841f1e5 SHA512 d501cef7218891c613b9e16c7741ab878aad24dec15cf5820714efd547fc82ab389f05dae115ec778711338484eda2a4c4fdc1fa71ad4424d68bb1268fe72b61
diff --git a/www-client/opera/metadata.xml b/www-client/opera/metadata.xml
index 5615e1c6c948..47a090e25d52 100644
--- a/www-client/opera/metadata.xml
+++ b/www-client/opera/metadata.xml
@@ -12,5 +12,5 @@
<flag name="ffmpeg-chromium">Use Chromium FFmpeg fork (<pkg>media-video/ffmpeg-chromium</pkg>) rather than mainline FFmpeg (<pkg>media-video/ffmpeg</pkg>)</flag>
<flag name="proprietary-codecs">Enable codecs for patent-encumbered audio and video formats.</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/opera/opera-131.0.5877.55.ebuild b/www-client/opera/opera-132.0.5905.11.ebuild
index ad5493188f5b..4a429d706e60 100644
--- a/www-client/opera/opera-131.0.5877.55.ebuild
+++ b/www-client/opera/opera-132.0.5905.11.ebuild
@@ -31,7 +31,7 @@ fi
# Commit ref from `strings libffmpeg.so | grep -F "FFmpeg version"` matches this Chromium version
# or use Chromicler to handle bumps.
# Does not _need_ to be updated for every new version of Opera, only when it breaks.
-CHROMIUM_VERSION="147"
+CHROMIUM_VERSION="148"
SRC_URI="${SRC_URI_BASE[*]/%//${PV}/linux/${MY_PN}_${PV}_amd64.deb}"
S=${WORKDIR}
diff --git a/www-client/pybugz/metadata.xml b/www-client/pybugz/metadata.xml
index d83011ec2994..e28a4090777a 100644
--- a/www-client/pybugz/metadata.xml
+++ b/www-client/pybugz/metadata.xml
@@ -5,6 +5,6 @@
<email>williamh@gentoo.org</email>
</maintainer>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
<stabilize-allarches/>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/pybugz/pybugz-0.14.ebuild b/www-client/pybugz/pybugz-0.14.ebuild
index 48e389cea118..7aa953ccba39 100644
--- a/www-client/pybugz/pybugz-0.14.ebuild
+++ b/www-client/pybugz/pybugz-0.14.ebuild
@@ -4,7 +4,7 @@
EAPI=8
DISTUTILS_USE_PEP517=flit
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
PYTHON_REQ_USE="ssl(+)"
if [[ ${PV} = "9999" ]]; then
diff --git a/www-client/pybugz/pybugz-9999.ebuild b/www-client/pybugz/pybugz-9999.ebuild
index 4b902381abc7..dc1cea9d6acf 100644
--- a/www-client/pybugz/pybugz-9999.ebuild
+++ b/www-client/pybugz/pybugz-9999.ebuild
@@ -4,7 +4,7 @@
EAPI=8
DISTUTILS_USE_PEP517=flit
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
PYTHON_REQ_USE="readline(+),ssl(+)"
if [[ ${PV} = "9999" ]]; then
diff --git a/www-client/qutebrowser/metadata.xml b/www-client/qutebrowser/metadata.xml
index c1f21e2e78d8..52faaae06fdd 100644
--- a/www-client/qutebrowser/metadata.xml
+++ b/www-client/qutebrowser/metadata.xml
@@ -18,6 +18,6 @@
<flag name="widevine">Unsupported closed-source DRM capability
(required by Netflix VOD)</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
<stabilize-allarches/>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/qutebrowser/qutebrowser-3.6.3.ebuild b/www-client/qutebrowser/qutebrowser-3.6.3.ebuild
index 03badb1dfecd..2adba0538ee9 100644
--- a/www-client/qutebrowser/qutebrowser-3.6.3.ebuild
+++ b/www-client/qutebrowser/qutebrowser-3.6.3.ebuild
@@ -5,7 +5,7 @@ EAPI=8
DISTUTILS_SINGLE_IMPL=1
DISTUTILS_USE_PEP517=setuptools
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
inherit distutils-r1 xdg
if [[ ${PV} == 9999 ]]; then
diff --git a/www-client/qutebrowser/qutebrowser-3.7.0.ebuild b/www-client/qutebrowser/qutebrowser-3.7.0.ebuild
index 24665e2b7e56..705cc5356c7b 100644
--- a/www-client/qutebrowser/qutebrowser-3.7.0.ebuild
+++ b/www-client/qutebrowser/qutebrowser-3.7.0.ebuild
@@ -5,7 +5,7 @@ EAPI=8
DISTUTILS_SINGLE_IMPL=1
DISTUTILS_USE_PEP517=setuptools
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
inherit distutils-r1 xdg
if [[ ${PV} == 9999 ]]; then
diff --git a/www-client/qutebrowser/qutebrowser-9999.ebuild b/www-client/qutebrowser/qutebrowser-9999.ebuild
index 0ae0d13f629d..ed2f3df45884 100644
--- a/www-client/qutebrowser/qutebrowser-9999.ebuild
+++ b/www-client/qutebrowser/qutebrowser-9999.ebuild
@@ -5,7 +5,7 @@ EAPI=8
DISTUTILS_SINGLE_IMPL=1
DISTUTILS_USE_PEP517=setuptools
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..14} )
inherit distutils-r1 xdg
if [[ ${PV} == 9999 ]]; then
diff --git a/www-client/seamonkey/metadata.xml b/www-client/seamonkey/metadata.xml
index d480a9c584f0..c0ffac37a225 100644
--- a/www-client/seamonkey/metadata.xml
+++ b/www-client/seamonkey/metadata.xml
@@ -27,5 +27,5 @@
<flag name="system-sqlite">Use the system-wide <pkg>dev-db/sqlite</pkg> installation with secure-delete enabled</flag>
<flag name="webrtc">Enable WebRTC support. Disabled by default due to privacy concerns.</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/seamonkey/seamonkey-2.53.23.ebuild b/www-client/seamonkey/seamonkey-2.53.23.ebuild
index 80e6c3382730..e560de760dfc 100644
--- a/www-client/seamonkey/seamonkey-2.53.23.ebuild
+++ b/www-client/seamonkey/seamonkey-2.53.23.ebuild
@@ -5,7 +5,7 @@ EAPI=8
WANT_AUTOCONF="2.1"
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{12..14} )
PYTHON_REQ_USE='ncurses,sqlite,ssl,threads(+)'
LLVM_COMPAT=( {18..21} )
diff --git a/www-client/surf/metadata.xml b/www-client/surf/metadata.xml
index fd0e9936fa0a..68f0ce5889a3 100644
--- a/www-client/surf/metadata.xml
+++ b/www-client/surf/metadata.xml
@@ -10,5 +10,5 @@
<flag name="savedconfig">Without a saved config.h, this package depends on <pkg>net-misc/curl</pkg> and <pkg>x11-terms/st</pkg> for a default download mechanism</flag>
<flag name="tabbed">Install surf-open.sh script for running surf in <pkg>x11-misc/tabbed</pkg></flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/surfraw/metadata.xml b/www-client/surfraw/metadata.xml
index 6cc9186b7193..36625e255d7e 100644
--- a/www-client/surfraw/metadata.xml
+++ b/www-client/surfraw/metadata.xml
@@ -19,5 +19,5 @@
with fear and wonder.
</longdescription>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/tangram/metadata.xml b/www-client/tangram/metadata.xml
index 2920168b21ba..64ffcfcd6951 100644
--- a/www-client/tangram/metadata.xml
+++ b/www-client/tangram/metadata.xml
@@ -13,5 +13,5 @@
<upstream>
<bugs-to>https://github.com/sonnyp/Tangram/issues</bugs-to>
</upstream>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/torbrowser-launcher/metadata.xml b/www-client/torbrowser-launcher/metadata.xml
index 17c2195130b8..277554a48e8e 100644
--- a/www-client/torbrowser-launcher/metadata.xml
+++ b/www-client/torbrowser-launcher/metadata.xml
@@ -8,5 +8,5 @@
<upstream>
<bugs-to>https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/issues</bugs-to>
</upstream>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/torbrowser-launcher/torbrowser-launcher-0.3.9.ebuild b/www-client/torbrowser-launcher/torbrowser-launcher-0.3.9.ebuild
index 1f0f6a2db833..996fb58766d6 100644
--- a/www-client/torbrowser-launcher/torbrowser-launcher-0.3.9.ebuild
+++ b/www-client/torbrowser-launcher/torbrowser-launcher-0.3.9.ebuild
@@ -4,7 +4,7 @@
EAPI=8
DISTUTILS_USE_PEP517=setuptools
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{12..13} )
inherit distutils-r1 xdg
diff --git a/www-client/uget/metadata.xml b/www-client/uget/metadata.xml
index 9cd5c8b95e09..294414a3eb1e 100644
--- a/www-client/uget/metadata.xml
+++ b/www-client/uget/metadata.xml
@@ -15,5 +15,5 @@
<flag name="openssl">Use <pkg>dev-libs/openssl</pkg> instead of <pkg>dev-libs/libgcrypt</pkg></flag>
<flag name="rss">Enable uGet feed messages</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/ungoogled-chromium-bin/Manifest b/www-client/ungoogled-chromium-bin/Manifest
index 638b4a3bc80b..61b49cd1050c 100644
--- a/www-client/ungoogled-chromium-bin/Manifest
+++ b/www-client/ungoogled-chromium-bin/Manifest
@@ -1,3 +1,4 @@
DIST ungoogled-chromium-bin-145.0.7632.159-i686.tar.bz2 132212937 BLAKE2B 75b523ce9e58102f5e11c0cd5d04c88c0f941116c1a641bb7b060c2a1e03a61a0fae312e8b761b2de0e0f431195f182d18d4893c968871515ed0af110c089b87 SHA512 5340b1195073e6e0d4bcd7eb7bf49ab0c22a8d8e7f3ebad150a66c487428d8a98509d5900d717a4d71e28ad9ee8c58180275cfaa837e57df7dac3c2b7aecea31
DIST ungoogled-chromium-bin-145.0.7632.159-x86-64.tar.bz2 139562845 BLAKE2B 273508b07bda87c131aafb8232c09c16893cd6f2cb24efe8e06a6c96e4bb57ac1952c0b2d771206c81c758834c536509969b4ecdae3e31fa970330e5b382cee6 SHA512 1d90d8098d5bd0a3d67962e4ac6f9bde348779cc1eccf3a38f693c047e9a92a8d24350d289252847a078b3d7dc24cbb9a0eef3c5c9d4851039537f598896786d
-DIST ungoogled-chromium-bin-148.0.7778.96-x86-64.tar.bz2 146871092 BLAKE2B 034f493f3fbd7cdbf752d62166b9097a6a7a97bbdcac02b7025b53e94eb1b0a40d2be1718406fbd8c8159032b6f8204c7ca706948a530cf07851e84ed0c800b7 SHA512 b625ffd9d7b598216a78daefffc4d2d0ab3cd084f8bd09a86165076fae5cbac60c456a9a0a986e973a7a591fb893357574b62af257dfc6bb57a7e45863d8fc0f
+DIST ungoogled-chromium-bin-148.0.7778.178-x86-64.tar.bz2 146577955 BLAKE2B 668bbed7c7138f6f1ffa5b0f2d134191997909f87b0e76bef41d2105273ce02a4ed6006dc26a3f5ebd0ce16c33062a8b2983414f3095434dc06a197c90b15e39 SHA512 9678db64f7400e46569ad21bbe75fa1de1f96230009ad6fba7e50df465c01ebbebc5f2572d4497c504a9af2a18410f09e90a7a08e502802d905013b97e4021f9
+DIST ungoogled-chromium-bin-148.0.7778.215-x86-64.tar.bz2 146514208 BLAKE2B ac7461648427198b7db7ebe1afde9f09556709ba5e999b2fe7e00a66fcf224d26b1b3e510c09155421848e7f812e8c8e89143910ea006a2d5336d30a380eccdc SHA512 90fb28e15f3042e2a9d46e3edb188226043874953b32011501fdd887cb32b19b6c8687af296fa62c981f68c5e375cda572d4ba9ec042c518768e304fd6cb8f02
diff --git a/www-client/ungoogled-chromium-bin/metadata.xml b/www-client/ungoogled-chromium-bin/metadata.xml
index 1b303b2d90b1..5fe9aaa65173 100644
--- a/www-client/ungoogled-chromium-bin/metadata.xml
+++ b/www-client/ungoogled-chromium-bin/metadata.xml
@@ -22,5 +22,5 @@
<flag name="convert-dict">Install also the convert_dict utility. The script will be installed into /opt/chromium-browser/update-dicts.sh More info here: https://github.com/ungoogled-software/ungoogled-chromium/issues/188#issuecomment-444752907</flag>
<flag name="widevine">Unsupported closed-source DRM capability (required by Netflix VOD)</flag>
</use>
- <origin>pf4public-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.96.ebuild b/www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.178.ebuild
index 463b7bd112cd..463b7bd112cd 100644
--- a/www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.96.ebuild
+++ b/www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.178.ebuild
diff --git a/www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.215.ebuild b/www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.215.ebuild
new file mode 100644
index 000000000000..463b7bd112cd
--- /dev/null
+++ b/www-client/ungoogled-chromium-bin/ungoogled-chromium-bin-148.0.7778.215.ebuild
@@ -0,0 +1,218 @@
+# Copyright 2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+CHROMIUM_LANGS="af am ar as az be bg bn bs ca cs cy da de el en-GB es es-419 et eu fa fi fil
+ fr fr-CA gl gu he hi hr hu hy id is it ja ka kk km kn ko ky lo lt lv mk ml mn mr ms my
+ nb ne nl or pa pl pt-BR pt-PT ro ru si sk sl sq sr sr-Latn sv sw ta te th tr uk ur uz
+ vi zh-CN zh-HK zh-TW zu"
+
+inherit chromium-2 desktop readme.gentoo-r1 xdg-utils
+
+DESCRIPTION="Modifications to Chromium for removing Google integration and enhancing privacy"
+HOMEPAGE="https://www.chromium.org/Home https://github.com/ungoogled-software/ungoogled-chromium"
+DL_URL="https://github.com/PF4Public/${PN}/releases/download/${PV}"
+SRC_URI="
+ amd64? ( ${DL_URL}/x86-64.tar.bz2 -> ${PF}-x86-64.tar.bz2 )"
+ # x86? ( ${DL_URL}/i686.tar.bz2 -> ${PF}-i686.tar.bz2 )"
+
+RESTRICT="mirror"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="amd64"
+IUSE="convert-dict widevine"
+
+REQUIRED_USE="
+ x86? ( !widevine )"
+
+CDEPEND="
+ x11-libs/libX11
+ x11-libs/libXcomposite
+ x11-libs/libXcursor
+ x11-libs/libXdamage
+ x11-libs/libXext
+ x11-libs/libXfixes
+ >=x11-libs/libXi-1.6.0
+ x11-libs/libXrandr
+ x11-libs/libXrender
+ x11-libs/libXtst
+ x11-libs/libxcb
+ media-libs/libva
+ >=net-print/cups-1.3.11
+ dev-libs/expat
+ dev-libs/glib:2
+ dev-libs/libxml2:2/16
+ dev-libs/nspr
+ >=dev-libs/nss-3.26
+ >=media-libs/alsa-lib-1.0.19
+ media-libs/fontconfig
+ media-libs/freetype
+ media-libs/libjpeg-turbo
+ media-libs/libpng
+ sys-apps/dbus
+ sys-apps/pciutils
+ virtual/udev
+ x11-libs/cairo
+ x11-libs/pango
+ media-libs/flac
+ >=media-libs/libwebp-0.4.0
+ sys-libs/zlib[minizip]
+ >=media-libs/libavif-1.2.0
+ app-accessibility/at-spi2-core
+ x11-libs/gtk+:3[X]
+ media-libs/lcms
+ dev-libs/libxslt"
+
+RDEPEND="${CDEPEND}
+ >=www-client/chromium-common-2
+ x11-misc/xdg-utils
+ virtual/opengl
+ virtual/ttf-fonts"
+
+DISABLE_AUTOFORMATTING="yes"
+DOC_CONTENTS="
+Some web pages may require additional fonts to display properly.
+Try installing some of the following packages if some characters
+are not displayed properly:
+- media-fonts/arphicfonts
+- media-fonts/droid
+- media-fonts/ipamonafont
+- media-fonts/noto
+- media-fonts/noto-emoji
+- media-fonts/ja-ipafonts
+- media-fonts/takao-fonts
+- media-fonts/wqy-microhei
+- media-fonts/wqy-zenhei
+
+To fix broken icons on the Downloads page, you should install an icon
+theme that covers the appropriate MIME types, and configure this as your
+GTK+ icon theme.
+
+For native file dialogs in KDE, install kde-apps/kdialog."
+
+QA_PREBUILT="*"
+S="${WORKDIR}"
+
+pkg_pretend() {
+ if ! use widevine; then
+ ewarn
+ ewarn "widevine was enabled in this build"
+ ewarn "If you think this is a mistake let me know in #193"
+ ewarn
+ fi
+ ewarn
+ ewarn "Fontations Rust font stack is disabled"
+ ewarn "Using media-libs/libavif instead of CrabbyAvif"
+ ewarn
+}
+
+src_install() {
+ local CHROMIUM_HOME="/opt/chromium-browser"
+ exeinto "${CHROMIUM_HOME}"
+ doexe ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/chrome
+ #* https://github.com/ungoogled-software/ungoogled-chromium/pull/3563
+ doexe ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/chrome_crashpad_handler
+
+ if use convert-dict; then
+ newexe "./usr/$(get_libdir)/ungoogled-chromium-browser-beta/update-dicts.sh" update-dicts.sh
+ doexe ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/convert_dict
+ fi
+
+ # The launcher script must export the correct desktop file name
+ # as env var CHROME_DESKTOP so XDG can associate it with the app
+ local DESKTOP_FILE_NAME="chromium-browser-bin-${PN}.desktop"
+ local LAUNCHER_FILE_NAME="./usr/$(get_libdir)/ungoogled-chromium-browser-beta/chromium-launcher.sh"
+ sed -E "s/(^export CHROME_DESKTOP=)\".*\"/\\1\"${DESKTOP_FILE_NAME}\"/" -i "${LAUNCHER_FILE_NAME}" || die
+ doexe "${LAUNCHER_FILE_NAME}"
+
+ # It is important that we name the target "chromium-browser",
+ # xdg-utils expect it; bug #355517.
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-browser-bin
+ # keep the old symlink around for consistency
+ dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-bin
+
+ #TODO where is default?
+ # if ! has_version "www-client/ungoogled-chromium" && ! has_version "www-client/chromium"; then
+ # # Allow users to override command-line options, bug #357629.
+ # insinto /etc/chromium
+ # doins ./etc/chromium/default
+ # fi
+
+ pushd ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/locales > /dev/null || die
+ chromium_remove_language_paks
+ popd
+
+ insinto "${CHROMIUM_HOME}"
+ doins ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/*.bin
+ doins ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/*.pak
+ doins ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/*.so
+ doins ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/icudtl.dat
+
+ doins -r ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/locales
+
+ # Install vk_swiftshader_icd.json; bug #827861
+ doins ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/vk_swiftshader_icd.json
+
+ if [[ -d out/Release/swiftshader ]]; then
+ insinto "${CHROMIUM_HOME}/swiftshader"
+ doins ./usr/$(get_libdir)/ungoogled-chromium-browser-beta/swiftshader/*.so
+ fi
+
+ use widevine && dosym "../../usr/$(get_libdir)/ungoogled-chromium-browser-beta/WidevineCdm" "${CHROMIUM_HOME}/WidevineCdm"
+
+ # Install icons
+ local branding size
+ for size in 16 24 32 48 64 128 256 ; do
+ newicon -s ${size} "./usr/share/icons/hicolor/${size}x${size}/apps/ungoogled-chromium-browser-beta.png" \
+ chromium-browser-bin.png
+ done
+
+ local desktop_entry_name="Chromium"
+ if has_version "www-client/ungoogled-chromium" || has_version "www-client/chromium"; then
+ # Differentiate if others installed
+ desktop_entry_name="Ungoogled"
+ fi
+
+ local mime_types="text/html;text/xml;application/xhtml+xml;"
+ mime_types+="x-scheme-handler/http;x-scheme-handler/https;" # bug #360797
+ mime_types+="x-scheme-handler/ftp;" # bug #412185
+ mime_types+="x-scheme-handler/mailto;x-scheme-handler/webcal;" # bug #416393
+ make_desktop_entry \
+ chromium-browser-bin \
+ "${desktop_entry_name}" \
+ chromium-browser-bin \
+ "Network;WebBrowser" \
+ "MimeType=${mime_types}\nStartupWMClass=chromium-browser-bin"
+ sed -e "/^Exec/s/$/ %U/" -i "${ED}"/usr/share/applications/*.desktop || die
+
+ # Install GNOME default application entry (bug #303100).
+ insinto /usr/share/gnome-control-center/default-apps
+ sed -i '/chromium-browser/{s++chromium-browser-bin+;h};${x;/./{x;q0};x;q1}' \
+ ./usr/share/gnome-control-center/default-apps/ungoogled-chromium-browser-beta.xml || die
+ newins ./usr/share/gnome-control-center/default-apps/ungoogled-chromium-browser-beta.xml chromium-browser-bin.xml
+
+ readme.gentoo_create_doc
+}
+
+pkg_postrm() {
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+}
+
+pkg_postinst() {
+ elog "VA-API is disabled by default at runtime. You have to enable it"
+ elog "by adding --enable-features=VaapiVideoDecoder and "
+ elog "--disable-features=UseChromeOSDirectVideoDecoder to CHROMIUM_FLAGS"
+ elog "in /etc/chromium/default."
+
+ if use widevine; then
+ elog "widevine requires binary plugins, which are distributed separately"
+ elog "Make sure you have www-plugins/chrome-binary-plugins installed"
+ fi
+
+ xdg_icon_cache_update
+ xdg_desktop_database_update
+ readme.gentoo_print_elog
+}
diff --git a/www-client/ungoogled-chromium/Manifest b/www-client/ungoogled-chromium/Manifest
index b3dc475864ab..9fced4951920 100644
--- a/www-client/ungoogled-chromium/Manifest
+++ b/www-client/ungoogled-chromium/Manifest
@@ -1,17 +1,12 @@
-DIST chromium-147.0.7727.55-lite.tar.xz 1475176500 BLAKE2B 023e78d819beb213e937d7349a9cd7a874868b4b0e227c9183ddf5d0fa8bdcf57f798751d0836ceb5942dfaa919ed8cc75654c07863d4a4c40dd75410270e44e SHA512 6518277ddc2ce30e10b7c256f996364383a0b3ac5d243c4e15f7e17e08815797e062a46a1208922eeb8bffc0a07dcf526a75c2f71bb748e642b8d4e251523ada
-DIST chromium-148.0.7778.167-linux.tar.xz 1592280992 BLAKE2B 19734b03687d7c1c4ecab855f989fdd120e0ded609789adce15e5dc7150608c0c009aa60b7b160cc62f1764bf9b28b5e7f878bde3e9c5580a89b5d88f114c505 SHA512 26c086f5f0693d86e8b14d4d9b14ac8a665118030f82530233ac2a64bcb4e43e61494f36d8aa4de1210d9b43db53aaea9a0ca8e4826e6ee66e665632ee5b5c1c
-DIST chromium-148.0.7778.96-linux.tar.xz 1592992076 BLAKE2B 058469c0365ea1af141eaf012e6b20eaa7acb77ac238c617d9c7cde444ff4bdb9d71945403c2c214b776d338cf32a5946863022128571f50d392b8fe0e867245 SHA512 89efe10636faee025e3829571ca66c9e59f8f4a6bac299db7411e9a89c41cc23f8fcc67484d48b17e76f281e43b8090cc34550d8e2a37b4e9287e0e1b23ba799
-DIST chromium-acb47d9a6b56c4889a2ed4216e9968cfc740086c.patch 4513 BLAKE2B b13d82248b935a9d99944de46772240ead38cb37532c1aa44eb4be11e45170e4785076caa9acbdd2658e01896127c3caa6e1862e116d4ff28ac2c9cdcf8f2757 SHA512 227861a7276804926c89a7b81200808c03ad6544e904062f40403f0521554d89f5fa9152305e1ebd4e0e6df3b1cdfb0001fccd73e49ff26f96d5d97f150d73f2
+DIST chromium-148.0.7778.178-linux.tar.xz 1592152904 BLAKE2B 8d25be51cab30f196044a8e8da1e65afd025261bd316d0d8f9b8047fe2c0ac72ad8431bc9ca2d637488665a7a44565f6718073a2823fafa20ae1698a44045b84 SHA512 82ff2b4bf9a573cec83ec2e12edd2f1b576dd42ac38c0ac226e751c058c5b5c6afadafffb7d5dac00ac599317d22be8309d68cef2d9a976142ed8a0f1fc7ff2a
+DIST chromium-148.0.7778.215-linux.tar.xz 1593166200 BLAKE2B da7ba3258bd15cdd02ce8c30571e8dcca25d9093e7daefc64ef662b445384b93c6acd548f12561cad9f0fc06b249fdda9e9cfab887cd708d63cef97e6436a961 SHA512 09f381d2b69c5a377ab421727e084857680210754051e922a9d96ba486323f877130f4ae289c408ca0af15f3ba1d4cbcdb02877016c085c81ad35254787e9fbd
DIST chromium-clang-llvmorg-23-init-5669-g8a0be0bc-4.tar.xz 68803796 BLAKE2B 334d273c85a8e22dd7f6eec0f0591d54c5acdf85d01925511d0e912c611f5f07c448b3ff35925b4329307a601439dbabf54f5ee186f3b11d1229dc531e2a26af SHA512 570f00c716dd9d6f8ecc1d6364f735884e0485fba5d003bb45e8095cc60215107d11272702c387ce7273400a8c1679180ac5b51ec639e81fc73657aa55043903
-DIST chromium-fcfb1a42813f1e9d8babedc7bb2e0f06101a3151.patch 1044 BLAKE2B f927eb0a3e61b828bdb285cc18e0fdf1defe27d48684580ef375e9cbb8f7c80eca6053bfab5cfd8dea28ead06c1f54834240a0dfafe25401bbb6c8b392df8e77 SHA512 d989bc5084e47b412bf8c93bb4b102472154246e50cd93b6d3c7c02ea4a6449d52a9301f8cf6131d83a8249bf054cddd6ca23ebd83f469f16acd10e808817af6
DIST chromium-openpower-a85b64f07b.tar.bz2 387899 BLAKE2B b01fda2d64ce73068d1536a10cc0896f07a4b714cdb25698b1df8b3252baa0c21c4209b307cf1cb554854f6d0bfe3cd35e06aaa8d02ac5d409a119335084c324 SHA512 05eee81677e8766808441c939bee68e2e6c58ec91f471d88a40181d2eda78614a0a6d27d92ff8f9dda564d12f3451bace4ff2727594748c5c238a3533038019b
DIST chromium-patches-148-3.tar.bz2 20088 BLAKE2B 063146caf3fae4c4522e00c0abcbbd32652e4f401a81a6cfece043c36189a4177507ef9f44fc733e470d654e079e51e1ee3cd31604f55fd7625567406a228345 SHA512 769ada4905ad216ee1d6595d15dd88a9e2af432f820fc277d9483a5cb19357b15b5e9a94078a54b5c002afc6a7e7b1739f8d7d41893ea6d15f32e3df23555009
DIST chromium-patches-copium-fe1caafa06.tar.gz 15572 BLAKE2B 4baa36a4536f9199caa89553fc10deac79ae7effa336fc4bd92fac59eb81a57749eead426e6f01ffecd9954b417eb34c29c899cc49a9d726fe65bf2e303712a0 SHA512 5310e48743a32f2f998b34138b1ed9667feed873ad16c18d3e495383f44a0d5df0f9634c7c4275cf1839002ae887ef58f6c3ec5fd9c5d46ad5114ffab439a664
DIST chromium-rust-toolchain-6f54d591c3-7-llvmorg-23-init-5669-g8a0be0bc.tar.xz 271641712 BLAKE2B 7436b7243fbdd2c46b6dd0d9e16a6727718bfdc1870df86395229f3f6420e6109d5e5b881b21c48e2e1434844e4d7a6080bf36c2877a60e0f61f3baa9b803389 SHA512 420122a3b4fd984a848d47aed7cd04c3fb9bbdc5e0413c94165a6dc091713ca5f2dfd78dc238357ce05ea547bdd8a36d116f106bd4d94a54e358f0e93c7a6028
DIST chromium-testfonts-a28b222b79.tar.gz 33233004 BLAKE2B 2329d6a6069a19058c6fd58b61ae2d66cff3b4971984a5d2449be708ead2ef169bd4401ba3b5e9d3aedeeb910b6bb8e7c81b6e338808df327b3102420d6ab2d0 SHA512 ca4f98300f2037a40e02f6c2ffa04427fdf08cdce8de34cc944a5ccb69d4279090d2b8476d5e77bd610db6542696eb3ed4d135c3462fc0375cbf9277bf2fa670
-DIST cromite-15d48b061426a1f4a8ae8596622f0599ca626056.tar.gz 175364722 BLAKE2B 6d5862760bf33c93bb1919b0dc55276a192ffe7953ba79130cbce15c7056ceeccbeb1f14aa0fe2276d455637310e261ea656777ab9219e216213d99d4790f601 SHA512 2535b35eef17433a739c637543c5bd94276b8ae5331c48435cdc17b77205bbb7446f03bb3e182710acfc543f022c910a8a0b3f640691482851cd35111f5ad560
-DIST cromite-2afc7b19a4f8a398f715287f6b4ac6a45bc69cd9.tar.gz 175327647 BLAKE2B 94a103dd12d9d5cae4027ec28b3b5e72578726199f6d38f313e0146dce6b78bfc93b5ff977466fca9879384e4d976282b118490ac2b14f173929c22e18e1040b SHA512 919b9fd0e0f27ccd69a5190b1565194434741be8718bfaef81b1eabb03768fac503ac965f7b6833694113ab65166069c2fc52a6c2e9c44e844a5f66d08dce0e2
+DIST cromite-cb3baf14f52eb4365d017f640f85310735c19b79.tar.gz 175351669 BLAKE2B f578d0783d2af02d62de152fea5364465aee457bc82c84cb9533d07683e475cdb0ede81999d526b1a3acd6fd78a9b06a18a4325c76c3c7a7fe0dfef08a42dbd8 SHA512 a6c97e36e5056a2fd0b8b2d708de637edf51f91a83561b124fe798d177edf37bdd7cf272f692a7b814d853da5ecf3bea63768d7e18078e4c1e04998f0aaa0ee3
DIST rollup-wasm-node-4.57.1.tgz 792515 BLAKE2B 52fa9c4b65f3e20149c66fdd44b3c2a8b47e836d87de85535dbbf8b7243acef3d65c5be9f794eebb1533af2f16888a1cb42a75ed392ba65251cf60b73b41d559 SHA512 6f4adc247f329046a77e04de0ed94fb9b86984850ec74a1a01e93ede18b34da164a02d450524ec6341a2c700780f91d9e6bdc6b76c88f5cf0cd7739c5bf916e4
-DIST ungoogled-chromium-147.0.7727.55-1.tar.gz 662796 BLAKE2B 3355bbe9da0cff2c35b9a0fbb7543d46ebb5ad4215e100bb2720dfa91f8f56fef916aec487ac81c0097ce1074691c38b89d86ecae69418779cefe3efb3576bc9 SHA512 fdd0d7eda14c5b8f3e6b920ab30b7f3f2580ee6610a0b0674d9cb5d7d97c21aac9884aebc6915c8a08d706f74f0eefdf041fa58eab5361223c1a73a884cf298c
-DIST ungoogled-chromium-148.0.7778.167-1.tar.gz 660622 BLAKE2B 9db400158657f97e3c8239cb064b08b2689f334c0adfd7a1b401442c39a6be7bf0bd79edf4680a0126318048cb02f19eb0c4dc10a453dac07932329d94ed3896 SHA512 e09015b5ebd148c5c5d096bb0444faabe00bc99e1ef701860fc5f58b1c17eb17ef3aa31735855898571f8c96a677a64229122b198293984b485a4aee30f95664
-DIST ungoogled-chromium-148.0.7778.96-1.tar.gz 660740 BLAKE2B 955f83d6e1472242fa775e1d2a26d2c726415d8c530da4afcd69e88c162993dc7516723405871d8f88363b4c0fcb5adbb7e9e8a69d0e829e66721c9288ed7087 SHA512 d012f1292b05845b03205ec2eb557e3c57aaa2d3e722da3fa8b83eba3429da4f88227462f8bc2bd5d61e9e3f53afb2b076e55071806e2fe048ac2fb6959546e9
+DIST ungoogled-chromium-148.0.7778.178-1.tar.gz 661720 BLAKE2B 24aa515095c25725f9abf38a7d9c8ea3a92eaf3f575dedd3c3c80a6f111a11f3dec585012a50c9e4c00e3129d910eb171526aea4a5d64d3b6f2a18cddcaa655f SHA512 ebd236bc2c8e686b29a9a2be47b8355f6e1b489858e4ba12ba8e7f09c2ec4df45bcea9405e4577e9ec52888dff33e3ee2458dfa8695002f9397d75f317f1f49c
+DIST ungoogled-chromium-148.0.7778.215-1.tar.gz 662274 BLAKE2B f7b5572128a48af4711512f9c1c43b1bcae3f6a41d3e5fda7916a50f276e878c92dfad1e2f457d55abf7665d6b2a09d1a08306c2e61d0ae456d78991c949949b SHA512 725bce1e30177918468f0d68f91cf4c254e22ba8497bcc01241547ac5826d5f30e22ca977692165402696afaa943a6755a7e85ad749d33963717e21a8e114dcb
diff --git a/www-client/ungoogled-chromium/files/avif_image_decoder.cc b/www-client/ungoogled-chromium/files/avif_image_decoder.cc
deleted file mode 100644
index 19c7cc90f4e2..000000000000
--- a/www-client/ungoogled-chromium/files/avif_image_decoder.cc
+++ /dev/null
@@ -1,1286 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include <algorithm>
-#include <array>
-#include <memory>
-#include <optional>
-#include <utility>
-
-#include "base/bits.h"
-#include "base/containers/adapters.h"
-#include "base/feature_list.h"
-#include "base/functional/bind.h"
-#include "base/logging.h"
-#include "base/memory/scoped_refptr.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/timer/elapsed_timer.h"
-#include "build/build_config.h"
-#include "cc/base/math_util.h"
-#include "media/base/video_color_space.h"
-#include "skia/ext/cicp.h"
-#include "third_party/blink/public/common/features.h"
-#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
-#include "third_party/blink/renderer/platform/image-decoders/fast_shared_buffer_reader.h"
-#include "third_party/blink/renderer/platform/image-decoders/image_animation.h"
-#include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
-#include "third_party/blink/renderer/platform/image-decoders/rw_buffer.h"
-#include <avif/avif.h>
-#include "third_party/libyuv/include/libyuv.h"
-#include "third_party/skia/include/core/SkColorSpace.h"
-#include "third_party/skia/include/core/SkTypes.h"
-#include "third_party/skia/include/private/SkXmp.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/icc_profile.h"
-
-#if defined(ARCH_CPU_BIG_ENDIAN)
-#error Blink assumes a little-endian target.
-#endif
-
-namespace blink {
-
-namespace {
-
-// The maximum AVIF file size we are willing to decode. This helps libavif
-// detect invalid sizes and offsets in an AVIF file before the file size is
-// known.
-constexpr uint64_t kMaxAvifFileSize = 0x10000000; // 256 MB
-
-const char* AvifDecoderErrorMessage(const avifDecoder* decoder) {
- // decoder->diag.error is a char array that stores a null-terminated C string.
- return *decoder->diag.error != '\0' ? decoder->diag.error
- : "(no error message)";
-}
-
-// Builds a gfx::ColorSpace from the ITU-T H.273 (CICP) color description.
-gfx::ColorSpace GetColorSpace(
- avifColorPrimaries color_primaries,
- avifTransferCharacteristics transfer_characteristics,
- avifMatrixCoefficients matrix_coefficients,
- avifRange yuv_range,
- bool grayscale) {
- // (As of ISO/IEC 23000-22:2019 Amendment 2) MIAF Section 7.3.6.4 says:
- // If a coded image has no associated colour property, the default property
- // is defined as having colour_type equal to 'nclx' with properties as
- // follows:
- // – colour_primaries equal to 1,
- // - transfer_characteristics equal to 13,
- // - matrix_coefficients equal to 5 or 6 (which are functionally identical),
- // and
- // - full_range_flag equal to 1.
- // ...
- // These values correspond to AVIF_COLOR_PRIMARIES_BT709,
- // AVIF_TRANSFER_CHARACTERISTICS_SRGB, and AVIF_MATRIX_COEFFICIENTS_BT601,
- // respectively.
- //
- // Note that this only specifies the default color property when the color
- // property is absent. It does not really specify the default values for
- // colour_primaries, transfer_characteristics, and matrix_coefficients when
- // they are equal to 2 (unspecified). But we will interpret it as specifying
- // the default values for these variables because we must choose some defaults
- // and these are the most reasonable defaults to choose. We also advocate that
- // all AVIF decoders choose these defaults:
- // https://github.com/AOMediaCodec/av1-avif/issues/84
- const auto primaries = color_primaries == AVIF_COLOR_PRIMARIES_UNSPECIFIED
- ? AVIF_COLOR_PRIMARIES_BT709
- : color_primaries;
- const auto transfer =
- transfer_characteristics == AVIF_TRANSFER_CHARACTERISTICS_UNSPECIFIED
- ? AVIF_TRANSFER_CHARACTERISTICS_SRGB
- : transfer_characteristics;
- const auto matrix =
- (grayscale || matrix_coefficients == AVIF_MATRIX_COEFFICIENTS_UNSPECIFIED)
- ? AVIF_MATRIX_COEFFICIENTS_BT601
- : matrix_coefficients;
- const auto range = yuv_range == AVIF_RANGE_FULL
- ? gfx::ColorSpace::RangeID::FULL
- : gfx::ColorSpace::RangeID::LIMITED;
- media::VideoColorSpace color_space(primaries, transfer, matrix, range);
- if (color_space.IsSpecified()) {
- return color_space.ToGfxColorSpace();
- }
- // media::VideoColorSpace and gfx::ColorSpace do not support CICP
- // MatrixCoefficients 12, 13, 14.
- DCHECK_GE(matrix, 12);
- DCHECK_LE(matrix, 14);
- if (yuv_range == AVIF_RANGE_FULL) {
- return gfx::ColorSpace::CreateJpeg();
- }
- return gfx::ColorSpace::CreateREC709();
-}
-
-// Builds a gfx::ColorSpace from the ITU-T H.273 (CICP) color description in the
-// image.
-gfx::ColorSpace GetColorSpace(const avifImage* image) {
- const bool grayscale = image->yuvFormat == AVIF_PIXEL_FORMAT_YUV400;
- return GetColorSpace(image->colorPrimaries, image->transferCharacteristics,
- image->matrixCoefficients, image->yuvRange, grayscale);
-}
-
-// |y_size| is the width or height of the Y plane. Returns the width or height
-// of the U and V planes. |chroma_shift| represents the subsampling of the
-// chroma (U and V) planes in the x (for width) or y (for height) direction.
-int UVSize(int y_size, int chroma_shift) {
- DCHECK(chroma_shift == 0 || chroma_shift == 1);
- return (y_size + chroma_shift) >> chroma_shift;
-}
-
-float FractionToFloat(auto numerator, uint32_t denominator) {
- // First cast to double and not float because uint32_t->float conversion can
- // cause precision loss.
- return static_cast<double>(numerator) / denominator;
-}
-
-// If the image has a gain map, returns the alternate image's color space, if
-// it's different from the base image's and can be converted to a SkColorSpace.
-// If the alternate image color space is the same as the base image, there is no
-// need to specify it in SkGainmapInfo, and using the base image's color space
-// may be more accurate if the profile cannot be exactly represented as a
-// SkColorSpace object.
-sk_sp<SkColorSpace> GetAltImageColorSpace(const avifImage& image) {
- const avifGainMap* gain_map = image.gainMap;
- if (!gain_map) {
- return nullptr;
- }
- sk_sp<SkColorSpace> color_space;
- if (gain_map->altICC.size) {
- if (image.icc.size == gain_map->altICC.size &&
- memcmp(gain_map->altICC.data, image.icc.data, gain_map->altICC.size) ==
- 0) {
- // Same ICC as the base image, no need to specify it.
- return nullptr;
- }
- std::unique_ptr<ColorProfile> profile = ColorProfile::Create(
- base::span(gain_map->altICC.data, gain_map->altICC.size));
- if (!profile) {
- DVLOG(1) << "Failed to parse gain map ICC profile";
- return nullptr;
- }
- const skcms_ICCProfile* icc_profile = profile->GetProfile();
- if (icc_profile->has_CICP) {
- color_space =
- skia::CICPGetSkColorSpace(icc_profile->CICP.color_primaries,
- icc_profile->CICP.transfer_characteristics,
- icc_profile->CICP.matrix_coefficients,
- icc_profile->CICP.video_full_range_flag,
- /*prefer_srgb_trfn=*/true);
- } else if (icc_profile->has_toXYZD50) {
- // The transfer function is irrelevant for gain map tone mapping,
- // set it to something standard in case it's not set or not
- // supported.
- skcms_ICCProfile with_srgb = *icc_profile;
- skcms_SetTransferFunction(&with_srgb, skcms_sRGB_TransferFunction());
- color_space = SkColorSpace::Make(with_srgb);
- }
- } else if (gain_map->altColorPrimaries != AVIF_COLOR_PRIMARIES_UNSPECIFIED) {
- if (image.icc.size == 0 &&
- image.colorPrimaries == gain_map->altColorPrimaries) {
- // Same as base image, no need to specify it.
- return nullptr;
- }
- const bool grayscale = (gain_map->altPlaneCount == 1);
- const gfx::ColorSpace alt_color_space = GetColorSpace(
- gain_map->altColorPrimaries, gain_map->altTransferCharacteristics,
- gain_map->altMatrixCoefficients, gain_map->altYUVRange, grayscale);
- color_space = alt_color_space.GetAsFullRangeRGB().ToSkColorSpace();
- }
-
- if (!color_space) {
- DVLOG(1) << "Gain map image contains an unsupported color space";
- }
-
- return color_space;
-}
-
-} // namespace
-
-AVIFImageDecoder::AVIFImageDecoder(AlphaOption alpha_option,
- HighBitDepthDecodingOption hbd_option,
- ColorBehavior color_behavior,
- cc::AuxImage aux_image,
- wtf_size_t max_decoded_bytes,
- AnimationOption animation_option)
- : ImageDecoder(alpha_option,
- hbd_option,
- color_behavior,
- aux_image,
- max_decoded_bytes),
- animation_option_(animation_option) {}
-
-AVIFImageDecoder::~AVIFImageDecoder() = default;
-
-String AVIFImageDecoder::FilenameExtension() const {
- return "avif";
-}
-
-const AtomicString& AVIFImageDecoder::MimeType() const {
- DEFINE_STATIC_LOCAL(const AtomicString, avif_mime_type, ("image/avif"));
- return avif_mime_type;
-}
-
-bool AVIFImageDecoder::ImageIsHighBitDepth() {
- return bit_depth_ > 8;
-}
-
-void AVIFImageDecoder::OnSetData(scoped_refptr<SegmentReader> data) {
- have_parsed_current_data_ = false;
- const bool all_data_received = IsAllDataReceived();
- avif_io_data_.reader = data_;
- avif_io_data_.all_data_received = all_data_received;
- avif_io_.sizeHint = all_data_received ? data_->size() : kMaxAvifFileSize;
-
- // ImageFrameGenerator::GetYUVAInfo() and ImageFrameGenerator::DecodeToYUV()
- // assume that allow_decode_to_yuv_ and other image metadata are available
- // after calling ImageDecoder::Create() with data_complete=true.
- if (all_data_received) {
- ParseMetadata();
- }
-}
-
-cc::YUVSubsampling AVIFImageDecoder::GetYUVSubsampling() const {
- switch (avif_yuv_format_) {
- case AVIF_PIXEL_FORMAT_YUV420:
- return cc::YUVSubsampling::k420;
- case AVIF_PIXEL_FORMAT_YUV422:
- return cc::YUVSubsampling::k422;
- case AVIF_PIXEL_FORMAT_YUV444:
- return cc::YUVSubsampling::k444;
- case AVIF_PIXEL_FORMAT_YUV400:
- return cc::YUVSubsampling::kUnknown;
- case AVIF_PIXEL_FORMAT_NONE:
- // avif_yuv_format_ is initialized to AVIF_PIXEL_FORMAT_NONE in the
- // constructor. If we have called SetSize() successfully at the end
- // of UpdateDemuxer(), avif_yuv_format_ cannot possibly be
- // AVIF_PIXEL_FORMAT_NONE.
- CHECK(!IsDecodedSizeAvailable());
- return cc::YUVSubsampling::kUnknown;
- default:
- break;
- }
- NOTREACHED() << "Invalid YUV format: " << avif_yuv_format_;
-}
-
-gfx::Size AVIFImageDecoder::DecodedYUVSize(cc::YUVIndex index) const {
- DCHECK(IsDecodedSizeAvailable());
- if (index == cc::YUVIndex::kU || index == cc::YUVIndex::kV) {
- return gfx::Size(UVSize(Size().width(), chroma_shift_x_),
- UVSize(Size().height(), chroma_shift_y_));
- }
- return Size();
-}
-
-wtf_size_t AVIFImageDecoder::DecodedYUVWidthBytes(cc::YUVIndex index) const {
- DCHECK(IsDecodedSizeAvailable());
- // Try to return the same width bytes as used by the dav1d library. This will
- // allow DecodeToYUV() to copy each plane with a single memcpy() call.
- //
- // The comments for Dav1dPicAllocator in dav1d/picture.h require the pixel
- // width be padded to a multiple of 128 pixels.
- wtf_size_t aligned_width = static_cast<wtf_size_t>(
- base::bits::AlignUpDeprecatedDoNotUse(Size().width(), 128));
- if (index == cc::YUVIndex::kU || index == cc::YUVIndex::kV) {
- aligned_width >>= chroma_shift_x_;
- }
- // When the stride is a multiple of 1024, dav1d_default_picture_alloc()
- // slightly pads the stride to avoid a reduction in cache hit rate in most
- // L1/L2 cache implementations. Match that trick here. (Note that this padding
- // is not documented in dav1d/picture.h.)
- if ((aligned_width & 1023) == 0) {
- aligned_width += 64;
- }
-
- // High bit depth YUV is stored as a uint16_t, double the number of bytes.
- if (bit_depth_ > 8) {
- DCHECK_LE(bit_depth_, 16);
- aligned_width *= 2;
- }
-
- return aligned_width;
-}
-
-SkYUVColorSpace AVIFImageDecoder::GetYUVColorSpace() const {
- DCHECK(CanDecodeToYUV());
- DCHECK_NE(yuv_color_space_, SkYUVColorSpace::kIdentity_SkYUVColorSpace);
- return yuv_color_space_;
-}
-
-uint8_t AVIFImageDecoder::GetYUVBitDepth() const {
- DCHECK(CanDecodeToYUV());
- return bit_depth_;
-}
-
-void AVIFImageDecoder::DecodeToYUV() {
- DCHECK(image_planes_);
- DCHECK(CanDecodeToYUV());
-
- if (Failed()) {
- return;
- }
-
- DCHECK(decoder_);
- DCHECK_EQ(decoded_frame_count_, 1u); // Not animation.
-
- // If the image is decoded progressively, just render the highest progressive
- // frame in image_planes_ because the callers of DecodeToYUV() assume that a
- // complete scan will not be updated.
- const int frame_index = progressive_ ? (decoder_->imageCount - 1) : 0;
- // TODO(crbug.com/943519): Implement YUV incremental decoding as in Decode().
- decoder_->allowIncremental = AVIF_FALSE;
-
- // libavif cannot decode to an external buffer. So we need to copy from
- // libavif's internal buffer to |image_planes_|.
- // TODO(crbug.com/1099825): Enhance libavif to decode to an external buffer.
- auto ret = DecodeImage(frame_index);
- if (ret != AVIF_RESULT_OK) {
- if (ret != AVIF_RESULT_WAITING_ON_IO) {
- SetFailed();
- }
- return;
- }
- const avifImage* image = decoded_image_;
-
- DCHECK(!image->alphaPlane);
- static_assert(cc::YUVIndex::kY == static_cast<cc::YUVIndex>(AVIF_CHAN_Y), "");
- static_assert(cc::YUVIndex::kU == static_cast<cc::YUVIndex>(AVIF_CHAN_U), "");
- static_assert(cc::YUVIndex::kV == static_cast<cc::YUVIndex>(AVIF_CHAN_V), "");
-
- // Disable subnormal floats which can occur when converting to half float.
- std::unique_ptr<cc::ScopedSubnormalFloatDisabler> disable_subnormals;
- const bool is_f16 = image_planes_->color_type() == kA16_float_SkColorType;
- if (is_f16) {
- disable_subnormals = std::make_unique<cc::ScopedSubnormalFloatDisabler>();
- }
- const float kHighBitDepthMultiplier =
- (is_f16 ? 1.0f : 65535.0f) / ((1 << bit_depth_) - 1);
-
- // Initialize |width| and |height| to the width and height of the luma plane.
- uint32_t width = image->width;
- uint32_t height = image->height;
-
- for (wtf_size_t plane_index = 0; plane_index < cc::kNumYUVPlanes;
- ++plane_index) {
- const cc::YUVIndex plane = static_cast<cc::YUVIndex>(plane_index);
- const wtf_size_t src_row_bytes =
- base::strict_cast<wtf_size_t>(image->yuvRowBytes[plane_index]);
- const wtf_size_t dst_row_bytes = image_planes_->RowBytes(plane);
-
- if (bit_depth_ == 8) {
- DCHECK_EQ(image_planes_->color_type(), kGray_8_SkColorType);
- const uint8_t* src = image->yuvPlanes[plane_index];
- uint8_t* dst = static_cast<uint8_t*>(image_planes_->Plane(plane));
- libyuv::CopyPlane(src, src_row_bytes, dst, dst_row_bytes, width, height);
- } else {
- DCHECK_GT(bit_depth_, 8u);
- DCHECK_LE(bit_depth_, 16u);
- const uint16_t* src =
- reinterpret_cast<uint16_t*>(image->yuvPlanes[plane_index]);
- uint16_t* dst = static_cast<uint16_t*>(image_planes_->Plane(plane));
- if (image_planes_->color_type() == kA16_unorm_SkColorType) {
- const wtf_size_t src_stride = src_row_bytes / 2;
- const wtf_size_t dst_stride = dst_row_bytes / 2;
- for (uint32_t j = 0; j < height; ++j) {
- for (uint32_t i = 0; i < width; ++i) {
- dst[j * dst_stride + i] =
- src[j * src_stride + i] * kHighBitDepthMultiplier + 0.5f;
- }
- }
- } else if (image_planes_->color_type() == kA16_float_SkColorType) {
- // Note: Unlike CopyPlane_16, HalfFloatPlane wants the stride in bytes.
- libyuv::HalfFloatPlane(src, src_row_bytes, dst, dst_row_bytes,
- kHighBitDepthMultiplier, width, height);
- } else {
- NOTREACHED() << "Unsupported color type: "
- << static_cast<int>(image_planes_->color_type());
- }
- }
- if (plane == cc::YUVIndex::kY) {
- // Having processed the luma plane, change |width| and |height| to the
- // width and height of the chroma planes.
- width = UVSize(width, chroma_shift_x_);
- height = UVSize(height, chroma_shift_y_);
- }
- }
- image_planes_->SetHasCompleteScan();
-}
-
-int AVIFImageDecoder::RepetitionCount() const {
- if (decoded_frame_count_ > 1) {
- switch (decoder_->repetitionCount) {
- case AVIF_REPETITION_COUNT_INFINITE:
- return kAnimationLoopInfinite;
- case AVIF_REPETITION_COUNT_UNKNOWN:
- // The AVIF file does not have repetitions specified using an EditList
- // box. Loop infinitely for backward compatibility with older versions
- // of Chrome.
- return kAnimationLoopInfinite;
- default:
- return decoder_->repetitionCount;
- }
- }
- return kAnimationNone;
-}
-
-bool AVIFImageDecoder::FrameIsReceivedAtIndex(wtf_size_t index) const {
- if (!IsDecodedSizeAvailable()) {
- return false;
- }
- if (decoded_frame_count_ == 1) {
- return ImageDecoder::FrameIsReceivedAtIndex(index);
- }
- if (index >= frame_buffer_cache_.size()) {
- return false;
- }
- if (IsAllDataReceived()) {
- return true;
- }
- avifExtent data_extent;
- if (avifDecoderNthImageMaxExtent(decoder_.get(), index, &data_extent) !=
- AVIF_RESULT_OK) {
- return false;
- }
- return data_extent.size == 0 ||
- data_extent.offset + data_extent.size <= data_->size();
-}
-
-std::optional<base::TimeDelta> AVIFImageDecoder::FrameTimestampAtIndex(
- wtf_size_t index) const {
- return index < frame_buffer_cache_.size()
- ? frame_buffer_cache_[index].Timestamp()
- : std::nullopt;
-}
-
-base::TimeDelta AVIFImageDecoder::FrameDurationAtIndex(wtf_size_t index) const {
- return index < frame_buffer_cache_.size()
- ? frame_buffer_cache_[index].Duration()
- : base::TimeDelta();
-}
-
-bool AVIFImageDecoder::ImageHasBothStillAndAnimatedSubImages() const {
- // Per MIAF, all animated AVIF files must have a still image, even if it's
- // just a pointer to the first frame of the animation.
- return decoder_ && decoder_->imageSequenceTrackPresent;
-}
-
-// static
-bool AVIFImageDecoder::MatchesAVIFSignature(
- const FastSharedBufferReader& fast_reader) {
- // avifPeekCompatibleFileType() clamps compatible brands at 32 when reading in
- // the ftyp box in ISO BMFF for the 'avif' or 'avis' brand. So the maximum
- // number of bytes read is 144 bytes (size 4 bytes, type 4 bytes, major brand
- // 4 bytes, minor version 4 bytes, and 4 bytes * 32 compatible brands).
- std::array<uint8_t, 144> buffer;
- avifROData input;
- input.size = std::min(buffer.size(), fast_reader.size());
- input.data = fast_reader.GetConsecutiveData(0, input.size, buffer).data();
- return avifPeekCompatibleFileType(&input);
-}
-
-gfx::ColorSpace AVIFImageDecoder::GetColorSpaceForTesting() const {
- const auto* image = GetDecoderImage();
- CHECK(image);
- return GetColorSpace(image);
-}
-
-void AVIFImageDecoder::ParseMetadata() {
- if (!UpdateDemuxer()) {
- SetFailed();
- }
-}
-
-void AVIFImageDecoder::DecodeSize() {
- ParseMetadata();
-}
-
-wtf_size_t AVIFImageDecoder::DecodeFrameCount() {
- if (!Failed()) {
- ParseMetadata();
- }
- return IsDecodedSizeAvailable() ? decoded_frame_count_
- : frame_buffer_cache_.size();
-}
-
-void AVIFImageDecoder::InitializeNewFrame(wtf_size_t index) {
- auto& buffer = frame_buffer_cache_[index];
- if (decode_to_half_float_) {
- buffer.SetPixelFormat(ImageFrame::PixelFormat::kRGBA_F16);
- }
-
- // For AVIFs, the frame always fills the entire image.
- buffer.SetOriginalFrameRect(gfx::Rect(Size()));
-
- avifImageTiming timing;
- auto ret = avifDecoderNthImageTiming(decoder_.get(), index, &timing);
- DCHECK_EQ(ret, AVIF_RESULT_OK);
- buffer.SetTimestamp(base::Seconds(timing.pts));
- buffer.SetDuration(base::Seconds(timing.duration));
-}
-
-void AVIFImageDecoder::Decode(wtf_size_t index) {
- if (Failed()) {
- return;
- }
-
- UpdateAggressivePurging(index);
-
- int frame_index = index;
- // If the image is decoded progressively, find the highest progressive
- // frame that we have received and decode from that frame index. Internally
- // decoder_ still decodes the lower progressive frames, but they are only used
- // as reference frames and not rendered.
- if (progressive_) {
- DCHECK_EQ(index, 0u);
- // decoder_->imageIndex is the current image index. decoder_->imageIndex is
- // initialized to -1. decoder_->imageIndex + 1 is the next image index.
- DCHECK_LT(decoder_->imageIndex + 1, decoder_->imageCount);
- for (frame_index = decoder_->imageIndex + 1;
- frame_index + 1 < decoder_->imageCount; ++frame_index) {
- avifExtent data_extent;
- auto rv = avifDecoderNthImageMaxExtent(decoder_.get(), frame_index + 1,
- &data_extent);
- if (rv != AVIF_RESULT_OK) {
- DVLOG(1) << "avifDecoderNthImageMaxExtent(" << frame_index + 1
- << ") failed: " << avifResultToString(rv) << ": "
- << AvifDecoderErrorMessage(decoder_.get());
- SetFailed();
- return;
- }
- if (data_extent.size != 0 &&
- data_extent.offset + data_extent.size > data_->size()) {
- break;
- }
- }
- }
-
- // Allow AVIF frames to be partially decoded before all data is received.
- // Only enabled for non-progressive still images because animations look
- // better without incremental decoding and because progressive decoding makes
- // incremental decoding unnecessary.
- decoder_->allowIncremental = (decoder_->imageCount == 1);
-
- auto ret = DecodeImage(frame_index);
- if (ret != AVIF_RESULT_OK && ret != AVIF_RESULT_WAITING_ON_IO) {
- SetFailed();
- return;
- }
- const avifImage* image = decoded_image_;
-
- // ImageDecoder::SizeCalculationMayOverflow(), called by UpdateDemuxer()
- // before being here, made sure the image height fits in an int.
- int displayable_height =
- static_cast<int>(avifDecoderDecodedRowCount(decoder_.get()));
- if (image == cropped_image_.get()) {
- displayable_height -= clap_origin_.y();
- displayable_height =
- std::clamp(displayable_height, 0, static_cast<int>(image->height));
- }
-
- if (displayable_height == 0) {
- return; // There is nothing to display.
- }
-
- ImageFrame& buffer = frame_buffer_cache_[index];
- DCHECK_NE(buffer.GetStatus(), ImageFrame::kFrameComplete);
-
- if (buffer.GetStatus() == ImageFrame::kFrameEmpty) {
- if (!InitFrameBuffer(index)) {
- DVLOG(1) << "Failed to create frame buffer...";
- SetFailed();
- return;
- }
- DCHECK_EQ(buffer.GetStatus(), ImageFrame::kFramePartial);
- // The buffer is transparent outside the decoded area while the image is
- // loading. The correct alpha value for the frame will be set when it is
- // fully decoded.
- buffer.SetHasAlpha(true);
- if (decoder_->allowIncremental) {
- // In case of buffer disposal after decoding.
- incrementally_displayed_height_ = 0;
- }
- }
-
- const int last_displayed_height =
- decoder_->allowIncremental ? incrementally_displayed_height_ : 0;
- if (displayable_height == last_displayed_height) {
- return; // There is no new row to display.
- }
- DCHECK_GT(displayable_height, last_displayed_height);
-
- // Only render the newly decoded rows.
- if (!RenderImage(image, last_displayed_height, &displayable_height,
- &buffer)) {
- SetFailed();
- return;
- }
- if (displayable_height == last_displayed_height) {
- return; // There is no new row to display.
- }
- DCHECK_GT(displayable_height, last_displayed_height);
- ColorCorrectImage(last_displayed_height, displayable_height, &buffer);
- buffer.SetPixelsChanged(true);
- if (decoder_->allowIncremental) {
- incrementally_displayed_height_ = displayable_height;
- }
-
- if (static_cast<uint32_t>(displayable_height) == image->height &&
- (!progressive_ || frame_index + 1 == decoder_->imageCount)) {
- buffer.SetHasAlpha(!!image->alphaPlane);
- buffer.SetStatus(ImageFrame::kFrameComplete);
- PostDecodeProcessing(index);
- }
-}
-
-bool AVIFImageDecoder::CanReusePreviousFrameBuffer(wtf_size_t index) const {
- // (a) Technically we can reuse the bitmap of the previous frame because the
- // AVIF decoder handles frame dependence internally and we never need to
- // preserve previous frames to decode later ones, and (b) since this function
- // will not currently be called, this is really more for the reader than any
- // functional purpose.
- return true;
-}
-
-// static
-avifResult AVIFImageDecoder::ReadFromSegmentReader(avifIO* io,
- uint32_t read_flags,
- uint64_t offset,
- size_t size,
- avifROData* out) {
- if (read_flags != 0) {
- // Unsupported read_flags
- return AVIF_RESULT_IO_ERROR;
- }
-
- AvifIOData* io_data = static_cast<AvifIOData*>(io->data);
-
- // Sanitize/clamp incoming request
- if (offset > io_data->reader->size()) {
- // The offset is past the end of the buffer or available data.
- return io_data->all_data_received ? AVIF_RESULT_IO_ERROR
- : AVIF_RESULT_WAITING_ON_IO;
- }
-
- // It is more convenient to work with a variable of the size_t type. Since
- // offset <= io_data->reader->size() <= SIZE_MAX, this cast is safe.
- size_t position = static_cast<size_t>(offset);
- const size_t available_size = io_data->reader->size() - position;
- if (size > available_size) {
- if (!io_data->all_data_received) {
- return AVIF_RESULT_WAITING_ON_IO;
- }
- size = available_size;
- }
-
- out->size = size;
-
- base::span<const uint8_t> data = io_data->reader->GetSomeData(position);
- if (data.size() >= size) {
- out->data = data.data();
- return AVIF_RESULT_OK;
- }
-
- io_data->buffer.clear();
- io_data->buffer.reserve(size);
-
- while (size != 0) {
- data = io_data->reader->GetSomeData(position);
- size_t copy_size = std::min(data.size(), size);
- io_data->buffer.insert(io_data->buffer.end(), data.begin(), data.end());
- position += copy_size;
- size -= copy_size;
- }
-
- out->data = io_data->buffer.data();
- return AVIF_RESULT_OK;
-}
-
-bool AVIFImageDecoder::UpdateDemuxer() {
- DCHECK(!Failed());
- if (IsDecodedSizeAvailable()) {
- return true;
- }
-
- if (have_parsed_current_data_) {
- return true;
- }
- have_parsed_current_data_ = true;
-
- if (!decoder_) {
- decoder_.reset(avifDecoderCreate());
- if (!decoder_) {
- return false;
- }
-
- // For simplicity, use a hardcoded maxThreads of 2, independent of the image
- // size and processor count. Note: even if we want maxThreads to depend on
- // the image size, it is impossible to do so because maxThreads is passed to
- // dav1d_open() inside avifDecoderParse(), but the image size is not known
- // until avifDecoderParse() returns successfully. See
- // https://github.com/AOMediaCodec/libavif/issues/636.
- decoder_->maxThreads = 2;
-
- if (animation_option_ != AnimationOption::kUnspecified &&
- avifDecoderSetSource(
- decoder_.get(),
- animation_option_ == AnimationOption::kPreferAnimation
- ? AVIF_DECODER_SOURCE_TRACKS
- : AVIF_DECODER_SOURCE_PRIMARY_ITEM) != AVIF_RESULT_OK) {
- return false;
- }
-
- // Chrome doesn't use XMP and Exif metadata. Ignoring XMP and Exif will
- // ensure avifDecoderParse() isn't waiting for some tiny Exif payload hiding
- // at the end of a file.
- decoder_->ignoreXMP = AVIF_TRUE;
- decoder_->ignoreExif = AVIF_TRUE;
-
- // Turn off libavif's 'clap' (clean aperture) property validation. We
- // validate 'clap' ourselves and ignore invalid 'clap' properties.
- decoder_->strictFlags &= ~AVIF_STRICT_CLAP_VALID;
- // Allow the PixelInformationProperty ('pixi') to be missing in AV1 image
- // items. libheif v1.11.0 or older does not add the 'pixi' item property to
- // AV1 image items. (This issue has been corrected in libheif v1.12.0.) See
- // crbug.com/1198455.
- decoder_->strictFlags &= ~AVIF_STRICT_PIXI_REQUIRED;
-
- if (aux_image_ == cc::AuxImage::kGainmap) {
- decoder_->imageContentToDecode = AVIF_IMAGE_CONTENT_GAIN_MAP;
- }
-
- avif_io_.destroy = nullptr;
- avif_io_.read = ReadFromSegmentReader;
- avif_io_.write = nullptr;
- avif_io_.persistent = AVIF_FALSE;
- avif_io_.data = &avif_io_data_;
- avifDecoderSetIO(decoder_.get(), &avif_io_);
- }
-
- // If all data is received, there is no point in decoding progressively.
- decoder_->allowProgressive = !IsAllDataReceived();
-
- auto ret = avifDecoderParse(decoder_.get());
- if (ret == AVIF_RESULT_WAITING_ON_IO) {
- return true;
- }
- if (ret != AVIF_RESULT_OK) {
- DVLOG(1) << "avifDecoderParse failed: " << avifResultToString(ret) << ". "
- << decoder_->diag.error;
- return false;
- }
-
- // Image metadata is available in decoder_->image after avifDecoderParse()
- // even though decoder_->imageIndex is invalid (-1).
- DCHECK_EQ(decoder_->imageIndex, -1);
- // This variable is named |container| to emphasize the fact that the current
- // contents of decoder_->image come from the container, not any frame.
- const auto* container = GetDecoderImage();
- if (!container) {
- return false;
- }
-
- // The container width and container height are read from either the tkhd
- // (track header) box of a track or the ispe (image spatial extents) property
- // of an image item, both of which are mandatory in the spec.
- if (container->width == 0 || container->height == 0) {
- DVLOG(1) << "Container width and height must be present";
- return false;
- }
-
- // The container depth is read from either the av1C box of a track or the av1C
- // property of an image item, both of which are mandatory in the spec.
- if (container->depth == 0) {
- DVLOG(1) << "Container depth must be present";
- return false;
- }
-
- DCHECK_GT(decoder_->imageCount, 0);
- progressive_ = decoder_->progressiveState == AVIF_PROGRESSIVE_STATE_ACTIVE;
- // If the image is progressive, decoder_->imageCount is the number of
- // progressive frames, but there is only one still image.
- decoded_frame_count_ = progressive_ ? 1 : decoder_->imageCount;
- container_width_ = container->width;
- container_height_ = container->height;
- bit_depth_ = container->depth;
- decode_to_half_float_ =
- ImageIsHighBitDepth() &&
- high_bit_depth_decoding_option_ == kHighBitDepthToHalfFloat;
-
- // Verify that AVIF_PIXEL_FORMAT_{YUV444,YUV422,YUV420,YUV400} are
- // consecutive.
- static_assert(AVIF_PIXEL_FORMAT_YUV422 == AVIF_PIXEL_FORMAT_YUV444 + 1);
- static_assert(AVIF_PIXEL_FORMAT_YUV420 == AVIF_PIXEL_FORMAT_YUV422 + 1);
- static_assert(AVIF_PIXEL_FORMAT_YUV400 == AVIF_PIXEL_FORMAT_YUV420 + 1);
- // Assert that after avifDecoderParse() returns AVIF_RESULT_OK,
- // decoder_->image->yuvFormat (the same as container->yuvFormat) is one of the
- // four YUV formats in AV1.
- CHECK(container->yuvFormat >= AVIF_PIXEL_FORMAT_YUV444 &&
- container->yuvFormat <= AVIF_PIXEL_FORMAT_YUV400)
- << "Invalid YUV format: " << container->yuvFormat;
- avif_yuv_format_ = container->yuvFormat;
- avifPixelFormatInfo format_info;
- avifGetPixelFormatInfo(container->yuvFormat, &format_info);
- chroma_shift_x_ = format_info.chromaShiftX;
- chroma_shift_y_ = format_info.chromaShiftY;
-
- if (container->clli.maxCLL || container->clli.maxPALL) {
- hdr_metadata_ = gfx::HDRMetadata();
- hdr_metadata_.cta_861_3 = gfx::HdrMetadataCta861_3(
- container->clli.maxCLL, container->clli.maxPALL);
- }
-
- // SetEmbeddedColorProfile() must be called before IsSizeAvailable() becomes
- // true. So call SetEmbeddedColorProfile() before calling SetSize(). The color
- // profile is either an ICC profile or the CICP color description.
-
- if (!IgnoresColorSpace()) {
- // The CICP color description is always present because we can always get it
- // from the AV1 sequence header for the frames. If an ICC profile is
- // present, use it instead of the CICP color description.
- if (container->icc.size) {
- std::unique_ptr<ColorProfile> profile = ColorProfile::Create(
- base::span(container->icc.data, container->icc.size));
- if (!profile) {
- DVLOG(1) << "Failed to parse image ICC profile";
- return false;
- }
- uint32_t data_color_space = profile->GetProfile()->data_color_space;
- const bool is_mono = container->yuvFormat == AVIF_PIXEL_FORMAT_YUV400;
- if (is_mono) {
- if (data_color_space != skcms_Signature_Gray &&
- data_color_space != skcms_Signature_RGB) {
- profile = nullptr;
- }
- } else {
- if (data_color_space != skcms_Signature_RGB) {
- profile = nullptr;
- }
- }
- if (!profile) {
- DVLOG(1)
- << "Image contains ICC profile that does not match its color space";
- return false;
- }
- SetEmbeddedColorProfile(std::move(profile));
- } else if (container->colorPrimaries != AVIF_COLOR_PRIMARIES_UNSPECIFIED ||
- container->transferCharacteristics !=
- AVIF_TRANSFER_CHARACTERISTICS_UNSPECIFIED) {
- gfx::ColorSpace frame_cs = GetColorSpace(container);
-
- sk_sp<SkColorSpace> sk_color_space =
- frame_cs.GetAsFullRangeRGB().ToSkColorSpace();
- if (!sk_color_space) {
- DVLOG(1) << "Image contains an unsupported color space";
- return false;
- }
-
- skcms_ICCProfile profile;
- sk_color_space->toProfile(&profile);
- SetEmbeddedColorProfile(std::make_unique<ColorProfile>(profile));
- }
- }
-
- // |angle| * 90 specifies the angle of anti-clockwise rotation in degrees.
- // Legal values: [0-3].
- int angle = 0;
- if (container->transformFlags & AVIF_TRANSFORM_IROT) {
- angle = container->irot.angle;
- CHECK_LT(angle, 4);
- }
- // |axis| specifies how the mirroring is performed.
- // -1: No mirroring.
- // 0: The top and bottom parts of the image are exchanged.
- // 1: The left and right parts of the image are exchanged.
- int axis = -1;
- if (container->transformFlags & AVIF_TRANSFORM_IMIR) {
- axis = container->imir.axis;
- CHECK_LT(axis, 2);
- }
- // MIAF Section 7.3.6.7 (Clean aperture, rotation and mirror) says:
- // These properties, if used, shall be indicated to be applied in the
- // following order: clean aperture first, then rotation, then mirror.
- //
- // In the kAxisAngleToOrientation array, the first dimension is axis (with an
- // offset of 1). The second dimension is angle.
- constexpr ImageOrientationEnum kAxisAngleToOrientation[3][4] = {
- // No mirroring.
- {ImageOrientationEnum::kOriginTopLeft,
- ImageOrientationEnum::kOriginLeftBottom,
- ImageOrientationEnum::kOriginBottomRight,
- ImageOrientationEnum::kOriginRightTop},
- // Top-to-bottom mirroring. Change Top<->Bottom in the first row.
- {ImageOrientationEnum::kOriginBottomLeft,
- ImageOrientationEnum::kOriginLeftTop,
- ImageOrientationEnum::kOriginTopRight,
- ImageOrientationEnum::kOriginRightBottom},
- // Left-to-right mirroring. Change Left<->Right in the first row.
- {ImageOrientationEnum::kOriginTopRight,
- ImageOrientationEnum::kOriginRightBottom,
- ImageOrientationEnum::kOriginBottomLeft,
- ImageOrientationEnum::kOriginLeftTop},
- };
- orientation_ = kAxisAngleToOrientation[axis + 1][angle];
-
- // Determine whether the image can be decoded to YUV.
- // * Alpha channel is not supported.
- // * Multi-frame images (animations) are not supported. (The DecodeToYUV()
- // method does not have an 'index' parameter.)
- allow_decode_to_yuv_ =
- avif_yuv_format_ != AVIF_PIXEL_FORMAT_YUV400 && !decoder_->alphaPresent &&
- decoded_frame_count_ == 1 &&
- GetColorSpace(container).ToSkYUVColorSpace(container->depth,
- &yuv_color_space_) &&
- // TODO(crbug.com/911246): Support color space transforms for YUV decodes.
- !ColorTransform();
-
- // Record bpp information only for 8-bit, color, still images that do not have
- // alpha.
- if (container->depth == 8 && avif_yuv_format_ != AVIF_PIXEL_FORMAT_YUV400 &&
- !decoder_->alphaPresent && decoded_frame_count_ == 1) {
- static constexpr char kType[] = "Avif";
- update_bpp_histogram_callback_ = base::BindOnce(&UpdateBppHistogram<kType>);
- }
-
- unsigned width = container->width;
- unsigned height = container->height;
- // If the image is cropped, pass the size of the cropped image (the clean
- // aperture) to SetSize().
- if (container->transformFlags & AVIF_TRANSFORM_CLAP) {
- AVIFCleanApertureType clap_type;
- avifCropRect crop_rect;
- avifDiagnostics diag;
- avifBool valid_clap = avifCropRectConvertCleanApertureBox(
- &crop_rect, &container->clap, container->width, container->height,
- container->yuvFormat, &diag);
- if (!valid_clap) {
- DVLOG(1) << "Invalid 'clap' property: " << diag.error
- << "; showing the full image.";
- clap_type = AVIFCleanApertureType::kInvalid;
- ignore_clap_ = true;
- } else if (crop_rect.x != 0 || crop_rect.y != 0) {
- // To help discourage the creation of files with privacy risks, also
- // consider 'clap' properties whose origins are not at (0, 0) as invalid.
- // See https://github.com/AOMediaCodec/av1-avif/issues/188 and
- // https://github.com/AOMediaCodec/av1-avif/issues/189.
- DVLOG(1) << "Origin of 'clap' property anchored to (" << crop_rect.x
- << ", " << crop_rect.y << "); showing the full image.";
- clap_type = AVIFCleanApertureType::kNonzeroOrigin;
- ignore_clap_ = true;
- } else {
- clap_type = AVIFCleanApertureType::kZeroOrigin;
- clap_origin_.SetPoint(crop_rect.x, crop_rect.y);
- width = crop_rect.width;
- height = crop_rect.height;
- }
- clap_type_ = clap_type;
- }
- return SetSize(width, height);
-}
-
-avifResult AVIFImageDecoder::DecodeImage(wtf_size_t index) {
- const auto ret = avifDecoderNthImage(decoder_.get(), index);
- // |index| should be less than what DecodeFrameCount() returns, so we should
- // not get the AVIF_RESULT_NO_IMAGES_REMAINING error.
- DCHECK_NE(ret, AVIF_RESULT_NO_IMAGES_REMAINING);
- if (ret != AVIF_RESULT_OK && ret != AVIF_RESULT_WAITING_ON_IO) {
- DVLOG(1) << "avifDecoderNthImage(" << index
- << ") failed: " << avifResultToString(ret) << ": "
- << AvifDecoderErrorMessage(decoder_.get());
- return ret;
- }
-
- const auto* image = GetDecoderImage();
- CHECK(image);
- // Frame size must be equal to container size.
- if (image->width != container_width_ || image->height != container_height_) {
- DVLOG(1) << "Frame size " << image->width << "x" << image->height
- << " differs from container size " << container_width_ << "x"
- << container_height_;
- return AVIF_RESULT_UNKNOWN_ERROR;
- }
- // Frame bit depth must be equal to container bit depth.
- if (image->depth != bit_depth_) {
- DVLOG(1) << "Frame bit depth must be equal to container bit depth";
- return AVIF_RESULT_UNKNOWN_ERROR;
- }
- // Frame YUV format must be equal to container YUV format.
- if (image->yuvFormat != avif_yuv_format_) {
- DVLOG(1) << "Frame YUV format must be equal to container YUV format";
- return AVIF_RESULT_UNKNOWN_ERROR;
- }
-
- decoded_image_ = image;
- if ((image->transformFlags & AVIF_TRANSFORM_CLAP) && !ignore_clap_) {
- CropDecodedImage();
- }
-
- if (ret == AVIF_RESULT_OK) {
- if (IsAllDataReceived() && update_bpp_histogram_callback_) {
- std::move(update_bpp_histogram_callback_).Run(Size(), data_->size());
- }
-
- if (clap_type_.has_value()) {
- base::UmaHistogramEnumeration("Blink.ImageDecoders.Avif.CleanAperture",
- clap_type_.value());
- clap_type_.reset();
- }
- }
- return ret;
-}
-
-void AVIFImageDecoder::CropDecodedImage() {
- DCHECK_NE(decoded_image_, cropped_image_.get());
- if (!cropped_image_) {
- cropped_image_.reset(avifImageCreateEmpty());
- }
- avifCropRect rect;
- rect.x = clap_origin_.x();
- rect.y = clap_origin_.y();
- rect.width = Size().width();
- rect.height = Size().height();
- const avifResult result =
- avifImageSetViewRect(cropped_image_.get(), decoded_image_, &rect);
- CHECK_EQ(result, AVIF_RESULT_OK);
- decoded_image_ = cropped_image_.get();
-}
-
-bool AVIFImageDecoder::RenderImage(const avifImage* image,
- int from_row,
- int* to_row,
- ImageFrame* buffer) {
- DCHECK_LT(from_row, *to_row);
-
- // libavif uses libyuv for the YUV 4:2:0 to RGB upsampling and/or conversion
- // as follows:
- // - convert the top RGB row 0,
- // - convert the RGB rows 1 and 2, then RGB rows 3 and 4 etc.,
- // - convert the bottom (odd) RGB row if there is an even number of RGB rows.
- //
- // Unfortunately this cannot be applied incrementally as is. The RGB values
- // would differ because the first and last RGB rows have a formula using only
- // one UV row, while the other RGB rows use two UV rows as input each.
- // See https://crbug.com/libyuv/934.
- //
- // The workaround is a backup of the last converted even RGB row, called top
- // row, located right before |from_row|. The conversion is then called
- // starting at this top row, overwriting it with invalid values. The remaining
- // pairs of rows are correctly aligned and their freshly converted values are
- // valid. Then the backed up row is put back, fixing the issue.
- // The bottom row is postponed if the other half of the pair it belongs to is
- // not yet decoded.
- //
- // UV rows | Y/RGB rows
- // | all | first decoding | second decoding
- // ____ 0 ____ 0 (from_row)
- // 0 ---- ____ 1 ____ 1
- // ____ 2 ____ 2 ____ 2 (backed up)
- // 1 ---- ____ 3 ____ 3 (postponed) ____ 3 (from_row)
- // ____ 4 4 (*to_row) ____ 4
- // 2 ---- ____ 5 ____ 5
- // 6 (*to_row)
-
- const bool use_libyuv_bilinear_upsampling =
- !decode_to_half_float_ && image->yuvFormat == AVIF_PIXEL_FORMAT_YUV420;
- const bool save_top_row = use_libyuv_bilinear_upsampling && from_row > 0;
- const bool postpone_bottom_row =
- use_libyuv_bilinear_upsampling &&
- static_cast<uint32_t>(*to_row) < image->height;
- if (postpone_bottom_row) {
- // libavif outputs an even number of rows because 4:2:0 samples are decoded
- // in pairs.
- DCHECK(!(*to_row & 1));
- --*to_row;
- if (from_row == *to_row) {
- return true; // Nothing to do.
- }
- }
- if (save_top_row) {
- // |from_row| is odd because it is equal to the output value of |*to_row|
- // from the previous RenderImage() call, and |*to_row| was even and then
- // decremented at that time.
- DCHECK(from_row & 1);
- --from_row;
- }
-
- // Focus |image| on rows [from_row, *to_row).
- std::unique_ptr<avifImage, decltype(&avifImageDestroy)> view(
- nullptr, avifImageDestroy);
- if (from_row > 0 || static_cast<uint32_t>(*to_row) < image->height) {
- const avifCropRect rect = {0, static_cast<uint32_t>(from_row), image->width,
- static_cast<uint32_t>(*to_row - from_row)};
- view.reset(avifImageCreateEmpty());
- const avifResult result = avifImageSetViewRect(view.get(), image, &rect);
- CHECK_EQ(result, AVIF_RESULT_OK);
- image = view.get();
- }
-
- avifRGBImage rgb_image;
- avifRGBImageSetDefaults(&rgb_image, image);
-
- if (decode_to_half_float_) {
- rgb_image.depth = 16;
- rgb_image.isFloat = AVIF_TRUE;
- rgb_image.pixels =
- reinterpret_cast<uint8_t*>(buffer->GetAddrF16(0, from_row));
- rgb_image.rowBytes = image->width * sizeof(uint64_t);
- // When decoding to half float, the pixel ordering is always RGBA on all
- // platforms.
- rgb_image.format = AVIF_RGB_FORMAT_RGBA;
- } else {
- rgb_image.depth = 8;
- rgb_image.pixels = reinterpret_cast<uint8_t*>(buffer->GetAddr(0, from_row));
- rgb_image.rowBytes = image->width * sizeof(uint32_t);
- // When decoding to 8-bit, Android uses little-endian RGBA pixels. All other
- // platforms use BGRA pixels.
- static_assert(SK_B32_SHIFT == 16 - SK_R32_SHIFT);
- static_assert(SK_G32_SHIFT == 8);
- static_assert(SK_A32_SHIFT == 24);
-#if SK_B32_SHIFT
- rgb_image.format = AVIF_RGB_FORMAT_RGBA;
-#else
- rgb_image.format = AVIF_RGB_FORMAT_BGRA;
-#endif
- }
- rgb_image.alphaPremultiplied = buffer->PremultiplyAlpha();
- rgb_image.maxThreads = decoder_->maxThreads;
-
- if (save_top_row) {
- previous_last_decoded_row_.resize(rgb_image.rowBytes);
- memcpy(previous_last_decoded_row_.data(), rgb_image.pixels,
- rgb_image.rowBytes);
- }
- const avifResult result = avifImageYUVToRGB(image, &rgb_image);
- if (save_top_row) {
- memcpy(rgb_image.pixels, previous_last_decoded_row_.data(),
- rgb_image.rowBytes);
- }
- return result == AVIF_RESULT_OK;
-}
-
-void AVIFImageDecoder::ColorCorrectImage(int from_row,
- int to_row,
- ImageFrame* buffer) {
- // Postprocess the image data according to the profile.
- const ColorProfileTransform* const transform = ColorTransform();
- if (!transform) {
- return;
- }
- const auto alpha_format = (buffer->HasAlpha() && buffer->PremultiplyAlpha())
- ? skcms_AlphaFormat_PremulAsEncoded
- : skcms_AlphaFormat_Unpremul;
- if (decode_to_half_float_) {
- const skcms_PixelFormat color_format = skcms_PixelFormat_RGBA_hhhh;
- for (int y = from_row; y < to_row; ++y) {
- ImageFrame::PixelDataF16* const row = buffer->GetAddrF16(0, y);
- const bool success = skcms_Transform(
- row, color_format, alpha_format, transform->SrcProfile(), row,
- color_format, alpha_format, transform->DstProfile(), Size().width());
- DCHECK(success);
- }
- } else {
- const skcms_PixelFormat color_format = XformColorFormat();
- for (int y = from_row; y < to_row; ++y) {
- ImageFrame::PixelData* const row = buffer->GetAddr(0, y);
- const bool success = skcms_Transform(
- row, color_format, alpha_format, transform->SrcProfile(), row,
- color_format, alpha_format, transform->DstProfile(), Size().width());
- DCHECK(success);
- }
- }
-}
-
-bool AVIFImageDecoder::GetGainmapInfoAndData(
- SkGainmapInfo& out_gainmap_info,
- scoped_refptr<SegmentReader>& out_gainmap_data) const {
- // Ensure that parsing succeeded.
- if (!IsDecodedSizeAvailable()) {
- return false;
- }
- if (!decoder_->image->gainMap) {
- return false;
- }
- const avifGainMap& gain_map = *decoder_->image->gainMap;
- if (gain_map.baseHdrHeadroom.d == 0 || gain_map.alternateHdrHeadroom.d == 0) {
- DVLOG(1) << "Invalid gainmap metadata: a denominator value is zero";
- return false;
- }
- const float base_headroom = std::exp2(
- FractionToFloat(gain_map.baseHdrHeadroom.n, gain_map.baseHdrHeadroom.d));
- const float alternate_headroom = std::exp2(FractionToFloat(
- gain_map.alternateHdrHeadroom.n, gain_map.alternateHdrHeadroom.d));
- const bool base_is_hdr = base_headroom > alternate_headroom;
- out_gainmap_info.fDisplayRatioSdr =
- base_is_hdr ? alternate_headroom : base_headroom;
- out_gainmap_info.fDisplayRatioHdr =
- base_is_hdr ? base_headroom : alternate_headroom;
- out_gainmap_info.fBaseImageType = base_is_hdr
- ? SkGainmapInfo::BaseImageType::kHDR
- : SkGainmapInfo::BaseImageType::kSDR;
- if (!gain_map.useBaseColorSpace) {
- // Try to use the alternate image's color space.
- out_gainmap_info.fGainmapMathColorSpace =
- GetAltImageColorSpace(*decoder_->image);
- }
- for (int i = 0; i < 3; ++i) {
- if (gain_map.gainMapMin[i].d == 0 || gain_map.gainMapMax[i].d == 0 ||
- gain_map.gainMapGamma[i].d == 0 || gain_map.baseOffset[i].d == 0 ||
- gain_map.alternateOffset[i].d == 0) {
- DVLOG(1) << "Invalid gainmap metadata: a denominator value is zero";
- return false;
- }
- if (gain_map.gainMapGamma[i].n == 0) {
- DVLOG(1) << "Invalid gainmap metadata: gamma is zero";
- return false;
- }
-
- const float min_log2 =
- FractionToFloat(gain_map.gainMapMin[i].n, gain_map.gainMapMin[i].d);
- const float max_log2 =
- FractionToFloat(gain_map.gainMapMax[i].n, gain_map.gainMapMax[i].d);
- out_gainmap_info.fGainmapRatioMin[i] = std::exp2(min_log2);
- out_gainmap_info.fGainmapRatioMax[i] = std::exp2(max_log2);
-
- // Numerator and denominator intentionally swapped to get 1.0/gamma.
- out_gainmap_info.fGainmapGamma[i] =
- FractionToFloat(gain_map.gainMapGamma[i].d, gain_map.gainMapGamma[i].n);
- const float base_offset =
- FractionToFloat(gain_map.baseOffset[i].n, gain_map.baseOffset[i].d);
- const float alternate_offset = FractionToFloat(
- gain_map.alternateOffset[i].n, gain_map.alternateOffset[i].d);
- out_gainmap_info.fEpsilonSdr[i] =
- base_is_hdr ? alternate_offset : base_offset;
- out_gainmap_info.fEpsilonHdr[i] =
- base_is_hdr ? base_offset : alternate_offset;
- }
- out_gainmap_data = data_;
- return true;
-}
-
-avifImage* AVIFImageDecoder::GetDecoderImage() const {
- if (aux_image_ == cc::AuxImage::kGainmap) {
- if (!decoder_->image->gainMap) {
- DVLOG(1) << "Attempted to access gain map image, but gainMap is nullptr";
- return nullptr;
- }
- return decoder_->image->gainMap->image;
- }
- return decoder_->image;
-}
-
-AVIFImageDecoder::AvifIOData::AvifIOData() = default;
-AVIFImageDecoder::AvifIOData::AvifIOData(
- scoped_refptr<const SegmentReader> reader,
- bool all_data_received)
- : reader(std::move(reader)), all_data_received(all_data_received) {}
-AVIFImageDecoder::AvifIOData::~AvifIOData() = default;
-
-} // namespace blink
diff --git a/www-client/ungoogled-chromium/files/avif_image_decoder.h b/www-client/ungoogled-chromium/files/avif_image_decoder.h
deleted file mode 100644
index 88c9431709f9..000000000000
--- a/www-client/ungoogled-chromium/files/avif_image_decoder.h
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_AVIF_AVIF_IMAGE_DECODER_H_
-#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_AVIF_AVIF_IMAGE_DECODER_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/functional/callback.h"
-#include "third_party/blink/renderer/platform/allow_discouraged_type.h"
-#include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
-#include "third_party/blink/renderer/platform/wtf/vector.h"
-#include <avif/avif.h>
-#include "third_party/skia/include/core/SkImageInfo.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace blink {
-
-class FastSharedBufferReader;
-
-class PLATFORM_EXPORT AVIFImageDecoder final : public ImageDecoder {
- public:
- AVIFImageDecoder(AlphaOption,
- HighBitDepthDecodingOption,
- ColorBehavior,
- cc::AuxImage,
- wtf_size_t max_decoded_bytes,
- AnimationOption);
- AVIFImageDecoder(const AVIFImageDecoder&) = delete;
- AVIFImageDecoder& operator=(const AVIFImageDecoder&) = delete;
- ~AVIFImageDecoder() override;
-
- // ImageDecoder:
- String FilenameExtension() const override;
- const AtomicString& MimeType() const override;
- bool ImageIsHighBitDepth() override;
- void OnSetData(scoped_refptr<SegmentReader> data) override;
- bool GetGainmapInfoAndData(
- SkGainmapInfo& out_gainmap_info,
- scoped_refptr<SegmentReader>& out_gainmap_data) const override;
- cc::YUVSubsampling GetYUVSubsampling() const override;
- gfx::Size DecodedYUVSize(cc::YUVIndex) const override;
- wtf_size_t DecodedYUVWidthBytes(cc::YUVIndex) const override;
- SkYUVColorSpace GetYUVColorSpace() const override;
- uint8_t GetYUVBitDepth() const override;
- void DecodeToYUV() override;
- int RepetitionCount() const override;
- bool FrameIsReceivedAtIndex(wtf_size_t) const override;
- std::optional<base::TimeDelta> FrameTimestampAtIndex(
- wtf_size_t) const override;
- base::TimeDelta FrameDurationAtIndex(wtf_size_t) const override;
- bool ImageHasBothStillAndAnimatedSubImages() const override;
-
- // Returns true if the data in fast_reader begins with a valid FileTypeBox
- // (ftyp) that supports the brand 'avif' or 'avis'.
- static bool MatchesAVIFSignature(const FastSharedBufferReader& fast_reader);
-
- gfx::ColorSpace GetColorSpaceForTesting() const;
-
- private:
- // If the AVIF image has a clean aperture ('clap') property, what kind of
- // clean aperture it is. Values synced with 'AVIFCleanApertureType' in
- // src/tools/metrics/histograms/enums.xml.
- //
- // These values are persisted to logs. Entries should not be renumbered and
- // numeric values should never be reused.
- enum class AVIFCleanApertureType {
- kInvalid = 0, // The clean aperture property is invalid.
- kNonzeroOrigin = 1, // The origin of the clean aperture is not (0, 0).
- kZeroOrigin = 2, // The origin of the clean aperture is (0, 0).
- kMaxValue = kZeroOrigin,
- };
-
- struct AvifIOData {
- AvifIOData();
- AvifIOData(scoped_refptr<const SegmentReader> reader,
- bool all_data_received);
- ~AvifIOData();
-
- scoped_refptr<const SegmentReader> reader;
- std::vector<uint8_t> buffer ALLOW_DISCOURAGED_TYPE("Required by libavif");
- bool all_data_received = false;
- };
-
- void ParseMetadata();
-
- // ImageDecoder:
- void DecodeSize() override;
- wtf_size_t DecodeFrameCount() override;
- void InitializeNewFrame(wtf_size_t) override;
- void Decode(wtf_size_t) override;
- bool CanReusePreviousFrameBuffer(wtf_size_t) const override;
-
- // Implements avifIOReadFunc, the |read| function in the avifIO struct.
- static avifResult ReadFromSegmentReader(avifIO* io,
- uint32_t read_flags,
- uint64_t offset,
- size_t size,
- avifROData* out);
-
- // Creates |decoder_| if not yet created and decodes the size and frame count.
- bool UpdateDemuxer();
-
- // Decodes the frame at index |index| and checks if the frame's size, bit
- // depth, and YUV format matches those reported by the container. The decoded
- // frame is available in decoded_image_.
- avifResult DecodeImage(wtf_size_t index);
-
- // Crops |decoded_image_|.
- void CropDecodedImage();
-
- // Renders the rows [from_row, *to_row) of |image| to |buffer|. Returns
- // whether |image| was rendered successfully. On return, the in/out argument
- // |*to_row| may be decremented in case of subsampled chroma needing more
- // data.
- bool RenderImage(const avifImage* image,
- int from_row,
- int* to_row,
- ImageFrame* buffer);
-
- // Applies color profile correction to the rows [from_row, to_row) of
- // |buffer|, if desired.
- void ColorCorrectImage(int from_row, int to_row, ImageFrame* buffer);
-
- // Returns decoder_->image or decoder_->image->gainMap->image depending on
- // aux_image_. May be nullptr if requesting the gain map image
- // (cc::AuxImage::kGainmap) but no gain map is present.
- avifImage* GetDecoderImage() const;
-
- bool have_parsed_current_data_ = false;
- // The image width and height (before cropping, if any) from the container.
- //
- // Note: container_width_, container_height_, decoder_->image->width, and
- // decoder_->image->height are the width and height of the full image. Size()
- // returns the size of the cropped image (the clean aperture).
- uint32_t container_width_ = 0;
- uint32_t container_height_ = 0;
- // The bit depth from the container.
- uint8_t bit_depth_ = 0;
- bool decode_to_half_float_ = false;
- uint8_t chroma_shift_x_ = 0;
- uint8_t chroma_shift_y_ = 0;
- bool progressive_ = false;
- // Number of displayed rows for a non-progressive still image.
- int incrementally_displayed_height_ = 0;
- // The YUV format from the container.
- avifPixelFormat avif_yuv_format_ = AVIF_PIXEL_FORMAT_NONE;
- wtf_size_t decoded_frame_count_ = 0;
- SkYUVColorSpace yuv_color_space_ = SkYUVColorSpace::kIdentity_SkYUVColorSpace;
- // Used to call UpdateBppHistogram<"Avif">() at most once to record the
- // bits-per-pixel value of the image when the image is successfully decoded.
- base::OnceCallback<void(gfx::Size, size_t)> update_bpp_histogram_callback_;
- std::optional<AVIFCleanApertureType> clap_type_;
- // Whether the 'clap' (clean aperture) property should be ignored, e.g.
- // because the 'clap' property is invalid or unsupported.
- bool ignore_clap_ = false;
- // The origin (top left corner) of the clean aperture. Used only when the
- // image has a valid 'clap' (clean aperture) property.
- gfx::Point clap_origin_;
- // A copy of decoder_->image with the width, height, and plane buffers
- // adjusted to those of the clean aperture. Used only when the image has a
- // 'clap' (clean aperture) property.
- std::unique_ptr<avifImage, decltype(&avifImageDestroy)> cropped_image_{
- nullptr, avifImageDestroy};
- // Set by a successful DecodeImage() call to either decoder_->image or
- // cropped_image_.get() depending on whether the image has a 'clap' (clean
- // aperture) property.
- raw_ptr<const avifImage, DanglingUntriaged> decoded_image_ = nullptr;
- // The declaration order of the next three fields is important. decoder_
- // points to avif_io_, and avif_io_ points to avif_io_data_. The destructor
- // must destroy them in that order.
- AvifIOData avif_io_data_;
- avifIO avif_io_ = {};
- std::unique_ptr<avifDecoder, decltype(&avifDecoderDestroy)> decoder_{
- nullptr, avifDecoderDestroy};
-
- const AnimationOption animation_option_;
-
- // Used temporarily for incremental decoding and for some YUV to RGB color
- // conversions.
- Vector<uint8_t> previous_last_decoded_row_;
-};
-
-} // namespace blink
-
-#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_AVIF_AVIF_IMAGE_DECODER_H_
diff --git a/www-client/ungoogled-chromium/files/chromium-109-system-openh264.patch b/www-client/ungoogled-chromium/files/chromium-109-system-openh264.patch
deleted file mode 100644
index 6be816b305b4..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-109-system-openh264.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/build/linux/unbundle/openh264.gn
-+++ b/build/linux/unbundle/openh264.gn
-@@ -2,6 +2,7 @@
- # Use of this source code is governed by a BSD-style license that can be
- # found in the LICENSE file.
-
-+import("//build/buildflag_header.gni")
- import("//build/config/linux/pkg_config.gni")
- import("//build/shim_headers.gni")
-
-@@ -34,3 +35,9 @@ source_set("encoder") {
- deps = [ ":openh264_shim" ]
- public_configs = [ ":config" ]
- }
-+
-+buildflag_header("buildflags") {
-+ header = "buildflags.h"
-+ header_dir = "third_party/openh264"
-+ flags = [ "OPENH264_API_WELS=1" ]
-+}
diff --git a/www-client/ungoogled-chromium/files/chromium-109-system-zlib.patch b/www-client/ungoogled-chromium/files/chromium-109-system-zlib.patch
deleted file mode 100644
index 5e8b2d80a9a8..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-109-system-zlib.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-@@ -19,7 +19,6 @@ limitations under the License.
- #include <cstdio>
-
- #include "absl/strings/string_view.h" // from @com_google_absl
--#include "third_party/zlib/contrib/minizip/ioapi.h"
-
- namespace tflite {
- namespace metadata {
diff --git a/www-client/ungoogled-chromium/files/chromium-125-cloud_authenticator.patch b/www-client/ungoogled-chromium/files/chromium-125-cloud_authenticator.patch
deleted file mode 100644
index ee79efdf8a6d..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-125-cloud_authenticator.patch
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/chrome/browser/webauthn/BUILD.gn
-+++ b/chrome/browser/webauthn/BUILD.gn
-@@ -26,6 +26,5 @@
- "//url",
- ]
-
-- data_deps = [ "//third_party/cloud_authenticator/test/local_service:cloud_authenticator_test_service" ]
- }
- }
---- a/chrome/test/BUILD.gn
-+++ b/chrome/test/BUILD.gn
-@@ -7112,7 +7112,6 @@
- "//third_party/metrics_proto",
- "//third_party/microsoft_webauthn",
- "//third_party/re2",
-- "//third_party/rust/fend_core/v1/wrapper:unit_tests",
- "//third_party/webrtc_overrides:webrtc_component",
- "//third_party/widevine/cdm:headers",
- "//third_party/zlib/google:compression_utils",
diff --git a/www-client/ungoogled-chromium/files/chromium-127-cargo_crate.patch b/www-client/ungoogled-chromium/files/chromium-127-cargo_crate.patch
deleted file mode 100644
index b13b7cb69416..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-127-cargo_crate.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/build/rust/cargo_crate.gni
-+++ b/build/rust/cargo_crate.gni
-@@ -5,6 +5,8 @@
- import("//build/rust/rust_executable.gni")
- import("//build/rust/rust_macro.gni")
- import("//build/rust/rust_static_library.gni")
-+
-+rust_sysroot=""
-
- # This template allows for building Cargo crates within gn.
- #
-
diff --git a/www-client/ungoogled-chromium/files/chromium-128-cfi-split-lto-unit.patch b/www-client/ungoogled-chromium/files/chromium-128-cfi-split-lto-unit.patch
deleted file mode 100644
index 50b55bf0c991..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-128-cfi-split-lto-unit.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- a/build/config/compiler/BUILD.gn
-+++ b/build/config/compiler/BUILD.gn
-@@ -745,6 +745,11 @@
- # We only use one version of LLVM within a build so there's no need to
- # upgrade debug info, which can be expensive since it runs the verifier.
- ldflags += [ "-Wl,-mllvm,-disable-auto-upgrade-debug-info" ]
-+
-+ if (is_cfi) {
-+ cflags += [ "-fsplit-lto-unit" ]
-+ ldflags += [ "-fsplit-lto-unit" ]
-+ }
- }
-
- if (!optimize_for_size) {
diff --git a/www-client/ungoogled-chromium/files/chromium-133-webrtc-fixes.patch b/www-client/ungoogled-chromium/files/chromium-133-webrtc-fixes.patch
deleted file mode 100644
index e5153b8619c0..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-133-webrtc-fixes.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/third_party/webrtc/rtc_base/openssl_stream_adapter.h
-+++ b/third_party/webrtc/rtc_base/openssl_stream_adapter.h
-@@ -102,7 +102,7 @@
- void Close() override;
- StreamState GetState() const override;
-
-- std::optional<absl::string_view> GetTlsCipherSuiteName() const override;
-+ std::optional<absl::string_view> GetTlsCipherSuiteName() const;
-
- bool GetSslCipherSuite(int* cipher) const override;
- [[deprecated("Use GetSslVersionBytes")]] SSLProtocolVersion GetSslVersion()
diff --git a/www-client/ungoogled-chromium/files/chromium-134-stdatomic.patch b/www-client/ungoogled-chromium/files/chromium-134-stdatomic.patch
deleted file mode 100644
index 069086c2ea51..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-134-stdatomic.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-author: Andres Salomon <dilinger@debian.org>
-
-The #define LIBCP_STDATOMIC_H is meant to block inclusion of <stdatomic.h>,
-which conflicts w/ chromium's <atomic>. However, it doesn't actually block
-it (maybe newer clang uses a different inclusion guard symbol?). This is
-what clang-19 needs to block stdatomic.h.
-
---- a/third_party/pthreadpool/chromium/jobs.cc
-+++ b/third_party/pthreadpool/chromium/jobs.cc
-@@ -18,6 +18,7 @@
- // crbug.com/391750836.
- #include <atomic>
- #define _LIBCPP_STDATOMIC_H
-+#define __CLANG_STDATOMIC_H
- using namespace std;
-
- // Configuration header.
diff --git a/www-client/ungoogled-chromium/files/chromium-138-nodejs-version-check.patch b/www-client/ungoogled-chromium/files/chromium-138-nodejs-version-check.patch
deleted file mode 100644
index cc4b3b4b9e82..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-138-nodejs-version-check.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-https://issues.chromium.org/issues/418397211
-From: Matt Jolly <kangie@gentoo.org>
-Date: Tue, 25 Mar 2025 13:33:48 +1000
-Subject: [PATCH] Remove nodejs version check
-
-Added in https://github.com/chromium/chromium/commit/0ff8528999941d7182be6fc77aeb12a110a3cd86,
-this change is only really useful for gclient checkouts and breaks the
-ability for downstreams to provide their own, compatible, nodejs
-version via the system package manager (or for use on arches other than
-those that Google provides binaries for):
-
-[ERR_ASSERTION]: Failed NodeJS version check: Expected version 'v22.11.0', but found 'v22.13.1'. Did you run 'gclient sync'
-
-This is google development footgun protection, working around
-poor development practices and gclient's inability to ensure
-that the source tree is in a consistent state. We don't need it
-here.
-
-Signed-off-by: Matt Jolly <kangie@gentoo.org>
---- a/third_party/node/node.gni
-+++ b/third_party/node/node.gni
-@@ -36,15 +36,5 @@ template("node") {
- }
- }
-
-- # Automatically add a dependency to ":check_version" to ensure NodeJS is
-- # always running the expected version, except when the ':check_version'
-- # target itself is running in which case it shouldn't depend on itself.
-- if (get_label_info(":" + target_name, "label_no_toolchain") !=
-- "//third_party/node:check_version") {
-- if (!defined(deps)) {
-- deps = []
-- }
-- deps += [ "//third_party/node:check_version" ]
-- }
- }
- }
---- a/third_party/protobuf/proto_library.gni
-+++ b/third_party/protobuf/proto_library.gni
-@@ -562,7 +562,6 @@ template("proto_library") {
- _protoc_gen_ts_path,
- "//tools/protoc_wrapper/protoc-gen-ts_proto.py",
- ] + _protoc_gen_ts_runtime_deps
-- deps += [ "//third_party/node:check_version" ]
- }
-
- if (_generate_with_plugin) {
---
-2.49.0
diff --git a/www-client/ungoogled-chromium/files/chromium-141-fix-for-kde.patch b/www-client/ungoogled-chromium/files/chromium-141-fix-for-kde.patch
deleted file mode 100644
index ec195dc16917..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-141-fix-for-kde.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/chrome/browser/renderer_preferences_util.cc 2025-10-02 10:02:51.275119654 +0200
-+++ b/chrome/browser/renderer_preferences_util.cc 2025-10-02 10:03:20.725461352 +0200
-@@ -127,7 +127,8 @@
-
- #if BUILDFLAG(IS_LINUX)
- if (auto* linux_ui_theme = ui::LinuxUiTheme::GetForProfile(profile)) {
-- if (ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme()) {
-+ if (ThemeServiceFactory::GetForProfile(profile) &&
-+ ThemeServiceFactory::GetForProfile(profile)->UsingSystemTheme()) {
- linux_ui_theme->GetFocusRingColor(&prefs->focus_ring_color);
- linux_ui_theme->GetActiveSelectionBgColor(
- &prefs->active_selection_bg_color);
diff --git a/www-client/ungoogled-chromium/files/chromium-144-qrcode.patch b/www-client/ungoogled-chromium/files/chromium-144-qrcode.patch
deleted file mode 100644
index 76bfae809e10..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-144-qrcode.patch
+++ /dev/null
@@ -1,75 +0,0 @@
---- a/chrome/browser/ui/views/webauthn/authenticator_hybrid_and_security_key_sheet_view.cc
-+++ b/chrome/browser/ui/views/webauthn/authenticator_hybrid_and_security_key_sheet_view.cc
-@@ -113,21 +113,7 @@ AuthenticatorHybridAndSecurityKeySheetVi
- const std::u16string& rp_id = webauthn_ui_helpers::RpIdToElidedHost(
- sheet_model->dialog_model()->relying_party_id, label_width, font_list);
-
-- const std::vector<std::u16string> qr_labels = {l10n_util::GetStringFUTF16(
-- is_create ? IDS_WEBAUTHN_USE_YOUR_PHONE_OR_TABLET_CREATE_DESCRIPTION
-- : IDS_WEBAUTHN_USE_YOUR_PHONE_OR_TABLET_SIGN_IN_DESCRIPTION,
-- rp_id)};
-- container->AddChildView(CreateMechanismDescriptionWithIcon(
-- kCameraIcon,
-- l10n_util::GetStringUTF16(IDS_WEBAUTHN_USE_YOUR_PHONE_OR_TABLET),
-- qr_labels));
--
-- container->AddChildView(
-- std::make_unique<AuthenticatorQrCenteredView>(qr_string_));
--
- if (sheet_model->dialog_model()->show_security_key_on_qr_sheet) {
-- container->AddChildView(std::make_unique<views::Separator>());
--
- auto attestation_warning = sheet_model->GetAttestationWarning();
- std::vector<std::u16string> security_key_labels = {
- l10n_util::GetStringFUTF16(
---- a/components/qr_code_generator/BUILD.gn
-+++ b/components/qr_code_generator/BUILD.gn
-@@ -38,7 +38,6 @@ source_set("qr_code_generator") {
- "qr_code_generator.h",
- ]
- deps = [
-- ":qr_code_generator_ffi_glue",
- "//base",
- ]
- public_deps = [
---- a/components/qr_code_generator/qr_code_generator.cc
-+++ b/components/qr_code_generator/qr_code_generator.cc
-@@ -8,9 +8,7 @@
- #include <vector>
-
- #include "base/check_op.h"
--#include "base/containers/span_rust.h"
- #include "base/numerics/safe_conversions.h"
--#include "components/qr_code_generator/qr_code_generator_ffi_glue.rs.h"
-
- namespace qr_code_generator {
-
-@@ -22,27 +20,7 @@ GeneratedCode& GeneratedCode::operator=(
- base::expected<GeneratedCode, Error> GenerateCode(
- base::span<const uint8_t> in,
- std::optional<int> min_version) {
-- rust::Slice<const uint8_t> rs_in = base::SpanToRustSlice(in);
--
-- // `min_version` might come from a fuzzer and therefore we use a lenient
-- // `saturated_cast` instead of a `checked_cast`.
-- int16_t rs_min_version =
-- base::saturated_cast<int16_t>(min_version.value_or(0));
--
-- std::vector<uint8_t> result_pixels;
-- size_t result_width = 0;
-- Error result_error = Error::kUnknownError;
-- bool result_is_success = generate_qr_code_using_rust(
-- rs_in, rs_min_version, result_pixels, result_width, result_error);
--
-- if (!result_is_success) {
-- return base::unexpected(result_error);
-- }
-- GeneratedCode code;
-- code.data = std::move(result_pixels);
-- code.qr_size = base::checked_cast<int>(result_width);
-- CHECK_EQ(code.data.size(), static_cast<size_t>(code.qr_size * code.qr_size));
-- return code;
-+ return base::unexpected(Error::kUnknownError);
- }
-
- } // namespace qr_code_generator
diff --git a/www-client/ungoogled-chromium/files/chromium-144-revert-libpng-testiness.patch b/www-client/ungoogled-chromium/files/chromium-144-revert-libpng-testiness.patch
deleted file mode 100644
index 3f461e26b63b..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-144-revert-libpng-testiness.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From e7f363e6010af2da97435d38ad33989f13ef996b Mon Sep 17 00:00:00 2001
-From: Matt Jolly <kangie@gentoo.org>
-Date: Thu, 6 Nov 2025 23:25:32 +1000
-Subject: [PATCH] M143 revert libpng testiness
-
-This patch reverts 4f7637304eca894adf2e70078a55654a88224a30
-which breaks system-libpng usage by making libpng a testonly target.
-
-Really we just want to unbundle libpng at that point, though soon it
-will be replaced by something perhaps a little more oxidised.
-
-Probably we should just drop system-png at this point, but let's get
-a working build for now.
-
-Signed-off-by: Matt Jolly <kangie@gentoo.org>
----
- chrome/test/BUILD.gn | 6 ++---
- testing/libfuzzer/fuzzers/BUILD.gn | 2 +-
- third_party/libpng/BUILD.gn | 8 -------
- third_party/libpng/visibility.gni | 38 ++++++++++--------------------
- tools/imagediff/BUILD.gn | 4 +---
- ui/gfx/BUILD.gn | 2 +-
- 6 files changed, 18 insertions(+), 42 deletions(-)
-
---- a/chrome/test/BUILD.gn
-+++ b/chrome/test/BUILD.gn
-@@ -11226,7 +11226,7 @@ if (!is_android) {
- "//testing/gtest",
- "//third_party/hunspell",
- "//third_party/icu",
-- "//third_party/libpng:libpng_for_testonly",
-+ "//third_party/libpng",
- "//ui/base:test_support",
- "//ui/events:test_support",
- "//ui/ozone",
-@@ -11601,7 +11601,7 @@ if (!is_android && !is_chromeos_device)
- "//testing/gtest",
- "//third_party/hunspell",
- "//third_party/icu",
-- "//third_party/libpng:libpng_for_testonly",
-+ "//third_party/libpng",
- "//ui/base:base_interactive_ui_tests",
- "//ui/base:ozone_buildflags",
- "//ui/base:test_support",
-@@ -12572,7 +12572,7 @@ if (!is_android) {
- "//testing/gtest",
- "//third_party/hunspell",
- "//third_party/icu",
-- "//third_party/libpng:libpng_for_testonly",
-+ "//third_party/libpng",
- "//ui/base:test_support",
- "//ui/resources:ui_test_pak",
- "//ui/views",
---- a/testing/libfuzzer/fuzzers/BUILD.gn
-+++ b/testing/libfuzzer/fuzzers/BUILD.gn
-@@ -103,7 +103,7 @@ fuzzer_test("libpng_progressive_read_fuz
- sources = [ "libpng_read_fuzzer.cc" ]
- deps = [
- "//base",
-- "//third_party/libpng:libpng_for_testonly",
-+ "//third_party/libpng",
- ]
- dict = "dicts/png.dict"
- seed_corpuses = libpng_seed_corpuses
---- a/third_party/libpng/BUILD.gn
-+++ b/third_party/libpng/BUILD.gn
-@@ -130,14 +130,6 @@ if (is_win) {
- }
- }
-
--group("libpng_for_testonly") {
-- testonly = true
-- public_deps = [ ":libpng" ]
--
-- visibility = []
-- visibility = libpng_testonly_visibility
--}
--
- if (build_with_chromium) {
- libpng_ossfuzz_seed_corpuses = [
- "//components/test/data/viz",
---- a/third_party/libpng/visibility.gni
-+++ b/third_party/libpng/visibility.gni
-@@ -7,7 +7,7 @@
- import("//build/config/gclient_args.gni")
-
- # Chrome does not (and should not) depend on `libpng`.
--visibility = []
-+visibility = [ "//skia/*", "//third_party/freetype:*", "//third_party/libwebp:*", "//third_party/weston/*" ]
-
- # Dependency edges that are used in projects outside of Chromium that pull in
- # this directory (e.g. ones only needed in standalone PDFium builds).
---- a/tools/imagediff/BUILD.gn
-+++ b/tools/imagediff/BUILD.gn
-@@ -34,7 +34,6 @@ if (target_os == "win" && host_os != "wi
- # If the current toolchain is the test host toolchain, build the tool.
- if (current_toolchain == imagediff_toolchain) {
- executable("imagediff") {
-- testonly = true
- output_name = "image_diff" # Different than dir name for historical
- # reasons.
- sources = [
-@@ -48,7 +47,7 @@ if (current_toolchain == imagediff_toolc
- deps = [
- "//base",
- "//build/win:default_exe_manifest",
-- "//third_party/libpng:libpng_for_testonly",
-+ "//third_party/libpng",
- "//third_party/zlib",
- ]
- }
-@@ -61,7 +60,6 @@ if (current_toolchain == imagediff_toolc
- } else if (current_toolchain == default_toolchain &&
- default_toolchain != imagediff_toolchain) {
- binary_symlink("imagediff") {
-- testonly = true
- binary_label = ":$target_name($imagediff_toolchain)"
- binary_output_name = "image_diff"
-
---- a/ui/gfx/BUILD.gn
-+++ b/ui/gfx/BUILD.gn
-@@ -881,7 +881,7 @@ test("gfx_unittests") {
- "//skia:skcms",
- "//testing/gtest",
- "//third_party/icu:icuuc",
-- "//third_party/libpng:libpng_for_testonly",
-+ "//third_party/libpng",
- "//third_party/zlib",
- "//ui/base",
- "//ui/gfx/animation",
diff --git a/www-client/ungoogled-chromium/files/chromium-145-crabby.patch b/www-client/ungoogled-chromium/files/chromium-145-crabby.patch
deleted file mode 100644
index 31f593f15bb7..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-145-crabby.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/third_party/blink/renderer/platform/image-decoders/BUILD.gn
-+++ b/third_party/blink/renderer/platform/image-decoders/BUILD.gn
-@@ -85,7 +85,7 @@ component("image_decoders") {
- "avif/avif_image_decoder.h",
- ]
-
-- deps += [ "//third_party/crabbyavif" ]
-+ libs = [ "avif" ]
- }
-
- if (enable_jxl_decoder) {
diff --git a/www-client/ungoogled-chromium/files/chromium-145-fontations.patch b/www-client/ungoogled-chromium/files/chromium-145-fontations.patch
deleted file mode 100644
index 664130d2a17a..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-145-fontations.patch
+++ /dev/null
@@ -1,728 +0,0 @@
---- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_screenshotter.cc
-+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_screenshotter.cc
-@@ -19,7 +19,7 @@
- #include "mojo/public/cpp/base/proto_wrapper.h"
- #include "third_party/skia/include/core/SkImage.h"
- #include "third_party/skia/include/core/SkStream.h"
--#include "third_party/skia/include/encode/SkPngRustEncoder.h"
-+#include "third_party/skia/include/encode/SkPngEncoder.h"
- #include "ui/gfx/geometry/rect.h"
-
- constexpr size_t kMaxScreenshotFileSize = 50 * 1000L * 1000L; // 50 MB.
-@@ -73,7 +73,7 @@ void WriteBitmapToPng(const SkBitmap& bi
- return;
- }
- bool success_encode =
-- SkPngRustEncoder::Encode(&out_file, cropped_pixmap, /*options=*/{});
-+ SkPngEncoder::Encode(&out_file, cropped_pixmap, /*options=*/{});
- if (success_encode) {
- VLOG(2) << "Wrote debug file: " << screenshot_filepath;
- } else {
---- a/components/paint_preview/common/serial_utils.cc
-+++ b/components/paint_preview/common/serial_utils.cc
-@@ -15,7 +15,7 @@
- #include "third_party/skia/include/codec/SkCodec.h"
- #include "third_party/skia/include/codec/SkGifDecoder.h"
- #include "third_party/skia/include/codec/SkJpegDecoder.h"
--#include "third_party/skia/include/codec/SkPngRustDecoder.h"
-+#include "third_party/skia/include/codec/SkPngDecoder.h"
- #include "third_party/skia/include/codec/SkWebpDecoder.h"
- #include "third_party/skia/include/core/SkCanvas.h"
- #include "third_party/skia/include/core/SkData.h"
-@@ -135,7 +135,7 @@ static bool is_supported_codec(sk_sp<con
- CHECK(data);
- return SkBmpDecoder::IsBmp(data->data(), data->size()) ||
- SkGifDecoder::IsGif(data->data(), data->size()) ||
-- SkPngRustDecoder::IsPng(data->data(), data->size()) ||
-+ SkPngDecoder::IsPng(data->data(), data->size()) ||
- SkJpegDecoder::IsJpeg(data->data(), data->size()) ||
- SkWebpDecoder::IsWebp(data->data(), data->size());
- }
-@@ -202,8 +202,8 @@ sk_sp<SkImage> DeserializeImage(const vo
- codec->getInfo().makeAlphaType(kPremul_SkAlphaType);
- return std::get<0>(codec->getImage(targetInfo));
- };
-- if (SkPngRustDecoder::IsPng(bytes, length)) {
-- return get_image(SkPngRustDecoder::Decode(
-+ if (SkPngDecoder::IsPng(bytes, length)) {
-+ return get_image(SkPngDecoder::Decode(
- std::make_unique<SkMemoryStream>(std::move(data)), nullptr));
- }
- if (SkBmpDecoder::IsBmp(bytes, length)) {
---- a/content/child/font_data/font_data_manager.cc
-+++ b/content/child/font_data/font_data_manager.cc
-@@ -233,14 +233,7 @@ sk_sp<SkTypeface> FontDataManager::onMak
- // Chromium currently always sets ENABLE_FREETYPE, but nonetheless allow
- // falling back to fontations if the param is set to freetype but freetype
- // isn't enabled.
--#if BUILDFLAG(ENABLE_FREETYPE)
-- if (features::kFontDataServiceTypefaceType.Get() ==
-- features::FontDataServiceTypefaceType::kFreetype) {
- return custom_fnt_mgr_->makeFromStream(std::move(stream), args);
-- }
--#endif
--
-- return SkTypeface_Make_Fontations(std::move(stream), args);
- }
-
- sk_sp<SkTypeface> FontDataManager::onMakeFromFile(const char path[],
---- a/skia/BUILD.gn
-+++ b/skia/BUILD.gn
-@@ -69,11 +69,9 @@ config("skia_config") {
- # `third_party/skia/BUILD.gn`'s `png_decode_rust` and `png_encode_rust`
- # targets.
- "SK_CODEC_DECODES_PNG",
-- "SK_CODEC_DECODES_PNG_WITH_RUST",
-+ "SK_CODEC_DECODES_PNG_WITH_LIBPNG",
- "SK_CODEC_ENCODES_PNG",
-- "SK_CODEC_ENCODES_PNG_WITH_RUST",
--
-- "SK_CODEC_DECODES_BMP_WITH_RUST",
-+ "SK_CODEC_ENCODES_PNG_WITH_LIBPNG",
- ]
-
- include_dirs = [
-@@ -169,14 +167,6 @@ config("skia_library_config") {
- defines += [ "SKCMS_DISABLE_SKX=1" ]
- }
-
-- defines += [
-- "SK_DISABLE_LEGACY_INIT_DECODERS",
-- "SK_DISABLE_LEGACY_PNG_WRITEBUFFER",
-- ]
--
-- if (use_blink) {
-- defines += [ "SK_TYPEFACE_FACTORY_FONTATIONS" ]
-- }
- if (use_blink && !use_system_freetype) {
- defines += [ "SK_FREETYPE_MINIMUM_RUNTIME_VERSION_IS_BUILD_VERSION" ]
- }
-@@ -335,9 +325,8 @@ component("skia") {
- public += skia_utils_chromium
- public += skia_discardable_memory_chromium
- public += skia_codec_public
-- public += skia_codec_rust_png_public
- public += skia_encode_public
-- public += skia_encode_rust_png_public
-+ public += skia_encode_png_public
- public += skia_encode_webp_public
-
- # The imported Skia gni source paths are made absolute by gn.
-@@ -347,12 +336,12 @@ component("skia") {
- sources += skia_sksl_core_module_sources
- sources += skia_codec_shared
- sources += skia_codec_png_base
-- sources += skia_codec_rust_png
-+ sources += skia_codec_libpng_srcs
- sources += skia_utils_private
- sources += skia_xps_sources
- sources += skia_encode_srcs
- sources += skia_encode_png_base
-- sources += skia_encode_rust_png_srcs
-+ sources += skia_encode_libpng_srcs
- sources += skia_encode_webp_srcs
-
- sources += [
-@@ -414,8 +403,6 @@ component("skia") {
- public += skia_ports_fontmgr_empty_public
- }
- sources += skia_ports_typeface_proxy_sources
-- sources += skia_ports_typeface_fontations_sources
-- sources += skia_ports_fontmgr_fontations_sources
-
- # Fontations Rust/C++ bridge interfaces.
- deps += [
-@@ -646,7 +633,6 @@ source_set("rust_common_ffi_cpp") {
- public_deps = [
- ":skia_core_and_effects",
- ":skia_core_public_headers",
-- "//build/rust:cxx_cppdeps",
- ]
- configs -= [ "//build/config/compiler:chromium_code" ]
- configs += [
-@@ -714,9 +700,7 @@ source_set("rust_bmp_ffi_cpp") {
- public_deps = [
- ":rust_common_ffi_cpp",
- ":skia_core_public_headers",
-- "//build/rust:cxx_cppdeps",
- ]
-- deps = [ ":rust_bmp_ffi_cxx_generated_gen" ]
- check_includes =
- false # Logically part of skia, but split out for build reasons
- configs -= [ "//build/config/compiler:chromium_code" ]
---- a/skia/ext/codec_utils.cc
-+++ b/skia/ext/codec_utils.cc
-@@ -7,9 +7,9 @@
- #include "base/base64.h"
- #include "skia/ext/skia_utils_base.h"
- #include "third_party/skia/include/codec/SkCodec.h"
--#include "third_party/skia/include/codec/SkPngRustDecoder.h"
-+#include "third_party/skia/include/codec/SkPngDecoder.h"
- #include "third_party/skia/include/core/SkData.h"
--#include "third_party/skia/include/encode/SkPngRustEncoder.h"
-+#include "third_party/skia/include/encode/SkPngEncoder.h"
-
- namespace skia {
-
-@@ -18,28 +18,26 @@ namespace {
- sk_sp<SkData> EncodePngAsSkData(
- GrDirectContext* context,
- const SkImage* src,
-- SkPngRustEncoder::CompressionLevel compression_level) {
-- const SkPngRustEncoder::Options options = {.fCompressionLevel =
-- compression_level};
-- return SkPngRustEncoder::Encode(context, src, options);
-+ int zlib_compression_level) {
-+ const SkPngEncoder::Options options = {.fZLibLevel =
-+ zlib_compression_level};
-+ return SkPngEncoder::Encode(context, src, options);
- }
-
- } // namespace
-
- sk_sp<SkData> EncodePngAsSkData(const SkPixmap& src) {
-- const SkPngRustEncoder::Options kDefaultOptions = {};
-- return SkPngRustEncoder::Encode(src, kDefaultOptions);
-+ const SkPngEncoder::Options kDefaultOptions = {};
-+ return SkPngEncoder::Encode(src, kDefaultOptions);
- }
-
- sk_sp<SkData> EncodePngAsSkData(GrDirectContext* context, const SkImage* src) {
-- return EncodePngAsSkData(context, src,
-- SkPngRustEncoder::CompressionLevel::kMedium);
-+ return EncodePngAsSkData(context, src, 6);
- }
-
- sk_sp<SkData> FastEncodePngAsSkData(GrDirectContext* context,
- const SkImage* src) {
-- return EncodePngAsSkData(context, src,
-- SkPngRustEncoder::CompressionLevel::kLow);
-+ return EncodePngAsSkData(context, src, 1);
- }
-
- std::string EncodePngAsDataUri(const SkPixmap& src) {
-@@ -52,7 +50,7 @@ std::string EncodePngAsDataUri(const SkP
- }
-
- void EnsurePNGDecoderRegistered() {
-- SkCodecs::Register(SkPngRustDecoder::Decoder());
-+ SkCodecs::Register(SkPngDecoder::Decoder());
- }
-
- } // namespace skia
---- a/skia/ext/font_utils.cc
-+++ b/skia/ext/font_utils.cc
-@@ -29,6 +29,7 @@
- #include "third_party/skia/include/ports/SkFontConfigInterface.h"
- #include "third_party/skia/include/ports/SkFontMgr_FontConfigInterface.h"
- #include "third_party/skia/include/ports/SkFontScanner_Fontations.h"
-+#include "third_party/skia/include/ports/SkFontScanner_FreeType.h"
- #endif
-
- #if BUILDFLAG(IS_FUCHSIA)
-@@ -85,9 +86,7 @@ static sk_sp<SkFontMgr> fontmgr_factory(
- return SkFontMgr_New_CoreText(nullptr);
- #elif BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
- sk_sp<SkFontConfigInterface> fci(SkFontConfigInterface::RefGlobal());
-- return fci ? SkFontMgr_New_FCI(std::move(fci),
-- SkFontScanner_Make_Fontations())
-- : nullptr;
-+ return fci ? SkFontMgr_New_FCI(std::move(fci),SkFontScanner_Make_FreeType()) : nullptr;
- #elif BUILDFLAG(IS_FUCHSIA)
- fuchsia::fonts::ProviderSyncPtr provider;
- base::ComponentContextForProcess()->svc()->Connect(provider.NewRequest());
---- a/third_party/blink/renderer/core/BUILD.gn
-+++ b/third_party/blink/renderer/core/BUILD.gn
-@@ -190,6 +190,7 @@ source_set("prerequisites") {
- "//third_party/blink/renderer/core/probe:generated",
- "//third_party/blink/renderer/platform",
- "//third_party/icu",
-+ "//third_party/libpng",
- "//third_party/libwebp",
- "//third_party/libxml",
- "//third_party/libxslt",
-@@ -375,6 +376,7 @@ component("core") {
- "//third_party/blink/renderer/core/xml:xpath_generated",
- "//third_party/blink/renderer/platform",
- "//third_party/blink/renderer/platform/wtf",
-+ "//third_party/libpng",
- "//third_party/re2",
- "//ui/accessibility:ax_base",
- "//ui/base",
---- a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
-+++ b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
-@@ -33,7 +33,7 @@
- #include "third_party/blink/renderer/platform/wtf/text/base64.h"
- #include "third_party/blink/renderer/platform/wtf/text/strcat.h"
- #include "third_party/skia/include/core/SkSurface.h"
--#include "third_party/skia/include/encode/SkPngRustEncoder.h"
-+#include "third_party/skia/include/encode/SkPngEncoder.h"
-
- namespace blink {
-
-@@ -527,8 +527,10 @@ bool CanvasAsyncBlobCreator::InitializeE
- // TODO(zakerinasab): Progressive encoding on webp image formats
- // (crbug.com/571399)
- DCHECK_EQ(kMimeTypePng, mime_type_);
-- encoder_ = ImageEncoder::Create(&encoded_image_, src_data_,
-- SkPngRustEncoder::CompressionLevel::kLow);
-+ SkPngEncoder::Options options;
-+ options.fFilterFlags = SkPngEncoder::FilterFlag::kSub;
-+ options.fZLibLevel = 3;
-+ encoder_ = ImageEncoder::Create(&encoded_image_, src_data_, options);
- }
-
- return encoder_.get();
---- a/third_party/blink/renderer/platform/BUILD.gn
-+++ b/third_party/blink/renderer/platform/BUILD.gn
-@@ -236,6 +236,7 @@ group("blink_platform_public_deps") {
- "//third_party/blink/renderer/platform/network:make_generated",
- "//third_party/blink/renderer/platform/wtf",
- "//third_party/boringssl",
-+ "//third_party/libpng",
- "//third_party/libwebp",
- "//third_party/ots",
- "//ui/gfx/animation/keyframe",
---- a/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.cc
-+++ b/third_party/blink/renderer/platform/fonts/skia/sktypeface_factory.cc
-@@ -27,7 +27,7 @@ sk_sp<SkTypeface> SkTypeface_Factory::Fr
- SkFontConfigInterface::FontIdentity font_identity;
- font_identity.fID = config_id;
- font_identity.fTTCIndex = ttc_index;
-- return fci->makeTypeface(font_identity, SkFontMgr_New_Fontations_Empty());
-+ return fci->makeTypeface(font_identity, skia::DefaultFontMgr());
- #else
- NOTREACHED();
- #endif
-@@ -39,8 +39,7 @@ sk_sp<SkTypeface> SkTypeface_Factory::Fr
- int ttc_index) {
- #if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_FUCHSIA) && \
- !BUILDFLAG(IS_APPLE)
-- return SkFontMgr_New_Fontations_Empty()->makeFromFile(filename.c_str(),
-- ttc_index);
-+ return skia::DefaultFontMgr()->makeFromFile(filename.c_str(), ttc_index);
- #else
- NOTREACHED();
- #endif
---- a/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc
-+++ b/third_party/blink/renderer/platform/fonts/web_font_typeface_factory.cc
-@@ -11,7 +11,6 @@
- #include "third_party/blink/renderer/platform/fonts/font_cache.h"
- #include "third_party/blink/renderer/platform/fonts/opentype/font_format_check.h"
- #include "third_party/skia/include/core/SkTypeface.h"
--#include "third_party/skia/include/ports/SkTypeface_fontations.h"
-
- #if BUILDFLAG(IS_WIN)
- #include "third_party/blink/renderer/platform/fonts/win/dwrite_font_format_support.h"
-@@ -37,11 +36,7 @@ bool IsWin() {
- }
-
- bool IsFreeTypeSystemRasterizer() {
--#if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_APPLE)
- return true;
--#else
-- return false;
--#endif
- }
-
- sk_sp<SkTypeface> MakeTypefaceDefaultFontMgr(sk_sp<SkData> data) {
-@@ -49,13 +44,7 @@ sk_sp<SkTypeface> MakeTypefaceDefaultFon
- return skia::DefaultFontMgr()->makeFromData(data, 0);
- #endif
-
--#if BUILDFLAG(IS_APPLE)
- return skia::DefaultFontMgr()->makeFromData(data, 0);
--#endif
--
--#if !(BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE))
-- return SkTypeface_Make_Fontations(data, SkFontArguments());
--#endif
- }
-
- #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE)
-@@ -64,10 +53,6 @@ sk_sp<SkTypeface> MakeTypefaceFallback(s
- }
- #endif
-
--sk_sp<SkTypeface> MakeTypefaceFontations(sk_sp<SkData> data) {
-- return SkTypeface_Make_Fontations(data, SkFontArguments());
--}
--
- sk_sp<SkTypeface> MakeVariationsTypeface(
- sk_sp<SkData> data,
- const WebFontTypefaceFactory::FontInstantiator& instantiator) {
-@@ -87,9 +72,6 @@ sk_sp<SkTypeface> MakeSbixTypeface(
- const WebFontTypefaceFactory::FontInstantiator& instantiator) {
- // If we're on a OS with FreeType as backend, or on Windows, where we used to
- // use FreeType for SBIX, switch to Fontations for SBIX.
-- if (IsFreeTypeSystemRasterizer() || IsWin()) {
-- return instantiator.make_fontations(data);
-- }
-
- // Remaining case, on Mac, CoreText can handle creating SBIX fonts.
- return instantiator.make_system(data);
-@@ -98,29 +80,21 @@ sk_sp<SkTypeface> MakeSbixTypeface(
- sk_sp<SkTypeface> MakeColrV0Typeface(
- sk_sp<SkData> data,
- const WebFontTypefaceFactory::FontInstantiator& instantiator) {
-- if (IsWin()) {
- // On Windows Skia's DirectWrite
- // backend handles COLRv0.
- return instantiator.make_system(data);
-- }
-- return instantiator.make_fontations(data);
- }
-
- sk_sp<SkTypeface> MakeColrV0VariationsTypeface(
- sk_sp<SkData> data,
- const WebFontTypefaceFactory::FontInstantiator& instantiator) {
--#if BUILDFLAG(IS_WIN)
-- if (DWriteVersionSupportsVariations()) {
- return instantiator.make_system(data);
-- }
--#endif
-- return instantiator.make_fontations(data);
- }
-
- sk_sp<SkTypeface> MakeFontationsFallbackPreferred(
- sk_sp<SkData> data,
- const WebFontTypefaceFactory::FontInstantiator& instantiator) {
-- return instantiator.make_fontations(data);
-+ return instantiator.make_system(data);
- }
-
- } // namespace
-@@ -130,7 +104,6 @@ bool WebFontTypefaceFactory::CreateTypef
- const FontFormatCheck format_check(data);
- const FontInstantiator instantiator = {
- MakeTypefaceDefaultFontMgr,
-- MakeTypefaceFontations,
- #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE)
- MakeTypefaceFallback,
- #endif
---- a/third_party/blink/renderer/platform/graphics/canvas_hibernation_handler.cc
-+++ b/third_party/blink/renderer/platform/graphics/canvas_hibernation_handler.cc
-@@ -30,7 +30,7 @@
- #include "third_party/blink/renderer/platform/wtf/functional.h"
- #include "third_party/blink/renderer/platform/wtf/hash_set.h"
- #include "third_party/skia/include/codec/SkCodec.h"
--#include "third_party/skia/include/codec/SkPngRustDecoder.h"
-+#include "third_party/skia/include/codec/SkPngDecoder.h"
- #include "third_party/skia/include/core/SkAlphaType.h"
- #include "third_party/skia/include/core/SkData.h"
- #include "third_party/skia/include/core/SkImage.h"
-@@ -328,13 +328,12 @@ sk_sp<SkImage> CanvasHibernationHandler:
- }
- }
-
-- CHECK(SkPngRustDecoder::IsPng(png_data->data(), png_data->size()));
-+ CHECK(SkPngDecoder::IsPng(png_data->data(), png_data->size()));
-
- base::TimeTicks before = base::TimeTicks::Now();
- // Note: not discarding the encoded image.
- sk_sp<SkImage> image = nullptr;
-- std::unique_ptr<SkCodec> codec = SkPngRustDecoder::Decode(
-- std::make_unique<SkMemoryStream>(std::move(png_data)), nullptr);
-+ std::unique_ptr<SkCodec> codec = SkPngDecoder::Decode(png_data, nullptr);
- if (codec) {
- image = std::get<0>(codec->getImage());
- }
---- a/third_party/blink/renderer/platform/graphics/picture_snapshot.cc
-+++ b/third_party/blink/renderer/platform/graphics/picture_snapshot.cc
-@@ -43,6 +43,7 @@
- #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
- #include "third_party/skia/include/core/SkImage.h"
- #include "third_party/skia/include/core/SkPictureRecorder.h"
-+#include "third_party/skia/include/encode/SkPngEncoder.h"
- #include "ui/gfx/geometry/rect_f.h"
- #include "ui/gfx/geometry/size.h"
- #include "ui/gfx/geometry/skia_conversions.h"
-@@ -118,8 +119,10 @@ Vector<uint8_t> PictureSnapshot::Replay(
- bool peekResult = bitmap.peekPixels(&src);
- DCHECK(peekResult);
-
-- if (!ImageEncoder::Encode(&encoded_image, src,
-- SkPngRustEncoder::CompressionLevel::kLow)) {
-+ SkPngEncoder::Options options;
-+ options.fFilterFlags = SkPngEncoder::FilterFlag::kSub;
-+ options.fZLibLevel = 3;
-+ if (!ImageEncoder::Encode(&encoded_image, src, options)) {
- return Vector<uint8_t>();
- }
-
---- a/third_party/blink/renderer/platform/image-decoders/BUILD.gn
-+++ b/third_party/blink/renderer/platform/image-decoders/BUILD.gn
-@@ -73,6 +73,7 @@ component("image_decoders") {
- "//third_party/blink/public:blink_headers",
- "//third_party/blink/public/common:buildflags",
- "//third_party/blink/public/common:headers",
-+ "//third_party/libpng",
- "//third_party/libwebp",
- "//third_party/libyuv",
- "//ui/gfx/geometry:geometry_skia",
---- a/third_party/blink/renderer/platform/image-decoders/bmp/bmp_rust_image_decoder.cc
-+++ b/third_party/blink/renderer/platform/image-decoders/bmp/bmp_rust_image_decoder.cc
-@@ -5,7 +5,7 @@
- #include "third_party/blink/renderer/platform/image-decoders/bmp/bmp_rust_image_decoder.h"
-
- #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
--#include "third_party/skia/experimental/rust_bmp/decoder/SkBmpRustDecoder.h"
-+#include "third_party/skia/include/codec/SkBmpDecoder.h"
- #include "third_party/skia/include/core/SkStream.h"
-
- namespace blink {
-@@ -25,7 +25,7 @@ std::unique_ptr<SkCodec> BmpRustImageDec
- std::unique_ptr<SkStream> stream,
- SkCodec::Result* result) {
- std::unique_ptr<SkCodec> codec =
-- SkBmpRustDecoder::Decode(std::move(stream), result);
-+ SkBmpDecoder::Decode(std::move(stream), result);
- return codec;
- }
-
---- a/third_party/blink/renderer/platform/image-decoders/png/png_image_decoder.cc
-+++ b/third_party/blink/renderer/platform/image-decoders/png/png_image_decoder.cc
-@@ -5,7 +5,7 @@
- #include "third_party/blink/renderer/platform/image-decoders/png/png_image_decoder.h"
-
- #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
--#include "third_party/skia/include/codec/SkPngRustDecoder.h"
-+#include "third_party/skia/include/codec/SkPngDecoder.h"
- #include "third_party/skia/include/core/SkStream.h"
-
- namespace blink {
-@@ -25,7 +25,7 @@ std::unique_ptr<SkCodec> PngImageDecoder
- std::unique_ptr<SkStream> stream,
- SkCodec::Result* result) {
- std::unique_ptr<SkCodec> codec =
-- SkPngRustDecoder::Decode(std::move(stream), result);
-+ SkPngDecoder::Decode(std::move(stream), result);
- return codec;
- }
-
---- a/third_party/blink/renderer/platform/image-encoders/image_encoder.cc
-+++ b/third_party/blink/renderer/platform/image-encoders/image_encoder.cc
-@@ -27,10 +27,9 @@ bool ImageEncoder::Encode(Vector<unsigne
- bool ImageEncoder::Encode(
- Vector<unsigned char>* dst,
- const SkPixmap& src,
-- SkPngRustEncoder::CompressionLevel compression_level) {
-+ const SkPngEncoder::Options& options) {
- VectorWStream dst_stream(dst);
-- SkPngRustEncoder::Options options = {.fCompressionLevel = compression_level};
-- return SkPngRustEncoder::Encode(&dst_stream, src, options);
-+ return SkPngEncoder::Encode(&dst_stream, src, options);
- }
-
- bool ImageEncoder::Encode(Vector<unsigned char>* dst,
-@@ -59,7 +58,10 @@ bool ImageEncoder::Encode(Vector<unsigne
- return Encode(dst, src, options);
- }
- case kMimeTypePng: {
-- return Encode(dst, src, SkPngRustEncoder::CompressionLevel::kLow);
-+ SkPngEncoder::Options options;
-+ options.fFilterFlags = SkPngEncoder::FilterFlag::kSub;
-+ options.fZLibLevel = 3;
-+ return Encode(dst, src, options);
- }
- }
- }
-@@ -81,11 +83,10 @@ std::unique_ptr<ImageEncoder> ImageEncod
- std::unique_ptr<ImageEncoder> ImageEncoder::Create(
- Vector<unsigned char>* dst,
- const SkPixmap& src,
-- SkPngRustEncoder::CompressionLevel compression_level) {
-+ const SkPngEncoder::Options& options) {
- std::unique_ptr<ImageEncoder> image_encoder(new ImageEncoder(dst));
-- SkPngRustEncoder::Options options = {.fCompressionLevel = compression_level};
- image_encoder->encoder_ =
-- SkPngRustEncoder::Make(&image_encoder->dst_, src, options);
-+ SkPngEncoder::Make(&image_encoder->dst_, src, options);
- if (!image_encoder->encoder_) {
- return nullptr;
- }
---- a/third_party/blink/renderer/platform/image-encoders/image_encoder.h
-+++ b/third_party/blink/renderer/platform/image-encoders/image_encoder.h
-@@ -12,7 +12,7 @@
- #include "third_party/blink/renderer/platform/wtf/vector.h"
- #include "third_party/skia/include/core/SkStream.h"
- #include "third_party/skia/include/encode/SkJpegEncoder.h"
--#include "third_party/skia/include/encode/SkPngRustEncoder.h"
-+#include "third_party/skia/include/encode/SkPngEncoder.h"
- #include "third_party/skia/include/encode/SkWebpEncoder.h"
-
- namespace blink {
-@@ -55,7 +55,7 @@ class PLATFORM_EXPORT ImageEncoder {
-
- static bool Encode(Vector<unsigned char>* dst,
- const SkPixmap& src,
-- SkPngRustEncoder::CompressionLevel);
-+ const SkPngEncoder::Options&);
-
- static bool Encode(Vector<unsigned char>* dst,
- const SkPixmap& src,
-@@ -75,7 +75,7 @@ class PLATFORM_EXPORT ImageEncoder {
- static std::unique_ptr<ImageEncoder> Create(
- Vector<unsigned char>* dst,
- const SkPixmap& src,
-- SkPngRustEncoder::CompressionLevel);
-+ const SkPngEncoder::Options&);
-
- bool encodeRows(int numRows) { return encoder_->encodeRows(numRows); }
-
---- a/third_party/skia/BUILD.gn
-+++ b/third_party/skia/BUILD.gn
-@@ -1843,6 +1843,7 @@ skia_component("skia") {
- ":lasx",
- ":minify_sksl",
- ":ndk_images",
-+ ":png_decode_libpng",
- ":png_decode_rust",
- ":raw",
- ":rust_icc",
---- a/ui/gfx/codec/BUILD.gn
-+++ b/ui/gfx/codec/BUILD.gn
-@@ -21,6 +21,7 @@ component("codec") {
-
- deps = [
- "//skia",
-+ "//third_party/zlib",
- "//ui/gfx:gfx_skia",
- "//ui/gfx/geometry",
- ]
---- a/ui/gfx/codec/png_codec.cc
-+++ b/ui/gfx/codec/png_codec.cc
-@@ -12,11 +12,11 @@
- #include "base/metrics/histogram_macros.h"
- #include "base/notreached.h"
- #include "base/strings/string_util.h"
--#include "third_party/skia/include/codec/SkPngRustDecoder.h"
-+#include "third_party/skia/include/codec/SkPngDecoder.h"
- #include "third_party/skia/include/core/SkBitmap.h"
- #include "third_party/skia/include/core/SkColorType.h"
- #include "third_party/skia/include/core/SkUnPreMultiply.h"
--#include "third_party/skia/include/encode/SkPngRustEncoder.h"
-+#include "third_party/skia/include/encode/SkPngEncoder.h"
- #include "ui/gfx/codec/vector_wstream.h"
- #include "ui/gfx/geometry/size.h"
-
-@@ -34,7 +34,7 @@ namespace {
-
- std::unique_ptr<SkCodec> CreatePngDecoder(std::unique_ptr<SkStream> stream,
- SkCodec::Result* result) {
-- return SkPngRustDecoder::Decode(std::move(stream), result);
-+ return SkPngDecoder::Decode(std::move(stream), result);
- }
-
- struct PreparationOutput {
-@@ -170,7 +170,7 @@ SkBitmap PNGCodec::Decode(base::span<con
-
- namespace {
-
--void AddComments(SkPngRustEncoder::Options& options,
-+void AddComments(SkPngEncoder::Options& options,
- const std::vector<PNGCodec::Comment>& comments) {
- std::vector<const char*> comment_pointers;
- std::vector<size_t> comment_sizes;
-@@ -188,14 +188,19 @@ void AddComments(SkPngRustEncoder::Optio
- std::optional<std::vector<uint8_t>> EncodeSkPixmap(
- const SkPixmap& src,
- const std::vector<PNGCodec::Comment>& comments,
-- SkPngRustEncoder::CompressionLevel compression_level) {
-+ int zlib_level,
-+ bool disable_filters) {
- std::vector<uint8_t> output;
- VectorWStream dst(&output);
-
-- SkPngRustEncoder::Options options;
-+ SkPngEncoder::Options options;
- AddComments(options, comments);
-- options.fCompressionLevel = compression_level;
-- if (!SkPngRustEncoder::Encode(&dst, src, options)) {
-+ options.fZLibLevel = zlib_level;
-+ if (disable_filters) {
-+ options.fFilterFlags = SkPngEncoder::FilterFlag::kNone;
-+ }
-+
-+ if (!SkPngEncoder::Encode(&dst, src, options)) {
- return std::nullopt;
- }
-
-@@ -206,7 +211,8 @@ std::optional<std::vector<uint8_t>> Enco
- const SkPixmap& src,
- bool discard_transparency,
- const std::vector<PNGCodec::Comment>& comments,
-- SkPngRustEncoder::CompressionLevel compression_level) {
-+ int zlib_level,
-+ bool disable_filters) {
- if (discard_transparency) {
- SkImageInfo opaque_info = src.info().makeAlphaType(kOpaque_SkAlphaType);
- SkBitmap copy;
-@@ -223,7 +229,7 @@ std::optional<std::vector<uint8_t>> Enco
- src.readPixels(opaque_info.makeAlphaType(kUnpremul_SkAlphaType),
- opaque_pixmap.writable_addr(), opaque_pixmap.rowBytes());
- DCHECK(success);
-- return EncodeSkPixmap(opaque_pixmap, comments, compression_level);
-+ return EncodeSkPixmap(opaque_pixmap, comments, zlib_level, disable_filters);
- }
-
- // If the image's pixels are all opaque, encode the PNG as opaque, regardless
-@@ -231,23 +237,24 @@ std::optional<std::vector<uint8_t>> Enco
- if (src.info().alphaType() != kOpaque_SkAlphaType && src.computeIsOpaque()) {
- SkPixmap opaque_pixmap{src.info().makeAlphaType(kOpaque_SkAlphaType),
- src.addr(), src.rowBytes()};
-- return EncodeSkPixmap(opaque_pixmap, comments, compression_level);
-+ return EncodeSkPixmap(opaque_pixmap, comments, zlib_level, disable_filters);
- }
-
- // Encode the PNG without any conversions.
-- return EncodeSkPixmap(src, comments, compression_level);
-+ return EncodeSkPixmap(src, comments, zlib_level, disable_filters);
- }
-
--std::optional<std::vector<uint8_t>> EncodeSkBitmap(
-- const SkBitmap& input,
-- bool discard_transparency,
-- SkPngRustEncoder::CompressionLevel compression_level) {
-+std::optional<std::vector<uint8_t>> EncodeSkBitmap(const SkBitmap& input,
-+ bool discard_transparency,
-+ int zlib_level,
-+ bool disable_filters) {
- SkPixmap src;
- if (!input.peekPixels(&src)) {
- return std::nullopt;
- }
- return EncodeSkPixmap(src, discard_transparency,
-- std::vector<PNGCodec::Comment>(), compression_level);
-+ std::vector<PNGCodec::Comment>(), zlib_level,
-+ disable_filters);
- }
-
- } // namespace
-@@ -278,21 +285,21 @@ std::optional<std::vector<uint8_t>> PNGC
- SkImageInfo::Make(size.width(), size.height(), colorType, alphaType);
- SkPixmap src(info, input, row_byte_width);
- return EncodeSkPixmap(src, discard_transparency, comments,
-- SkPngRustEncoder::CompressionLevel::kMedium);
-+ 6, /*disable_filters=*/false);
- }
-
- std::optional<std::vector<uint8_t>> PNGCodec::EncodeBGRASkBitmap(
- const SkBitmap& input,
- bool discard_transparency) {
-- return EncodeSkBitmap(input, discard_transparency,
-- SkPngRustEncoder::CompressionLevel::kMedium);
-+ return EncodeSkBitmap(input, discard_transparency, 6,
-+ /*disable_filters=*/false);
- }
-
- std::optional<std::vector<uint8_t>> PNGCodec::FastEncodeBGRASkBitmap(
- const SkBitmap& input,
- bool discard_transparency) {
-- return EncodeSkBitmap(input, discard_transparency,
-- SkPngRustEncoder::CompressionLevel::kLow);
-+ return EncodeSkBitmap(input, discard_transparency, 1,
-+ /*disable_filters=*/true);
- }
-
- PNGCodec::Comment::Comment(const std::string& k, const std::string& t)
diff --git a/www-client/ungoogled-chromium/files/chromium-145-oauth2-client-switches.patch b/www-client/ungoogled-chromium/files/chromium-145-oauth2-client-switches.patch
deleted file mode 100644
index 31fd8baf2f6d..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-145-oauth2-client-switches.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From d5ebfd72adff704c046170cf7ab798f5f7415dd5 Mon Sep 17 00:00:00 2001
-From: FoldCat <akane@maidagency.org>
-Date: Tue, 4 Mar 2025 13:09:59 +0800
-Subject: [PATCH] work around dead oauth2 credentials, correcting the previous bad patch
-
-Google doesn't let us bake in OAuth2 credentials, and for some time,
-Google sign-in has been broken. Arch dealt with this in March, and so
-did we to some degree, but in the last few months, our sign-in
-credentials have been broken. It appears that we actually did remove API
-credentials in March around Chrome 89, but they got added back, perhaps
-when rotating newer versions to replace older versions. Work around this
-by following Arch's lead: we remove the predefined credentials, as
-before, but also we patch Chromium so that people can use their own
-easily, using Arch's patch for that.
----
- google_apis/api_key_cache.cc | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/google_apis/api_key_cache.cc
-+++ b/google_apis/api_key_cache.cc
-@@ -235,14 +235,14 @@ ApiKeyCache::ApiKeyCache(const DefaultAp
-
- std::string default_client_id = CalculateKeyValue(
- default_api_keys.google_default_client_id,
-- STRINGIZE_NO_EXPANSION(GOOGLE_DEFAULT_CLIENT_ID), std::string(), nullptr,
-+ STRINGIZE_NO_EXPANSION(GOOGLE_DEFAULT_CLIENT_ID), std::string(), ::switches::kOAuth2ClientID,
- std::string(), environment.get(), command_line, gaia_config,
- default_api_keys.allow_override_via_environment,
- default_api_keys.allow_unset_values);
- std::string default_client_secret = CalculateKeyValue(
- default_api_keys.google_default_client_secret,
- STRINGIZE_NO_EXPANSION(GOOGLE_DEFAULT_CLIENT_SECRET), std::string(),
-- nullptr, std::string(), environment.get(), command_line, gaia_config,
-+ ::switches::kOAuth2ClientSecret, std::string(), environment.get(), command_line, gaia_config,
- default_api_keys.allow_override_via_environment,
- default_api_keys.allow_unset_values);
-
diff --git a/www-client/ungoogled-chromium/files/chromium-146-glibc-2.43.patch b/www-client/ungoogled-chromium/files/chromium-146-glibc-2.43.patch
deleted file mode 100644
index ce416be6f982..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-146-glibc-2.43.patch
+++ /dev/null
@@ -1,9 +0,0 @@
---- ./sandbox/linux/system_headers/linux_seccomp.h
-+++ ./sandbox/linux/system_headers/linux_seccomp.h
-@@ -7,6 +7,7 @@
-
- #include <stdint.h>
- #include <sys/ioctl.h>
-+#include <signal.h>
-
- #include "build/build_config.h"
diff --git a/www-client/ungoogled-chromium/files/chromium-147-gcc.patch b/www-client/ungoogled-chromium/files/chromium-147-gcc.patch
deleted file mode 100644
index 0cbaeba489f5..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-147-gcc.patch
+++ /dev/null
@@ -1,827 +0,0 @@
---- a/base/containers/fixed_flat_set.h
-+++ b/base/containers/fixed_flat_set.h
-@@ -88,7 +88,7 @@ using fixed_flat_set = base::flat_set<Ke
- // constexpr auto kSet = base::MakeFixedFlatSet<std::string_view>(
- // base::sorted_unique, {"bar", "baz", "foo", "qux"});
- template <class Key, size_t N, class Compare = std::less<>>
--consteval fixed_flat_set<Key, N, Compare> MakeFixedFlatSet(
-+constexpr fixed_flat_set<Key, N, Compare> MakeFixedFlatSet(
- sorted_unique_t,
- std::common_type_t<Key> (&&data)[N],
- const Compare& comp = Compare()) {
-@@ -117,7 +117,7 @@ consteval fixed_flat_set<Key, N, Compare
- // Note: Wrapping `Key` in `std::common_type_t` below requires callers to
- // explicitly specify `Key`, which is desired here.
- template <class Key, class Compare = std::less<>, size_t N>
--consteval fixed_flat_set<Key, N, Compare> MakeFixedFlatSet(
-+constexpr fixed_flat_set<Key, N, Compare> MakeFixedFlatSet(
- std::common_type_t<Key> (&&data)[N],
- const Compare& comp = Compare()) {
- std::ranges::sort(data, comp);
---- a/base/debug/proc_maps_linux.h
-+++ b/base/debug/proc_maps_linux.h
-@@ -8,6 +8,7 @@
- #include <stdint.h>
-
- #include <optional>
-+#include <cstring>
- #include <string>
- #include <string_view>
- #include <vector>
---- a/build/config/compiler/BUILD.gn
-+++ b/build/config/compiler/BUILD.gn
-@@ -2109,6 +2109,14 @@ config("default_warnings") {
- ldflags = []
- configs = []
-
-+ if (!is_clang) {
-+ # Disable warnings that are known to fail 'gcc' build.
-+ cflags_cc += [ "-Wno-changes-meaning" ]
-+
-+ # Reduce g++ memory usage at the cost of less verbose error messages.
-+ cflags_cc += [ "-ftrack-macro-expansion=0" ]
-+ }
-+
- if (is_win) {
- if (fatal_linker_warnings) {
- arflags = [ "/WX" ]
---- a/cc/tiles/gpu_image_decode_cache.cc
-+++ b/cc/tiles/gpu_image_decode_cache.cc
-@@ -896,7 +896,7 @@ GpuImageDecodeCache::ImageData::ImageDat
- last_use = base::TimeTicks::Now();
- }
- if (speculative_decode) {
-- speculative_decode_usage_stats_.emplace();
-+ speculative_decode_usage_stats_.emplace(SpeculativeDecodeUsageStats{});
- speculative_decode_usage_stats_->speculative_decode_mip_level =
- upload_scale_mip_level;
- TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("loading"),
---- a/chrome/browser/ai/ai_language_model.cc
-+++ b/chrome/browser/ai/ai_language_model.cc
-@@ -534,7 +534,7 @@ AILanguageModel::GetEnabledLanguageBaseC
- base::flat_set<std::string>
- AILanguageModel::GetDefaultSupportedLanguageBaseCodes() {
- // TODO(crbug.com/394841624): Get supported languages from the model config.
-- auto kSupportedBaseLanguages =
-+ constexpr auto kSupportedBaseLanguages =
- base::MakeFixedFlatSet<std::string_view>({"en", "ja", "es"});
- return base::flat_set<std::string>(kSupportedBaseLanguages.begin(),
- kSupportedBaseLanguages.end());
---- a/chrome/browser/ai/ai_rewriter.cc
-+++ b/chrome/browser/ai/ai_rewriter.cc
-@@ -123,7 +123,7 @@ AIRewriter::GetEnabledLanguageBaseCodes(
- // static
- base::flat_set<std::string> AIRewriter::GetDefaultSupportedLanguageBaseCodes() {
- // TODO(crbug.com/394841624): Get supported languages from the model config.
-- auto kSupportedBaseLanguages =
-+ constexpr auto kSupportedBaseLanguages =
- base::MakeFixedFlatSet<std::string_view>({"en", "ja", "es"});
- return base::flat_set<std::string>(kSupportedBaseLanguages.begin(),
- kSupportedBaseLanguages.end());
---- a/chrome/browser/ai/ai_summarizer.cc
-+++ b/chrome/browser/ai/ai_summarizer.cc
-@@ -120,7 +120,7 @@ AISummarizer::GetEnabledLanguageBaseCode
- base::flat_set<std::string>
- AISummarizer::GetDefaultSupportedLanguageBaseCodes() {
- // TODO(crbug.com/394841624): Get supported languages from the model config.
-- auto kSupportedBaseLanguages =
-+ constexpr auto kSupportedBaseLanguages =
- base::MakeFixedFlatSet<std::string_view>({"en", "ja", "es"});
- return base::flat_set<std::string>(kSupportedBaseLanguages.begin(),
- kSupportedBaseLanguages.end());
---- a/chrome/browser/ai/ai_writer.cc
-+++ b/chrome/browser/ai/ai_writer.cc
-@@ -114,7 +114,7 @@ AIWriter::GetEnabledLanguageBaseCodes()
- // static
- base::flat_set<std::string> AIWriter::GetDefaultSupportedLanguageBaseCodes() {
- // TODO(crbug.com/394841624): Get supported languages from the model config.
-- auto kSupportedBaseLanguages =
-+ constexpr auto kSupportedBaseLanguages =
- base::MakeFixedFlatSet<std::string_view>({"en", "ja", "es"});
- return base::flat_set<std::string>(kSupportedBaseLanguages.begin(),
- kSupportedBaseLanguages.end());
---- a/chrome/browser/ui/views/frame/contents_web_view.h
-+++ b/chrome/browser/ui/views/frame/contents_web_view.h
-@@ -14,6 +14,8 @@
- #include "ui/base/metadata/metadata_header_macros.h"
- #include "ui/gfx/geometry/rounded_corners_f.h"
- #include "ui/views/controls/webview/webview.h"
-+#include "chrome/browser/ui/views/status_bubble_views.h"
-+#include "chrome/browser/ui/views/frame/web_contents_close_handler.h"
-
- class StatusBubbleViews;
- class WebContentsCloseHandler;
---- a/chrome/browser/ui/views/frame/vertical_tab_strip_region_view.cc
-+++ b/chrome/browser/ui/views/frame/vertical_tab_strip_region_view.cc
-@@ -291,10 +291,12 @@ gfx::Size VerticalTabStripRegionView::Ca
- size.set_width(
- kCollapsedWidth +
- (resize_animation_.IsShowing()
-- ? std::floor<double>
-- : std::ceil<double>)((target_collapse_state_.uncollapsed_width -
-+ ? std::floor((target_collapse_state_.uncollapsed_width -
- kCollapsedWidth) *
-- resize_animation_.GetCurrentValue()));
-+ resize_animation_.GetCurrentValue())
-+ : std::ceil((target_collapse_state_.uncollapsed_width -
-+ kCollapsedWidth) *
-+ resize_animation_.GetCurrentValue())));
- } else {
- size.set_width(target_collapse_state_.collapsed
- ? kCollapsedWidth
---- a/chrome/browser/ui/webui/history/browsing_history_handler.cc
-+++ b/chrome/browser/ui/webui/history/browsing_history_handler.cc
-@@ -173,7 +173,7 @@ std::pair<std::string, std::string> SetH
- title_to_set.resize(kShortTitleLength);
- }
-
-- return std::make_tuple(entry.url.spec(), base::UTF16ToUTF8(title_to_set));
-+ return std::make_pair(entry.url.spec(), base::UTF16ToUTF8(title_to_set));
- }
-
- // Helper function to check if entry is present in local database (local-side
---- a/components/affiliations/core/browser/lookup_affiliation_response_parser.h
-+++ b/components/affiliations/core/browser/lookup_affiliation_response_parser.h
-@@ -7,6 +7,7 @@
-
- #include <stddef.h>
-
-+#include <map>
- #include <vector>
-
- #include "components/affiliations/core/browser/affiliation_api.pb.h"
---- a/components/autofill/core/browser/geo/country_data.h
-+++ b/components/autofill/core/browser/geo/country_data.h
-@@ -316,13 +316,16 @@ inline constexpr auto kCountryAddressImp
- {"ZM", ADDRESS_REQUIRES_LINE1_CITY},
- {"ZW", ADDRESS_REQUIRES_LINE1_CITY}});
-
--// Compute at compile-time a base::fixed_flat_set<std::string_view> containing
--// all the country codes used as keys in kCountryAddressImportRequirementsData
--constexpr base::fixed_flat_set<std::string_view, 252u> GetCountryCodes() {
-- return []<size_t... I>(std::index_sequence<I...>) {
-- return base::MakeFixedFlatSet<std::string_view>(
-- {kCountryAddressImportRequirementsData.begin()[I].first...});
-- }(std::make_index_sequence<kCountryAddressImportRequirementsData.size()>());
-+inline const base::flat_set<std::string_view>& GetCountryCodes() {
-+ static const base::flat_set<std::string_view> codes = []() {
-+ base::flat_set<std::string_view> result;
-+ result.reserve(kCountryAddressImportRequirementsData.size());
-+ for (const auto& [code, _] : kCountryAddressImportRequirementsData) {
-+ result.insert(code);
-+ }
-+ return result;
-+ }();
-+ return codes;
- }
-
- // A singleton class that encapsulates a map from country codes to country data.
---- a/components/autofill/core/browser/geo/generate_country_native_names.cc
-+++ b/components/autofill/core/browser/geo/generate_country_native_names.cc
-@@ -84,7 +84,7 @@ void WriteCountryNativeNamesInlFile(
- "namespace {\n\n"
- "constexpr auto kCountryNativeNames = "
- "base::MakeFixedFlatMap<std::u16string_view, "
-- "std::string>({\n";
-+ "const char*>({\n";
-
- for (const auto& [native_name, country_code] : country_native_names) {
- inl_file_content += " {u\"" + base::UTF16ToUTF8(native_name) + "\", \"" +
---- a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc
-+++ b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc
-@@ -179,7 +179,8 @@ std::unique_ptr<syncer::DataBatch> Autof
- return nullptr;
- }
-
-- absl::flat_hash_set<std::string> keys_set(std::from_range, storage_keys);
-+ absl::flat_hash_set<std::string> keys_set;
-+ keys_set.insert(storage_keys.begin(), storage_keys.end());
- auto batch = std::make_unique<syncer::MutableDataBatch>();
- for (const AutofillProfile& entry : entries) {
- std::string key = GetStorageKeyFromAutofillProfile(entry);
---- a/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.cc
-+++ b/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.cc
-@@ -420,7 +420,8 @@ AutocompleteSyncBridge::AutocompleteSync
- return nullptr;
- }
-
-- absl::flat_hash_set<std::string> keys_set(std::from_range, storage_keys);
-+ absl::flat_hash_set<std::string> keys_set;
-+ keys_set.insert(storage_keys.begin(), storage_keys.end());
- auto batch = std::make_unique<MutableDataBatch>();
- for (const AutocompleteEntry& entry : entries) {
- std::string key = GetStorageKeyFromModel(entry.key());
---- a/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.cc
-+++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.cc
-@@ -175,8 +175,8 @@ std::unique_ptr<syncer::DataBatch>
- AutofillWalletCredentialSyncBridge::GetDataForCommit(
- StorageKeyList storage_keys) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-- absl::flat_hash_set<std::string> storage_keys_set(std::from_range,
-- storage_keys);
-+ absl::flat_hash_set<std::string> storage_keys_set;
-+ storage_keys_set.insert(storage_keys.begin(), storage_keys.end());
- std::vector<std::unique_ptr<ServerCvc>> filtered_server_cvc_list;
- for (std::unique_ptr<ServerCvc>& server_cvc :
- GetAutofillTable()->GetAllServerCvcs()) {
---- a/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.cc
-+++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.cc
-@@ -380,8 +380,8 @@ std::unique_ptr<syncer::DataBatch>
- AutofillWalletMetadataSyncBridge::GetDataForCommit(
- StorageKeyList storage_keys) {
- // Build a set out of the list to allow quick lookup.
-- absl::flat_hash_set<std::string> storage_keys_set(std::from_range,
-- storage_keys);
-+ absl::flat_hash_set<std::string> storage_keys_set;
-+ storage_keys_set.insert(storage_keys.begin(), storage_keys.end());
- return GetDataImpl(std::move(storage_keys_set));
- }
-
---- a/components/autofill/core/browser/webdata/valuables/valuable_metadata_sync_bridge.cc
-+++ b/components/autofill/core/browser/webdata/valuables/valuable_metadata_sync_bridge.cc
-@@ -249,7 +249,8 @@ std::unique_ptr<syncer::DataBatch> Valua
- StorageKeyList storage_keys) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- auto batch = std::make_unique<syncer::MutableDataBatch>();
-- absl::flat_hash_set<std::string> keys_set(std::from_range, storage_keys);
-+ absl::flat_hash_set<std::string> keys_set;
-+ keys_set.insert(storage_keys.begin(), storage_keys.end());
- std::unique_ptr<syncer::DataBatch> all_data = GetAllData();
- while (all_data->HasNext()) {
- syncer::KeyAndData item = all_data->Next();
---- a/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.cc
-+++ b/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.cc
-@@ -372,7 +372,8 @@ std::unique_ptr<syncer::DataBatch> Valua
- StorageKeyList storage_keys) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- auto batch = std::make_unique<syncer::MutableDataBatch>();
-- absl::flat_hash_set<std::string> keys_set(std::from_range, storage_keys);
-+ absl::flat_hash_set<std::string> keys_set;
-+ keys_set.insert(storage_keys.begin(), storage_keys.end());
- std::unique_ptr<syncer::DataBatch> all_data = GetData();
- while (all_data->HasNext()) {
- syncer::KeyAndData item = all_data->Next();
---- a/components/compose/core/browser/config.cc
-+++ b/components/compose/core/browser/config.cc
-@@ -47,11 +47,11 @@ std::vector<std::string> GetFieldTrialPa
- }
-
- constexpr auto DEFAULT_COMPOSE_ENABLED_COUNTRIES =
-- base::MakeFixedFlatSet<std::string>({"bd", "ca", "gh", "in", "ke", "my",
-+ base::MakeFixedFlatSet<std::string_view>({"bd", "ca", "gh", "in", "ke", "my",
- "ng", "ph", "pk", "sg", "tz", "ug",
- "us", "zm", "zw"});
- constexpr auto DEFAULT_PROACTIVE_NUDGE_ENABLED_COUNTRIES =
-- base::MakeFixedFlatSet<std::string>({"us"});
-+ base::MakeFixedFlatSet<std::string_view>({"us"});
-
- } // namespace
-
---- a/components/enterprise/client_certificates/core/private_key_factory.cc
-+++ b/components/enterprise/client_certificates/core/private_key_factory.cc
-@@ -123,8 +123,8 @@ void PrivateKeyFactoryImpl::OnPrivateKey
- scoped_refptr<PrivateKey> private_key) {
- if (!private_key && source != PrivateKeySource::kSoftwareKey) {
- for (auto fallback_source =
-- ++std::find(std::begin(kKeySourcesOrderedBySecurity),
-- std::end(kKeySourcesOrderedBySecurity), source);
-+ std::next(std::find(std::begin(kKeySourcesOrderedBySecurity),
-+ std::end(kKeySourcesOrderedBySecurity), source));
- fallback_source != std::end(kKeySourcesOrderedBySecurity);
- fallback_source++) {
- auto it = sub_factories_.find(*fallback_source);
---- a/components/one_time_tokens/core/browser/one_time_token_service.h
-+++ b/components/one_time_tokens/core/browser/one_time_token_service.h
-@@ -6,6 +6,7 @@
- #define COMPONENTS_ONE_TIME_TOKENS_CORE_BROWSER_ONE_TIME_TOKEN_SERVICE_H_
-
- #include <optional>
-+#include <variant>
-
- #include "base/functional/callback.h"
- #include "base/time/time.h"
---- a/components/page_content_annotations/core/page_content_cache.h
-+++ b/components/page_content_annotations/core/page_content_cache.h
-@@ -7,6 +7,7 @@
-
- #include <set>
-
-+#include <set>
- #include "base/files/file_path.h"
- #include "base/functional/callback.h"
- #include "base/memory/weak_ptr.h"
---- a/components/page_content_annotations/core/page_content_cache_handler.h
-+++ b/components/page_content_annotations/core/page_content_cache_handler.h
-@@ -9,6 +9,7 @@
-
- #include <memory>
- #include <optional>
-+#include <set>
-
- #include "base/scoped_observation.h"
- #include "components/optimization_guide/proto/features/common_quality_data.pb.h"
---- a/components/policy/core/common/cloud/realtime_reporting_job_configuration.h
-+++ b/components/policy/core/common/cloud/realtime_reporting_job_configuration.h
-@@ -6,6 +6,7 @@
- #define COMPONENTS_POLICY_CORE_COMMON_CLOUD_REALTIME_REPORTING_JOB_CONFIGURATION_H_
-
- #include <memory>
-+#include <set>
- #include <string>
-
- #include "base/feature_list.h"
---- a/components/sharing_message/sharing_message_bridge_impl.h
-+++ b/components/sharing_message/sharing_message_bridge_impl.h
-@@ -5,6 +5,7 @@
- #ifndef COMPONENTS_SHARING_MESSAGE_SHARING_MESSAGE_BRIDGE_IMPL_H_
- #define COMPONENTS_SHARING_MESSAGE_SHARING_MESSAGE_BRIDGE_IMPL_H_
-
-+#include <map>
- #include <memory>
-
- #include "base/timer/timer.h"
---- a/components/url_pattern_index/url_pattern_index.h
-+++ b/components/url_pattern_index/url_pattern_index.h
-@@ -8,6 +8,7 @@
- #include <stddef.h>
- #include <stdint.h>
-
-+#include <map>
- #include <optional>
- #include <string_view>
- #include <vector>
---- a/components/viz/service/display/surface_aggregator.cc
-+++ b/components/viz/service/display/surface_aggregator.cc
-@@ -2147,7 +2147,7 @@ AggregatedFrame SurfaceAggregator::Aggre
- root_surface_id_ = surface_id;
-
- // Start recording new stats for this aggregation.
-- stats_.emplace();
-+ stats_.emplace(AggregateStatistics{});
-
- ResolvedFrameData* resolved_frame = GetResolvedFrame(surface_id);
-
---- a/components/webauthn/core/browser/passkey_sync_bridge.h
-+++ b/components/webauthn/core/browser/passkey_sync_bridge.h
-@@ -5,6 +5,7 @@
- #ifndef COMPONENTS_WEBAUTHN_CORE_BROWSER_PASSKEY_SYNC_BRIDGE_H_
- #define COMPONENTS_WEBAUTHN_CORE_BROWSER_PASSKEY_SYNC_BRIDGE_H_
-
-+#include <map>
- #include <memory>
- #include <string>
-
---- a/content/browser/private_aggregation/private_aggregation_pending_contributions.h
-+++ b/content/browser/private_aggregation/private_aggregation_pending_contributions.h
-@@ -51,7 +51,11 @@ class CONTENT_EXPORT PrivateAggregationP
- contribution)
- : ContributionMergeKey(*contribution) {}
-
-- auto operator<=>(const ContributionMergeKey& a) const = default;
-+ bool operator<(const ContributionMergeKey& a) const {
-+ return ((bucket < a.bucket)&&(filtering_id < a.filtering_id)); }
-+
-+ bool operator==(const ContributionMergeKey& a) const {
-+ return ((bucket == a.bucket)&&(filtering_id == a.filtering_id)) ; }
-
- absl::uint128 bucket;
- uint64_t filtering_id;
---- a/content/browser/webid/accounts_fetcher.cc
-+++ b/content/browser/webid/accounts_fetcher.cc
-@@ -480,7 +480,7 @@ void AccountsFetcher::OnFetchDataForIdpS
- idp_info->client_is_third_party_to_top_frame_origin =
- client_metadata.client_is_third_party_to_top_frame_origin;
- for (auto& account : accounts.accounts) {
-- account->identity_provider = idp_info->data;
-+ account->identity_provider = idp_info->data.get();
- }
- for (auto& account : filtered_accounts) {
- account->identity_provider = idp_info->data;
---- a/content/browser/webid/request_service.cc
-+++ b/content/browser/webid/request_service.cc
-@@ -1213,7 +1213,7 @@ void RequestService::MaybeShowAccountsDi
- if (dialog_type_ == DialogType::kAutoReauth) {
- accounts_ = {auto_reauthn_account};
- idp_data_for_display_ = {auto_reauthn_idp};
-- accounts_[0]->identity_provider = idp_data_for_display_[0];
-+ accounts_[0]->identity_provider = idp_data_for_display_[0].get();
- }
- }
-
---- a/content/public/browser/content_browser_client.cc
-+++ b/content/public/browser/content_browser_client.cc
-@@ -97,6 +97,7 @@
- #include "ui/shell_dialogs/select_file_policy.h"
- #include "url/gurl.h"
- #include "url/origin.h"
-+#include "content/public/browser/web_ui_controller.h"
-
- #if BUILDFLAG(IS_ANDROID)
- #include "content/browser/renderer_host/navigation_transitions/navigation_transition_config.h"
---- a/extensions/browser/api/extensions_api_client.cc
-+++ b/extensions/browser/api/extensions_api_client.cc
-@@ -7,6 +7,16 @@
- #include "base/task/single_thread_task_runner.h"
- #include "build/build_config.h"
- #include "extensions/browser/api/messaging/native_message_host.h"
-+#include "extensions/browser/guest_view/app_view/app_view_guest_delegate.h"
-+#include "extensions/browser/guest_view/extension_options/extension_options_guest_delegate.h"
-+#include "extensions/browser/guest_view/extensions_guest_view_manager_delegate.h"
-+#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h"
-+#include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h"
-+#include "extensions/browser/guest_view/web_view/web_view_permission_helper_delegate.h"
-+#include "extensions/browser/api/declarative_content/content_rules_registry.h"
-+#include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h"
-+#include "extensions/browser/supervised_user_extensions_delegate.h"
-+#include "extensions/browser/api/system_display/display_info_provider.h"
- #include "extensions/browser/api/messaging/native_message_port_dispatcher.h"
- #include "extensions/browser/api/system_display/display_info_provider.h"
-
---- a/mojo/public/cpp/bindings/lib/multiplex_router.cc
-+++ b/mojo/public/cpp/bindings/lib/multiplex_router.cc
-@@ -969,7 +969,7 @@ bool MultiplexRouter::ExclusiveSyncWaitF
- DCHECK(!exclusive_sync_wait_);
-
- scoped_refptr<MultiplexRouter> keep_alive(this);
-- exclusive_sync_wait_.emplace();
-+ exclusive_sync_wait_.emplace(ExclusiveSyncWaitInfo{});
- exclusive_sync_wait_->interface_id = interface_id;
- exclusive_sync_wait_->request_id = request_id;
- while (!exclusive_sync_wait_->finished) {
---- a/net/cookies/cookie_util.cc
-+++ b/net/cookies/cookie_util.cc
-@@ -840,7 +840,7 @@ bool IsCookiePartitionedValid(
-
- void ParseRequestCookieLine(std::string_view header_value,
- ParsedRequestCookies* parsed_cookies) {
-- std::string::const_iterator i = header_value.begin();
-+ std::string_view::const_iterator i = header_value.begin();
- while (i != header_value.end()) {
- // Here we are at the beginning of a cookie.
-
-@@ -849,7 +849,7 @@ void ParseRequestCookieLine(std::string_
- if (i == header_value.end()) return;
-
- // Find cookie name.
-- std::string::const_iterator cookie_name_beginning = i;
-+ std::string_view::const_iterator cookie_name_beginning = i;
- while (i != header_value.end() && *i != '=') ++i;
- auto cookie_name = std::string_view(cookie_name_beginning, i);
-
-@@ -858,7 +858,7 @@ void ParseRequestCookieLine(std::string_
- // Cookies may have no value, in this case '=' may or may not be there.
- if (i != header_value.end() && i + 1 != header_value.end()) {
- ++i; // Skip '='.
-- std::string::const_iterator cookie_value_beginning = i;
-+ std::string_view::const_iterator cookie_value_beginning = i;
- if (*i == '"') {
- ++i; // Skip '"'.
- while (i != header_value.end() && *i != '"') ++i;
---- a/sql/sandboxed_vfs.h
-+++ b/sql/sandboxed_vfs.h
-@@ -5,6 +5,7 @@
- #ifndef SQL_SANDBOXED_VFS_H_
- #define SQL_SANDBOXED_VFS_H_
-
-+#include <cstring>
- #include <memory>
- #include <optional>
-
---- a/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.h
-+++ b/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.h
-@@ -3062,7 +3062,7 @@ class UpdateDescriptorSetsBuilder final
- mCurrentVector = mDescriptorInfos.begin();
- mTotalSize = 0;
- }
-- T *allocate(uint32_t count);
-+ __attribute__((__used__)) T *allocate(uint32_t count);
-
- bool empty() const { return mTotalSize == 0; }
-
---- a/third_party/blink/common/interest_group/auction_config_mojom_traits.cc
-+++ b/third_party/blink/common/interest_group/auction_config_mojom_traits.cc
-@@ -226,8 +226,6 @@ bool StructTraits<blink::mojom::AuctionA
- !data.ReadAllBuyersPrioritySignals(&out->all_buyers_priority_signals) ||
- !data.ReadAuctionReportBuyerKeys(&out->auction_report_buyer_keys) ||
- !data.ReadAuctionReportBuyers(&out->auction_report_buyers) ||
-- !data.ReadAuctionReportBuyerDebugModeConfig(
-- &out->auction_report_buyer_debug_mode_config) ||
- !data.ReadRequiredSellerCapabilities(
- &out->required_seller_capabilities) ||
- !data.ReadRequestedSize(&out->requested_size) ||
---- a/third_party/blink/renderer/bindings/core/v8/to_v8_traits.h
-+++ b/third_party/blink/renderer/bindings/core/v8/to_v8_traits.h
-@@ -44,8 +44,8 @@ struct NullTraits<T> {
- };
-
- template <>
--struct NullTraits<nullptr_t> {
-- static constexpr bool IsNull(nullptr_t) { return true; }
-+struct NullTraits<std::nullptr_t> {
-+ static constexpr bool IsNull(std::nullptr_t) { return true; }
- };
-
- template <typename T>
---- a/third_party/blink/renderer/core/layout/inline/line_breaker.cc
-+++ b/third_party/blink/renderer/core/layout/inline/line_breaker.cc
-@@ -2677,7 +2677,7 @@ bool LineBreaker::ComputeTrailingCollaps
- if (!trailing_collapsible_space_.has_value() ||
- trailing_collapsible_space_->item_results != results ||
- trailing_collapsible_space_->item_result_index != index) {
-- trailing_collapsible_space_.emplace();
-+ trailing_collapsible_space_.emplace(TrailingCollapsibleSpace{});
- trailing_collapsible_space_->item_results = results;
- trailing_collapsible_space_->item_result_index = index;
- if (item_result.EndOffset() - 1 > item_result.StartOffset()) {
---- a/third_party/blink/renderer/core/layout/physical_box_fragment.h
-+++ b/third_party/blink/renderer/core/layout/physical_box_fragment.h
-@@ -171,7 +171,7 @@ class CORE_EXPORT PhysicalBoxFragment fi
- !Style().ShouldIgnoreOverflowPropertyForInlineBlockBaseline();
- }
-
-- const GapGeometry* GetGapGeometry() const {
-+ const blink::GapGeometry* GetGapGeometry() const {
- return rare_data_ ? rare_data_->gap_geometry_.Get() : nullptr;
- }
-
---- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h
-+++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h
-@@ -23,6 +23,7 @@
- #include "third_party/blink/renderer/platform/heap/prefinalizer.h"
- #include "third_party/blink/renderer/platform/text/layout_locale.h"
- #include "ui/gfx/geometry/size.h"
-+#include "third_party/blink/renderer/platform/text/layout_locale.h"
-
- namespace blink {
-
---- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
-+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
-@@ -622,7 +622,7 @@ class CORE_EXPORT PaintLayerScrollableAr
- mojom::blink::ScrollBehavior scroll_behavior) override {
- if (!should_restore_scroll)
- return;
-- pending_view_state_.emplace();
-+ pending_view_state_.emplace(PendingViewState{});
- pending_view_state_->state = view_state;
- pending_view_state_->scroll_behavior = scroll_behavior;
- }
---- a/third_party/blink/renderer/modules/xr/xr_webgl_swap_chain.h
-+++ b/third_party/blink/renderer/modules/xr/xr_webgl_swap_chain.h
-@@ -12,6 +12,7 @@
- #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
- #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
- #include "third_party/blink/renderer/platform/heap/member.h"
-+#include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
-
- namespace blink {
-
---- a/third_party/blink/renderer/platform/fonts/string_truncator.cc
-+++ b/third_party/blink/renderer/platform/fonts/string_truncator.cc
-@@ -123,7 +123,7 @@ static String TruncateString(const Strin
- if (string.length() > STRING_BUFFER_SIZE) {
- keep_count = STRING_BUFFER_SIZE - 1; // need 1 character for the ellipsis
- truncated_string =
-- CenterTruncateToBuffer(string, keep_count, string_buffer);
-+ CenterTruncateToBuffer(string, keep_count, base::span(string_buffer));
- } else {
- keep_count = string.length();
- auto string_buffer_piece = base::span(string_buffer).first(keep_count);
---- a/third_party/blink/renderer/platform/graphics/canvas_resource.h
-+++ b/third_party/blink/renderer/platform/graphics/canvas_resource.h
-@@ -30,6 +30,7 @@
- #include "third_party/skia/include/core/SkRefCnt.h"
- #include "ui/gfx/buffer_types.h"
- #include "ui/gfx/geometry/size.h"
-+#include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
-
- class SkSurface;
-
---- a/third_party/blink/renderer/platform/graphics/filters/fe_color_matrix.cc
-+++ b/third_party/blink/renderer/platform/graphics/filters/fe_color_matrix.cc
-@@ -123,7 +123,7 @@ static sk_sp<cc::ColorFilter> CreateColo
- break;
- case FECOLORMATRIX_TYPE_MATRIX: {
- if (values.size() == kColorMatrixSize) {
-- base::span(matrix).copy_from(values);
-+ base::span(std::span(matrix)).copy_from(values);
- }
- break;
- }
---- a/third_party/blink/renderer/platform/wtf/text/string_concatenate.h
-+++ b/third_party/blink/renderer/platform/wtf/text/string_concatenate.h
-@@ -45,7 +45,7 @@ class StringTypeAdapter<char> {
- DISALLOW_NEW();
-
- public:
-- explicit StringTypeAdapter<char>(char buffer) : buffer_(buffer) {}
-+ explicit StringTypeAdapter(char buffer) : buffer_(buffer) {}
-
- size_t length() const { return 1; }
- bool Is8Bit() const { return true; }
-@@ -64,7 +64,7 @@ class StringTypeAdapter<char> {
- template <>
- class StringTypeAdapter<LChar> : public StringTypeAdapter<char> {
- public:
-- explicit StringTypeAdapter<LChar>(LChar buffer)
-+ explicit StringTypeAdapter(LChar buffer)
- : StringTypeAdapter<char>(buffer) {}
- };
-
-@@ -73,7 +73,7 @@ class StringTypeAdapter<UChar> {
- DISALLOW_NEW();
-
- public:
-- explicit StringTypeAdapter<UChar>(UChar buffer) : buffer_(buffer) {}
-+ explicit StringTypeAdapter(UChar buffer) : buffer_(buffer) {}
-
- size_t length() const { return 1; }
- bool Is8Bit() const { return buffer_ <= 0xff; }
-@@ -96,7 +96,7 @@ class WTF_EXPORT StringTypeAdapter<const
- DISALLOW_NEW();
-
- public:
-- explicit StringTypeAdapter<const char*>(const char* buffer)
-+ explicit StringTypeAdapter(const char* buffer)
- : buffer_(base::as_byte_span(std::string_view(buffer))) {}
-
- size_t length() const { return buffer_.size(); }
-@@ -113,7 +113,7 @@ template <>
- class WTF_EXPORT StringTypeAdapter<const LChar*>
- : StringTypeAdapter<const char*> {
- public:
-- explicit StringTypeAdapter<const LChar*>(const LChar* buffer)
-+ explicit StringTypeAdapter(const LChar* buffer)
- : StringTypeAdapter<const char*>(reinterpret_cast<const char*>(buffer)) {}
- };
-
-@@ -121,7 +121,7 @@ template <>
- class WTF_EXPORT StringTypeAdapter<char*>
- : public StringTypeAdapter<const char*> {
- public:
-- explicit StringTypeAdapter<char*>(char* buffer)
-+ explicit StringTypeAdapter(char* buffer)
- : StringTypeAdapter<const char*>(buffer) {}
- };
-
-@@ -129,7 +129,7 @@ template <>
- class WTF_EXPORT StringTypeAdapter<LChar*>
- : public StringTypeAdapter<const LChar*> {
- public:
-- explicit StringTypeAdapter<LChar*>(LChar* buffer)
-+ explicit StringTypeAdapter(LChar* buffer)
- : StringTypeAdapter<const LChar*>(buffer) {}
- };
-
---- a/third_party/blink/renderer/platform/wtf/text/string_view.h
-+++ b/third_party/blink/renderer/platform/wtf/text/string_view.h
-@@ -16,6 +16,7 @@
- #include "third_party/blink/renderer/platform/wtf/forward.h"
- #include "third_party/blink/renderer/platform/wtf/get_ptr.h"
- #include "third_party/blink/renderer/platform/wtf/text/string_impl.h"
-+#include "third_party/blink/renderer/platform/wtf/text/code_point_iterator.h"
-
- #if DCHECK_IS_ON()
- #include "base/memory/scoped_refptr.h"
---- a/third_party/libaddressinput/src/cpp/src/rule.cc
-+++ b/third_party/libaddressinput/src/cpp/src/rule.cc
-@@ -17,6 +17,7 @@
- #include <algorithm>
- #include <cassert>
- #include <cstddef>
-+#include <cstring>
- #include <string>
- #include <utility>
-
-@@ -48,7 +49,7 @@ struct NameIdInfo {
- int id;
-
- static bool less(const NameIdInfo& a, const NameIdInfo& b) {
-- return strcmp(a.name, b.name) < 0;
-+ return std::strcmp(a.name, b.name) < 0;
- }
- };
-
---- a/third_party/pdfium/xfa/fde/cfde_texteditengine.cpp
-+++ b/third_party/pdfium/xfa/fde/cfde_texteditengine.cpp
-@@ -19,6 +19,7 @@
- #include "xfa/fde/cfde_textout.h"
- #include "xfa/fde/cfde_wordbreak_data.h"
- #include "xfa/fgas/font/cfgas_gefont.h"
-+#include "core/fxcrt/fx_string.h"
-
- namespace pdfium {
-
-@@ -880,8 +881,8 @@ WideString CFDE_TextEditEngine::Delete(s
- length = std::min(length, text_length_ - start_idx);
- AdjustGap(start_idx + length, 0);
-
-- WideString ret(
-- WideStringView(pdfium::span(content_).subspan(start_idx, length)));
-+ WideString ret;
-+ ret = WideStringView(pdfium::span(content_).subspan(start_idx, length));
-
- if (add_operation == RecordOperation::kInsertRecord) {
- AddOperationRecord(std::make_unique<DeleteOperation>(this, start_idx, ret));
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-@@ -17,6 +17,7 @@ limitations under the License.
-
- #include <algorithm>
- #include <cstdio>
-+#include <cstring>
-
- #include "absl/strings/string_view.h" // from @com_google_absl
- #include "third_party/zlib/contrib/minizip/ioapi.h"
-@@ -57,7 +58,7 @@ uLong ZipReadOnlyMemFile::ReadFile(voidp
- if (mem_file->offset_ + size > mem_file->Size()) {
- size = mem_file->Size() - mem_file->offset_;
- }
-- memcpy(buf,
-+ std::memcpy(buf,
- static_cast<const char*>(mem_file->data_.data()) + mem_file->offset_,
- size);
- mem_file->offset_ += size;
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc
-@@ -17,6 +17,7 @@ limitations under the License.
-
- #include <algorithm>
- #include <cstdio>
-+#include <cstring>
-
- #include "absl/strings/string_view.h" // from @com_google_absl
- #include "third_party/zlib/contrib/minizip/ioapi.h"
-@@ -59,7 +60,7 @@ uLong ZipWritableMemFile::ReadFile(voidp
- if (mem_file->offset_ + size > mem_file->Size()) {
- size = mem_file->Size() - mem_file->offset_;
- }
-- memcpy(buf,
-+ std::memcpy(buf,
- static_cast<const char*>(mem_file->data_.c_str()) + mem_file->offset_,
- size);
- mem_file->offset_ += size;
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h
-@@ -17,6 +17,7 @@ limitations under the License.
- #define TENSORFLOW_LITE_SUPPORT_METADATA_CC_UTILS_ZIP_MEM_FILE_H_
-
- #include <cstdlib>
-+#include <string>
-
- #include "absl/strings/string_view.h" // from @com_google_absl
- #include "third_party/zlib/contrib/minizip/ioapi.h"
---- a/third_party/webrtc/call/rtp_config.cc
-+++ b/third_party/webrtc/call/rtp_config.cc
-@@ -258,7 +258,7 @@ RtpStreamConfig RtpConfig::GetStreamConf
- stream_config.raw_payload = raw_payload;
- if (!rtx.ssrcs.empty()) {
- RTC_DCHECK_EQ(ssrcs.size(), rtx.ssrcs.size());
-- auto& stream_config_rtx = stream_config.rtx.emplace();
-+ auto& stream_config_rtx = stream_config.rtx.emplace(RtpStreamConfig::Rtx{});
- stream_config_rtx.ssrc = rtx.ssrcs[index];
- stream_config_rtx.payload_type = rtx.payload_type;
- }
---- a/v8/BUILD.gn
-+++ b/v8/BUILD.gn
-@@ -788,9 +788,6 @@ assert(!v8_enable_pointer_compression_8g
- assert(!v8_enable_sandbox || v8_enable_external_code_space,
- "The sandbox requires the external code space")
-
--assert(!v8_enable_sandbox || use_safe_libcxx,
-- "The sandbox requires libc++ hardening")
--
- assert(!v8_enable_memory_corruption_api || v8_enable_sandbox,
- "The Memory Corruption API requires the sandbox")
-
---- a/v8/src/base/hashmap.h
-+++ b/v8/src/base/hashmap.h
-@@ -446,7 +446,7 @@ void TemplateHashMapImpl<Key, Value, Mat
- // expensive) key comparison.
- template <typename Key, typename MatchFun>
- struct HashEqualityThenKeyMatcher {
-- explicit HashEqualityThenKeyMatcher(MatchFun match) : match_(match) {}
-+ explicit HashEqualityThenKeyMatcher(MatchFun match = nullptr) : match_(match) {}
-
- bool operator()(uint32_t hash1, uint32_t hash2, const Key& key1,
- const Key& key2) const {
---- a/v8/src/bigint/bigint.h
-+++ b/v8/src/bigint/bigint.h
-@@ -10,6 +10,7 @@
- #include <algorithm>
- #include <cstring>
- #include <iostream>
-+#include <memory>
- #include <utility>
-
- namespace v8 {
---- a/v8/src/runtime/runtime-literals.cc
-+++ b/v8/src/runtime/runtime-literals.cc
-@@ -613,7 +613,7 @@ Handle<JSObject> CreateObjectLiteral(
- DirectHandle<NumberDictionary> dict = Cast<NumberDictionary>(elements);
- PropertyDetails details(PropertyKind::kData, NONE,
- PropertyConstness::kConst, 0);
-- NumberDictionary::UncheckedAdd(isolate, dict, element_index, value,
-+ NumberDictionary::UncheckedAdd<Isolate, DirectHandle, AllocationType::kSharedOld>(isolate, dict, element_index, value,
- details);
- }
- }
diff --git a/www-client/ungoogled-chromium/files/chromium-147-no-rust.patch b/www-client/ungoogled-chromium/files/chromium-147-no-rust.patch
deleted file mode 100644
index 750856f92a43..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-147-no-rust.patch
+++ /dev/null
@@ -1,772 +0,0 @@
---- a/BUILD.gn
-+++ b/BUILD.gn
-@@ -839,11 +839,6 @@ group("all_rust") {
- "//third_party/cloud_authenticator/processor",
- ]
-
-- # TODO(https://crbug.com/405379314): This fails to build on some iOS ASAN
-- # builders.
-- if (!is_ios || !is_asan) {
-- deps += [ "//testing/rust_gtest_interop:rust_gtest_interop_unittests" ]
-- }
-
- if (!is_cronet_build) {
- deps += [ "//skia" ]
---- a/base/BUILD.gn
-+++ b/base/BUILD.gn
-@@ -343,6 +343,8 @@ component("base") {
- "hash/legacy_hash.cc",
- "hash/legacy_hash.h",
- "json/json_common.h",
-+ "json/json_parser.cc",
-+ "json/json_parser.h",
- "json/json_reader.cc",
- "json/json_reader.h",
- "json/json_string_value_serializer.cc",
-@@ -1087,10 +1089,6 @@ component("base") {
- # Used by metrics/crc32
- deps += [ "//third_party/zlib" ]
-
-- deps += [
-- ":rust_logger",
-- "//third_party/rust/serde_json_lenient/v0_2/wrapper",
-- ]
-
- if (use_asan_backup_ref_ptr) {
- # Used by raw_ptr_service.cc to override {malloc,free,ignore_free} hooks.
-@@ -1141,6 +1139,7 @@ component("base") {
- "//base/third_party/icu",
- "//build:chromecast_buildflags",
- "//third_party/abseil-cpp:absl",
-+ "//third_party/abseil-cpp/absl/base:raw_logging_internal",
- ]
-
- if (use_asan_backup_ref_ptr) {
-@@ -1151,14 +1150,6 @@ component("base") {
- }
- }
-
-- sources += [
-- "containers/span_rust.h",
-- "strings/string_view_rust.h",
-- ]
--
-- # Base provides conversions between CXX types and base types (e.g.
-- # std::string_view).
-- public_deps += [ "//build/rust:cxx_cppdeps" ]
-
- # Needed for <atomic> if using newer C++ library than sysroot, except if
- # building inside the cros_sdk environment - use host_toolchain as a
-@@ -1615,8 +1606,6 @@ component("base") {
- "files/scoped_temp_file.h",
- "json/json_file_value_serializer.cc",
- "json/json_file_value_serializer.h",
-- "logging/rust_log_integration.cc",
-- "logging/rust_log_integration.h",
- "memory/discardable_memory.cc",
- "memory/discardable_memory.h",
- "memory/discardable_memory_allocator.cc",
-@@ -3855,11 +3844,6 @@ test("base_unittests") {
- sources += [ "immediate_crash_unittest.cc" ]
- }
-
-- sources += [
-- "containers/span_rust_unittest.cc",
-- "strings/string_piece_rust_unittest.cc",
-- ]
--
- fuzztests = [ "JSONReaderTest.CanParseAnythingWithoutCrashing" ]
-
- defines = []
-@@ -3906,8 +3890,6 @@ test("base_unittests") {
- deps += [ "allocator/partition_allocator/src/partition_alloc:unittests" ]
- }
-
-- deps += [ "//build/rust:cxx_cppdeps" ]
--
- data_deps = [
- "//base/test:immediate_crash_test_helper",
- "//base/test:test_child_process",
---- a/base/json/json_reader.cc
-+++ b/base/json/json_reader.cc
-@@ -12,111 +12,7 @@
- #include "base/strings/strcat.h"
- #include "base/strings/string_number_conversions.h"
- #include "build/build_config.h"
--#include "base/strings/string_view_rust.h"
--#include "third_party/rust/serde_json_lenient/v0_2/wrapper/functions.h"
--#include "third_party/rust/serde_json_lenient/v0_2/wrapper/lib.rs.h"
--
--// This namespace defines FFI-friendly functions that are be called from Rust in
--// //third_party/rust/serde_json_lenient/v0_2/wrapper/.
--namespace serde_json_lenient {
--
--base::ListValue& list_append_list(base::ListValue& ctx) {
-- ctx.Append(base::ListValue());
-- return ctx.back().GetList();
--}
--
--base::DictValue& list_append_dict(base::ListValue& ctx) {
-- ctx.Append(base::DictValue());
-- return ctx.back().GetDict();
--}
--
--void list_append_none(base::ListValue& ctx) {
-- ctx.Append(base::Value());
--}
--
--void list_append_bool(base::ListValue& ctx, bool val) {
-- ctx.Append(val);
--}
--
--void list_append_i32(base::ListValue& ctx, int32_t val) {
-- ctx.Append(val);
--}
--
--void list_append_f64(base::ListValue& ctx, double val) {
-- ctx.Append(val);
--}
--
--void list_append_str(base::ListValue& ctx, rust::Str val) {
-- ctx.Append(std::string(val));
--}
--
--base::ListValue& dict_set_list(base::DictValue& ctx, rust::Str key) {
-- base::Value* value =
-- ctx.Set(base::RustStrToStringView(key), base::ListValue());
-- return value->GetList();
--}
--
--base::DictValue& dict_set_dict(base::DictValue& ctx, rust::Str key) {
-- base::Value* value =
-- ctx.Set(base::RustStrToStringView(key), base::DictValue());
-- return value->GetDict();
--}
--
--void dict_set_none(base::DictValue& ctx, rust::Str key) {
-- ctx.Set(base::RustStrToStringView(key), base::Value());
--}
--
--void dict_set_bool(base::DictValue& ctx, rust::Str key, bool val) {
-- ctx.Set(base::RustStrToStringView(key), val);
--}
--
--void dict_set_i32(base::DictValue& ctx, rust::Str key, int32_t val) {
-- ctx.Set(base::RustStrToStringView(key), val);
--}
--
--void dict_set_f64(base::DictValue& ctx, rust::Str key, double val) {
-- ctx.Set(base::RustStrToStringView(key), val);
--}
--
--void dict_set_str(base::DictValue& ctx, rust::Str key, rust::Str val) {
-- ctx.Set(base::RustStrToStringView(key), std::string(val));
--}
--
--namespace {
--
--base::JSONReader::Result DecodeJSONInRust(std::string_view json,
-- int options,
-- size_t max_depth) {
-- const JsonOptions rust_options = {
-- .allow_trailing_commas =
-- (options & base::JSON_ALLOW_TRAILING_COMMAS) != 0,
-- .replace_invalid_characters =
-- (options & base::JSON_REPLACE_INVALID_CHARACTERS) != 0,
-- .allow_comments = (options & base::JSON_ALLOW_COMMENTS) != 0,
-- .allow_newlines = (options & base::JSON_ALLOW_NEWLINES_IN_STRINGS) != 0,
-- .allow_vert_tab = (options & base::JSON_ALLOW_VERT_TAB) != 0,
-- .allow_x_escapes = (options & base::JSON_ALLOW_X_ESCAPES) != 0,
-- .max_depth = max_depth,
-- };
--
-- base::ListValue list;
-- DecodeError error;
-- bool ok =
-- decode_json(base::StringViewToRustSlice(json), rust_options, list, error);
--
-- if (!ok) {
-- return base::unexpected(base::JSONReader::Error{
-- .message = std::string(error.message),
-- .line = error.line,
-- .column = error.column,
-- });
-- }
--
-- return std::move(list.back());
--}
--
--} // namespace
--} // namespace serde_json_lenient
-+#include "base/json/json_parser.h"
-
- namespace base {
-
-@@ -129,12 +25,8 @@ std::string JSONReader::Error::ToString(
- std::optional<Value> JSONReader::Read(std::string_view json,
- int options,
- size_t max_depth) {
-- JSONReader::Result result =
-- serde_json_lenient::DecodeJSONInRust(json, options, max_depth);
-- if (!result.has_value()) {
-- return std::nullopt;
-- }
-- return std::move(*result);
-+ internal::JSONParser parser(options, max_depth);
-+ return parser.Parse(json);
- }
-
- // static
-@@ -163,8 +55,17 @@ std::optional<ListValue> JSONReader::Rea
- JSONReader::Result JSONReader::ReadAndReturnValueWithError(
- std::string_view json,
- int options) {
-- return serde_json_lenient::DecodeJSONInRust(json, options,
-- internal::kAbsoluteMaxDepth);
-+ internal::JSONParser parser(options);
-+ auto value = parser.Parse(json);
-+ if (!value) {
-+ Error error;
-+ error.message = parser.GetErrorMessage();
-+ error.line = parser.error_line();
-+ error.column = parser.error_column();
-+ return base::unexpected(std::move(error));
-+ }
-+
-+ return std::move(*value);
- }
-
- } // namespace base
---- a/base/logging.cc
-+++ b/base/logging.cc
-@@ -34,7 +34,6 @@
- #include "base/functional/callback.h"
- #include "base/immediate_crash.h"
- #include "base/logging/logging_settings.h"
--#include "base/logging/rust_logger.rs.h"
- #include "base/no_destructor.h"
- #include "base/path_service.h"
- #include "base/pending_task.h"
-@@ -507,7 +506,7 @@ bool BaseInitLoggingImpl(const LoggingSe
- #endif
-
- // Connects Rust logging with the //base logging functionality.
-- internal::init_rust_log_crate();
-+ //internal::init_rust_log_crate();
-
- // Ignore file options unless logging to file is set.
- if ((g_logging_destination & LOG_TO_FILE) == 0) {
---- a/components/user_data_importer/content/stable_portability_data_importer.cc
-+++ b/components/user_data_importer/content/stable_portability_data_importer.cc
-@@ -16,73 +16,11 @@
- #include "components/strings/grit/components_strings.h"
- #include "components/user_data_importer/utility/bookmark_util.h"
- #include "components/user_data_importer/utility/history_callback_from_rust.h"
--#include "components/user_data_importer/utility/parsing_ffi/lib.rs.h"
- #include "content/public/browser/browser_thread.h"
- #include "ui/base/l10n/l10n_util.h"
-
- namespace user_data_importer {
-
--namespace {
--
--std::string_view RustStringToStringView(const rust::String& rust_string) {
-- return std::string_view(rust_string.data(), rust_string.length());
--}
--
--std::u16string RustStringToUTF16(const rust::String& rust_string) {
-- return base::UTF8ToUTF16(RustStringToStringView(rust_string));
--}
--
--std::optional<history::URLRow> ConvertToURLRow(
-- const user_data_importer::StablePortabilityHistoryEntry& history_entry) {
-- GURL gurl(RustStringToStringView(history_entry.url));
-- if (!gurl.is_valid()) {
-- return std::nullopt;
-- }
--
-- history::URLRow url_row(gurl);
-- url_row.set_title(RustStringToUTF16(history_entry.title));
-- url_row.set_visit_count(history_entry.visit_count);
--
-- url_row.set_last_visit(
-- base::Time::UnixEpoch() +
-- base::Microseconds(history_entry.visit_time_unix_epoch_usec));
-- url_row.set_typed_count(history_entry.typed_count);
--
-- return url_row;
--}
--
--} // namespace
--
--StablePortabilityDataImporter::RustHistoryCallbackForStablePortabilityFormat::
-- RustHistoryCallbackForStablePortabilityFormat(
-- TransferHistoryCallback transfer_history_callback,
-- user_data_importer::StablePortabilityDataImporter::ImportCallback
-- done_callback)
-- : transfer_history_callback_(std::move(transfer_history_callback)),
-- done_callback_(std::move(done_callback)) {}
--
--StablePortabilityDataImporter::RustHistoryCallbackForStablePortabilityFormat::
-- ~RustHistoryCallbackForStablePortabilityFormat() = default;
--
--void StablePortabilityDataImporter::
-- RustHistoryCallbackForStablePortabilityFormat::ImportHistoryEntries(
-- std::unique_ptr<std::vector<StablePortabilityHistoryEntry>>
-- history_entries,
-- bool completed) {
-- parsed_history_entries_count_ += history_entries->size();
-- transfer_history_callback_.Run(std::move(*history_entries));
--
-- if (completed && done_callback_) {
-- std::move(done_callback_).Run(parsed_history_entries_count_);
-- }
--}
--
--void StablePortabilityDataImporter::
-- RustHistoryCallbackForStablePortabilityFormat::Fail() {
-- if (done_callback_) {
-- std::move(done_callback_).Run(-1);
-- }
--}
-
- StablePortabilityDataImporter::BackgroundWorker::BackgroundWorker(
- std::unique_ptr<ContentBookmarkParser> bookmark_parser)
-@@ -96,16 +34,6 @@ void StablePortabilityDataImporter::Back
- bookmark_parser_->Parse(std::move(file), std::move(bookmarks_callback));
- }
-
--#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
--void StablePortabilityDataImporter::BackgroundWorker::ParseHistory(
-- base::File file,
-- std::unique_ptr<RustHistoryCallbackForStablePortabilityFormat> callback,
-- size_t import_batch_size) {
-- int owned_raw_fd = file.TakePlatformFile();
-- user_data_importer::parse_stable_portability_history(
-- owned_raw_fd, std::move(callback), import_batch_size);
--}
--#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
-
- StablePortabilityDataImporter::StablePortabilityDataImporter(
- history::HistoryService* history_service,
-@@ -210,51 +138,15 @@ void StablePortabilityDataImporter::Impo
- return;
- }
-
-- auto transfer_history_entries_callback = base::BindPostTask(
-- origin_sequence_task_runner_,
-- base::BindRepeating(
-- &StablePortabilityDataImporter::TransferHistoryEntries,
-- weak_factory_.GetWeakPtr()));
--
- auto done_callback =
- base::BindOnce(&StablePortabilityDataImporter::OnHistoryImportCompleted,
- weak_factory_.GetWeakPtr(), std::move(history_callback));
- auto done_callback_on_thread = base::BindPostTask(
- origin_sequence_task_runner_, std::move(done_callback));
-
-- auto rust_history_callback =
-- std::make_unique<RustHistoryCallbackForStablePortabilityFormat>(
-- std::move(transfer_history_entries_callback),
-- std::move(done_callback_on_thread));
--
-- background_worker_.AsyncCall(&BackgroundWorker::ParseHistory)
-- .WithArgs(std::move(file), std::move(rust_history_callback),
-- import_batch_size);
- }
- #endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
-
--void StablePortabilityDataImporter::TransferHistoryEntries(
-- std::vector<StablePortabilityHistoryEntry> history_entries) {
-- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-- CHECK(history_service_);
--
-- history::URLRows url_rows;
-- url_rows.reserve(history_entries.size());
-- for (const auto& history_entry : history_entries) {
-- std::optional<history::URLRow> opt_row = ConvertToURLRow(history_entry);
-- if (opt_row) {
-- url_rows.push_back(std::move(opt_row.value()));
-- }
-- }
--
-- if (!url_rows.empty()) {
-- history_service_->AddPagesWithDetails(
-- url_rows, history::SOURCE_OS_MIGRATION_IMPORTED);
-- imported_history_entries_count_ += url_rows.size();
-- }
--}
--
- void StablePortabilityDataImporter::OnHistoryImportCompleted(
- ImportCallback history_callback,
- int parsed_history_entries_count) {
---- a/components/user_data_importer/content/stable_portability_data_importer.h
-+++ b/components/user_data_importer/content/stable_portability_data_importer.h
-@@ -31,7 +31,6 @@ class ReadingListModel;
-
- namespace user_data_importer {
-
--struct StablePortabilityHistoryEntry;
-
- // Main model-layer object for extracting the data exported by browsers in the
- // stable portability data format. The data is received through a system API in
-@@ -79,35 +78,6 @@ class StablePortabilityDataImporter {
- private:
- // Object used to allow Rust History import pipeline to communicate results
- // back to this importer.
-- class RustHistoryCallbackForStablePortabilityFormat final
-- : public user_data_importer::HistoryCallbackFromRust<
-- StablePortabilityHistoryEntry> {
-- public:
-- using TransferHistoryCallback = base::RepeatingCallback<void(
-- std::vector<StablePortabilityHistoryEntry>)>;
--
-- explicit RustHistoryCallbackForStablePortabilityFormat(
-- TransferHistoryCallback transfer_history_callback,
-- user_data_importer::StablePortabilityDataImporter::ImportCallback
-- done_callback);
--
-- ~RustHistoryCallbackForStablePortabilityFormat() override;
--
-- // Called from Rust when a batch of history entries has been parsed.
-- void ImportHistoryEntries(
-- std::unique_ptr<std::vector<
-- user_data_importer::StablePortabilityHistoryEntry>> history_entries,
-- bool completed) override;
--
-- // Calls `done_callback_` with 0 to signal that parsing has failed.
-- void Fail() override;
--
-- private:
-- TransferHistoryCallback transfer_history_callback_;
-- user_data_importer::StablePortabilityDataImporter::ImportCallback
-- done_callback_;
-- size_t parsed_history_entries_count_ = 0;
-- };
-
- // Encapsulates work which must occur in the background thread.
- class BackgroundWorker {
-@@ -121,12 +91,6 @@ class StablePortabilityDataImporter {
- user_data_importer::BookmarkParser::BookmarkParsingCallback
- bookmarks_callback);
-
--#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
-- void ParseHistory(
-- base::File file,
-- std::unique_ptr<RustHistoryCallbackForStablePortabilityFormat> callback,
-- size_t import_batch_size);
--#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
-
- private:
- std::unique_ptr<ContentBookmarkParser> bookmark_parser_;
-@@ -134,10 +98,6 @@ class StablePortabilityDataImporter {
-
- friend class StablePortabilityDataImporterTest;
-
-- // Transfers the history entries to the importer. This is used by the Rust
-- // History import pipeline to communicate results back to this importer.
-- void TransferHistoryEntries(
-- std::vector<StablePortabilityHistoryEntry> history_entries);
-
- // Logs metrics related to history importing and invokes `history_callback`
- // with the number of history entries imported. A negative
---- a/components/user_data_importer/mojom/BUILD.gn
-+++ b/components/user_data_importer/mojom/BUILD.gn
-@@ -39,7 +39,6 @@ mojom("mojom") {
- traits_sources = [ "bookmark_html_parser_traits.cc" ]
- traits_public_deps = [
- "//components/favicon_base",
-- "//components/user_data_importer/utility:safari_data_importer",
- ]
- },
- ]
---- a/content/browser/child_process_security_policy_impl.cc
-+++ b/content/browser/child_process_security_policy_impl.cc
-@@ -28,7 +28,6 @@
- #include "base/strings/stringprintf.h"
- #include "build/build_config.h"
- #include "content/browser/bad_message.h"
--#include "content/browser/child_process_security_policy_impl.rs.h"
- #include "content/browser/isolated_origin_util.h"
- #include "content/browser/process_lock.h"
- #include "content/browser/renderer_host/render_process_host_impl.h"
-@@ -115,10 +114,7 @@ const base::FeatureParam<RustPolicy> kRu
- // implementation is enabled, and whether both Rust and the legacy C++
- // implementations should run in parallel.
- RustPolicy GetRustPolicy() {
-- if (!base::FeatureList::IsEnabled(kChildProcessSecurityPolicyRust)) {
- return RustPolicy::kCppOnly;
-- }
-- return kRustPolicyParam.Get();
- }
- bool IsRustEnabled() {
- return GetRustPolicy() == RustPolicy::kRustAndCpp ||
-@@ -147,9 +143,6 @@ T CheckAndReturnRustAndCppResults(const
- // Macro for gating whether a void function should use its Rust or C++
- // implementation (or both), based on current feature flags.
- #define RUST_CPP_VOID_FUNCTION(rust_function_call, cpp_function_call) \
-- if (IsRustEnabled()) { \
-- rust_function_call; \
-- } \
- if (IsCppEnabled()) { \
- cpp_function_call; \
- }
-@@ -162,12 +155,6 @@ T CheckAndReturnRustAndCppResults(const
- #define RUST_CPP_RETURN_FUNCTION(rust_function_call, cpp_function_call, \
- ReturnType) \
- ReturnType rust_result{}; \
-- if (IsRustEnabled()) { \
-- rust_result = rust_function_call; \
-- if (GetRustPolicy() == RustPolicy::kRustOnly) { \
-- return rust_result; \
-- } \
-- } \
- ReturnType cpp_result = cpp_function_call; \
- return CheckAndReturnRustAndCppResults(rust_result, cpp_result);
-
---- a/media/parsers/BUILD.gn
-+++ b/media/parsers/BUILD.gn
-@@ -28,8 +28,6 @@ source_set("parsers") {
- "h264_poc.h",
- "jpeg_parser.cc",
- "jpeg_parser.h",
-- "parse_jpeg_wrapper.cc",
-- "parse_jpeg_wrapper.h",
- "temporal_scalability_id_extractor.cc",
- "temporal_scalability_id_extractor.h",
- "vp8_bool_decoder.cc",
---- a/media/parsers/jpeg_parser.cc
-+++ b/media/parsers/jpeg_parser.cc
-@@ -575,9 +575,6 @@ bool ParseJpegPictureLegacy(base::span<c
- bool ParseJpegPicture(base::span<const uint8_t> buffer,
- JpegParseResult* result) {
- CHECK(result);
-- if (base::FeatureList::IsEnabled(kUseRustJpegParser)) {
-- return ParseJpegPictureRust(buffer, result);
-- }
- return ParseJpegPictureLegacy(buffer, result);
- }
-
---- a/mojo/BUILD.gn
-+++ b/mojo/BUILD.gn
-@@ -57,7 +57,6 @@ test("mojo_unittests") {
- "//mojo/public/cpp/platform/tests",
- "//mojo/public/cpp/system/tests",
- "//mojo/public/js/ts/bindings/tests",
-- "//mojo/public/rust:tests",
- ]
-
- if (is_linux && mojo_support_legacy_core) {
---- a/mojo/public/BUILD.gn
-+++ b/mojo/public/BUILD.gn
-@@ -9,7 +9,6 @@ group("public") {
- ":sdk",
- "cpp/bindings",
- "interfaces/bindings/tests:test_interfaces",
-- "rust:all",
- ]
-
- if (is_android) {
-@@ -24,8 +23,6 @@ group("sdk") {
- deps = [
- "c/system",
- "cpp/bindings",
-- "rust/bindings",
-- "rust/system",
- ]
- }
-
---- a/mojo/public/rust/sequences/BUILD.gn
-+++ b/mojo/public/rust/sequences/BUILD.gn
-@@ -23,8 +23,6 @@ rust_static_library("sequences") {
- "//base",
- ]
-
-- allow_circular_includes_from = [ ":cxx_shim" ]
--
- visibility = [ "../*" ]
- }
-
---- a/services/on_device_model/ml/BUILD.gn
-+++ b/services/on_device_model/ml/BUILD.gn
-@@ -78,7 +78,6 @@ if (use_blink || (is_ios && build_with_i
-
- if (enable_constraints) {
- defines += [ "ENABLE_ON_DEVICE_CONSTRAINTS" ]
-- deps += [ "//third_party/rust/llguidance/v1:lib" ]
- }
- if (use_blink) {
- deps += [ "//gpu/config" ]
---- a/services/on_device_model/ml/chrome_ml.cc
-+++ b/services/on_device_model/ml/chrome_ml.cc
-@@ -24,7 +24,6 @@
- #include "third_party/dawn/include/dawn/dawn_proc.h"
- #include "third_party/dawn/include/dawn/native/DawnNative.h"
- #include "third_party/dawn/include/dawn/webgpu_cpp.h"
--#include "third_party/rust/chromium_crates_io/vendor/llguidance-v1/llguidance.h"
-
- #if !BUILDFLAG(IS_IOS)
- #include "gpu/config/gpu_info_collector.h"
---- a/services/on_device_model/ml/constraint_factory.cc
-+++ b/services/on_device_model/ml/constraint_factory.cc
-@@ -10,7 +10,6 @@
- #include "base/trace_event/trace_event.h"
- #include "services/on_device_model/ml/chrome_ml.h"
- #include "services/on_device_model/public/mojom/on_device_model.mojom.h"
--#include "third_party/rust/chromium_crates_io/vendor/llguidance-v1/llguidance.h"
-
- namespace ml {
-
---- a/third_party/abseil-cpp/absl/base/BUILD.gn
-+++ b/third_party/abseil-cpp/absl/base/BUILD.gn
-@@ -73,6 +73,7 @@ absl_source_set("raw_logging_internal")
- visibility = [
- "//third_party/abseil-cpp:absl_component_deps",
- "//third_party/abseil-cpp/absl/*",
-+ "//base:base",
- ]
- }
-
---- a/third_party/blink/common/BUILD.gn
-+++ b/third_party/blink/common/BUILD.gn
-@@ -315,7 +315,6 @@ source_set("common") {
- "//services/metrics/public/mojom",
- "//services/network/public/cpp",
- "//services/network/public/mojom:mojom_permissions_policy",
-- "//third_party/blink/common/rust_crash",
- "//third_party/blink/public/common:buildflags",
- "//third_party/re2",
- "//ui/base",
---- a/third_party/blink/common/chrome_debug_urls.cc
-+++ b/third_party/blink/common/chrome_debug_urls.cc
-@@ -12,7 +12,6 @@
- #include "base/threading/platform_thread.h"
- #include "build/build_config.h"
- #include "third_party/blink/common/crash_helpers.h"
--#include "third_party/blink/common/rust_crash/src/lib.rs.h"
- #include "url/gurl.h"
-
- #if BUILDFLAG(IS_WIN)
-@@ -118,7 +117,7 @@ NOINLINE void MaybeTriggerAsanError(cons
- // Ensure that ASAN works even in Rust code.
- LOG(ERROR) << "Intentionally causing ASAN heap overflow in Rust"
- << " because user navigated to " << url.spec();
-- crash_in_rust_with_overflow();
-+ //crash_in_rust_with_overflow();
- }
- }
- #endif // ADDRESS_SANITIZER
-@@ -138,7 +137,7 @@ void HandleChromeDebugURL(const GURL& ur
- } else if (url == kChromeUICrashRustURL) {
- // Cause a typical crash in Rust code, so we can test that call stack
- // collection and symbol mangling work across the language boundary.
-- crash_in_rust();
-+ //crash_in_rust();
- } else if (url == kChromeUIDumpURL) {
- // This URL will only correctly create a crash dump file if content is
- // hosted in a process that has correctly called
---- a/third_party/blink/renderer/core/BUILD.gn
-+++ b/third_party/blink/renderer/core/BUILD.gn
-@@ -431,7 +431,6 @@ component("core") {
- "//third_party/blink/public/strings:generate_permission_element_strings_mono_grd",
- "//third_party/blink/public/strings:permission_element_generated_strings",
- "//third_party/blink/public/strings:permission_element_strings_grit",
-- "//third_party/rust/xml/v1:lib",
- "//tools/v8_context_snapshot:buildflags",
- "//ui/base/cursor/mojom:cursor_type_blink",
- "//ui/base/dragdrop/mojom:mojom_blink",
---- a/third_party/blink/renderer/core/dom/document.cc
-+++ b/third_party/blink/renderer/core/dom/document.cc
-@@ -359,7 +359,6 @@
- #include "third_party/blink/renderer/core/view_transition/view_transition_supplement.h"
- #include "third_party/blink/renderer/core/view_transition/view_transition_utils.h"
- #include "third_party/blink/renderer/core/xml/parser/xml_document_parser.h"
--#include "third_party/blink/renderer/core/xml/parser/xml_document_parser_rs.h"
- #include "third_party/blink/renderer/core/xml_names.h"
- #include "third_party/blink/renderer/core/xmlns_names.h"
- #include "third_party/blink/renderer/platform/bindings/dom_data_store.h"
-@@ -3578,28 +3577,7 @@ DocumentParser* Document::CreateParser()
-
- data_->using_rust_xml_parser_ = false;
-
-- // Use the Rust XML parser for situations non-XSLT situations: XMLHttpRequest,
-- // JS DOMParser API, where no dom_window_ is available, or for SVG images.
-- if (!GetFrame() || IsSVGDocument()) {
-- // Measure this for now only in non-frame = non-XSLT situations, so that
-- // when we compare the UMA metrics of Rust vs. non-Rust for
-- // XMLRustForNonXsltEnabled(), we're looking at roughly the same type and
-- // length of documents on average.
-- data_->xml_parser_start_time_ = base::TimeTicks::Now();
--
-- if (RuntimeEnabledFeatures::XMLRustForNonXsltEnabled()) {
-- data_->using_rust_xml_parser_ = true;
-- return MakeGarbageCollected<XMLDocumentParserRs>(*this, View());
-- }
-- }
--
-- // FIXME: this should probably pass the frame instead
-- if (RuntimeEnabledFeatures::XMLParsingRustEnabled()) {
-- data_->using_rust_xml_parser_ = true;
-- return MakeGarbageCollected<XMLDocumentParserRs>(*this, View());
-- } else {
- return MakeGarbageCollected<XMLDocumentParser>(*this, View());
-- }
- }
-
- bool Document::IsFrameSet() const {
---- a/third_party/blink/renderer/core/dom/processing_instruction.cc
-+++ b/third_party/blink/renderer/core/dom/processing_instruction.cc
-@@ -41,7 +41,6 @@
- #include "third_party/blink/renderer/core/svg/graphics/svg_image_chrome_client.h"
- #include "third_party/blink/renderer/core/xml/document_xslt.h"
- #include "third_party/blink/renderer/core/xml/parser/xml_document_parser.h" // for parseAttributes()
--#include "third_party/blink/renderer/core/xml/parser/xml_document_parser_rs.h" // for parseAttributesRust()
- #include "third_party/blink/renderer/core/xml/xsl_style_sheet.h"
- #include "third_party/blink/renderer/core/xml/xslt_processor.h"
- #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
-@@ -145,11 +144,7 @@ void ProcessingInstruction::ProcessAttri
- // ### make sure this gets called when adding from javascript
- bool attrs_ok;
- HashMap<String, String> attrs;
-- if (RuntimeEnabledFeatures::XMLParsingRustEnabled()) {
-- attrs = ParseAttributesRust(data_, attrs_ok);
-- } else {
- attrs = ParseAttributes(data_, attrs_ok);
-- }
- if (!attrs_ok) {
- return;
- }
---- a/third_party/blink/renderer/core/xml/build.gni
-+++ b/third_party/blink/renderer/core/xml/build.gni
-@@ -17,15 +17,11 @@ blink_core_sources_xml = [
- "parser/xhtml_subset.h",
- "parser/xml_document_parser.cc",
- "parser/xml_document_parser.h",
-- "parser/xml_document_parser_rs.cc",
-- "parser/xml_document_parser_rs.h",
- "parser/xml_document_parser_scope.cc",
- "parser/xml_document_parser_scope.h",
- "parser/xml_errors.cc",
- "parser/xml_errors.h",
- "parser/xml_parser_input.h",
-- "parser/xml_ffi_callbacks.cc",
-- "parser/xml_ffi_callbacks.h",
- "xml_serializer.cc",
- "xml_serializer.h",
- "xpath_evaluator.cc",
---- a/third_party/breakpad/BUILD.gn
-+++ b/third_party/breakpad/BUILD.gn
-@@ -746,12 +746,6 @@ if (is_linux || is_chromeos || is_androi
-
- include_dirs = [ "breakpad/src" ]
-
-- # Rust demangle support.
-- deps = [ "//third_party/rust/rustc_demangle_capi/v0_1:lib" ]
-- defines += [ "HAVE_RUSTC_DEMANGLE" ]
-- include_dirs += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/include" ]
-- sources += [ "//third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/include/rustc_demangle.h" ]
--
- libs = [ "z" ]
- }
- } else if (current_toolchain == default_toolchain) {
diff --git a/www-client/ungoogled-chromium/files/chromium-browser.xml b/www-client/ungoogled-chromium/files/chromium-browser.xml
deleted file mode 100644
index 2c95a5584b33..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-browser.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE default-apps SYSTEM "gnome-da-list.dtd">
-<default-apps>
- <web-browsers>
- <web-browser>
- <name>Chromium</name>
- <executable>chromium-browser</executable>
- <command>chromium-browser %s</command>
- <icon-name>chromium-browser</icon-name>
- <run-in-terminal>false</run-in-terminal>
- </web-browser>
- </web-browsers>
-</default-apps>
diff --git a/www-client/ungoogled-chromium/files/chromium-cross-compile.patch b/www-client/ungoogled-chromium/files/chromium-cross-compile.patch
deleted file mode 100644
index 430ceb7a4924..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-cross-compile.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/build/toolchain/linux/unbundle/BUILD.gn
-+++ b/build/toolchain/linux/unbundle/BUILD.gn
-@@ -35,7 +35,7 @@ gcc_toolchain("host") {
- extra_ldflags = getenv("BUILD_LDFLAGS")
-
- toolchain_args = {
-- current_cpu = current_cpu
-- current_os = current_os
-+ current_cpu = host_cpu
-+ current_os = host_os
- }
- }
diff --git a/www-client/ungoogled-chromium/files/chromium-launcher-r7.sh b/www-client/ungoogled-chromium/files/chromium-launcher-r7.sh
deleted file mode 100644
index 1163ff3ddc09..000000000000
--- a/www-client/ungoogled-chromium/files/chromium-launcher-r7.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/bash
-
-# Allow the user to override command-line flags, bug #357629.
-# This is based on Debian's chromium-browser package, and is intended
-# to be consistent with Debian.
-for f in /etc/chromium/*; do
- [[ -f ${f} ]] && source "${f}"
-done
-
-# Prefer user defined CHROMIUM_USER_FLAGS (from env) over system
-# default CHROMIUM_FLAGS (from /etc/chromium/default).
-CHROMIUM_FLAGS=${CHROMIUM_USER_FLAGS:-"$CHROMIUM_FLAGS"}
-
-# Let the wrapped binary know that it has been run through the wrapper
-export CHROME_WRAPPER=$(readlink -f "$0")
-
-PROGDIR=${CHROME_WRAPPER%/*}
-
-case ":$PATH:" in
- *:$PROGDIR:*)
- # $PATH already contains $PROGDIR
- ;;
- *)
- # Append $PROGDIR to $PATH
- export PATH="$PATH:$PROGDIR"
- ;;
-esac
-
-if [[ ${EUID} == 0 && -O ${XDG_CONFIG_HOME:-${HOME}} ]]; then
- # Running as root with HOME owned by root.
- # Pass --user-data-dir to work around upstream failsafe.
- CHROMIUM_FLAGS="--user-data-dir=${XDG_CONFIG_HOME:-${HOME}/.config}/chromium
- ${CHROMIUM_FLAGS}"
-fi
-
-# Select session type and platform
-if @@OZONE_AUTO_SESSION@@; then
- platform=
- if [[ ${XDG_SESSION_TYPE} == x11 ]]; then
- platform=x11
- elif [[ ${XDG_SESSION_TYPE} == wayland ]]; then
- platform=wayland
- else
- if [[ -n ${WAYLAND_DISPLAY} ]]; then
- platform=wayland
- else
- platform=x11
- fi
- fi
- if ${DISABLE_OZONE_PLATFORM:-false}; then
- platform=x11
- fi
- CHROMIUM_FLAGS="--ozone-platform=${platform} ${CHROMIUM_FLAGS}"
-fi
-
-# Set the .desktop file name
-export CHROME_DESKTOP="chromium-browser-chromium.desktop"
-
-exec -a "chromium-browser" "$PROGDIR/chrome" --extra-plugin-dir=/usr/lib/nsbrowser/plugins ${CHROMIUM_FLAGS} "$@"
diff --git a/www-client/ungoogled-chromium/files/chromium.default b/www-client/ungoogled-chromium/files/chromium.default
deleted file mode 100644
index 15e1ed3204f3..000000000000
--- a/www-client/ungoogled-chromium/files/chromium.default
+++ /dev/null
@@ -1,10 +0,0 @@
-# Default settings for ungoogled-chromium. This file is sourced by /bin/bash
-# from the chromium launcher.
-
-# Uncomment this to spoof timezone to UTC
-#export TZ='Etc/UTC'
-
-# Options to pass to ungoogled-chromium.
-# See https://github.com/ungoogled-software/ungoogled-chromium#feature-overview for additional
-# command-line switches.
-#CHROMIUM_FLAGS=""
diff --git a/www-client/ungoogled-chromium/files/compiler.patch b/www-client/ungoogled-chromium/files/compiler.patch
deleted file mode 100644
index 8817ecbdd7ec..000000000000
--- a/www-client/ungoogled-chromium/files/compiler.patch
+++ /dev/null
@@ -1,340 +0,0 @@
-From 00683131977068f7ab8b44e919d03a453fb8fb8c Mon Sep 17 00:00:00 2001
-From: Matt Jolly <Matt.Jolly@footclan.ninja>
-Date: Wed, 7 Aug 2024 20:12:06 +1000
-Subject: [PATCH] This patch configures the Chromium build to work
-
-... with Gentoo.
-
-This includes things like disabling rust nightly features.
---- a/build/config/compiler/BUILD.gn
-+++ b/build/config/compiler/BUILD.gn
-@@ -305,9 +305,6 @@ config("compiler") {
-
- configs += [
- # See the definitions below.
-- ":clang_revision",
-- ":rustc_revision",
-- ":compiler_cpu_abi",
- ":compiler_codegen",
- ":compiler_deterministic",
- ]
-@@ -556,54 +556,6 @@
- ldflags += [ "-Wl,-z,keep-text-section-prefix" ]
- }
-
-- if (is_clang && !is_nacl) {
-- cflags += [ "-fcrash-diagnostics-dir=" + clang_diagnostic_dir ]
-- if (save_reproducers_on_lld_crash && use_lld) {
-- ldflags += [
-- "-fcrash-diagnostics=all",
-- "-fcrash-diagnostics-dir=" + clang_diagnostic_dir,
-- ]
-- }
--
-- # TODO(hans): Remove this once Clang generates better optimized debug info
-- # by default. https://crbug.com/765793
-- cflags += [
-- "-mllvm",
-- "-instcombine-lower-dbg-declare=0",
-- ]
-- if (!is_debug && use_thin_lto && is_a_target_toolchain) {
-- if (is_win) {
-- ldflags += [ "-mllvm:-instcombine-lower-dbg-declare=0" ]
-- } else {
-- ldflags += [ "-Wl,-mllvm,-instcombine-lower-dbg-declare=0" ]
-- }
-- }
--
-- # TODO(crbug.com/40283598): This causes binary size growth and potentially
-- # other problems.
-- # TODO(crbug.com/40284925): This isn't supported by Cronet's mainline llvm version.
-- if (default_toolchain != "//build/toolchain/cros:target" &&
-- !llvm_android_mainline) {
-- cflags += [
-- "-mllvm",
-- "-split-threshold-for-reg-with-hint=0",
-- ]
-- if (use_thin_lto && is_a_target_toolchain) {
-- if (is_win) {
-- ldflags += [ "-mllvm:-split-threshold-for-reg-with-hint=0" ]
-- } else {
-- ldflags += [ "-Wl,-mllvm,-split-threshold-for-reg-with-hint=0" ]
-- }
-- }
-- }
--
-- # TODO(crbug.com/40192287): Investigate why/if this should be needed.
-- if (is_win) {
-- cflags += [ "/clang:-ffp-contract=off" ]
-- } else {
-- cflags += [ "-ffp-contract=off" ]
-- }
-- }
-
- # C11/C++11 compiler flags setup.
- # ---------------------------
-@@ -712,7 +660,7 @@ config("compiler") {
-
- cflags += [
- "-flto=thin",
-- "-fsplit-lto-unit",
-+ "-fno-split-lto-unit",
- ]
-
- if (thin_lto_enable_cache) {
-@@ -813,14 +761,12 @@ config("compiler") {
- # TODO(crbug.com/40182783): investigate why this isn't effective on
- # arm32.
- if (!is_android || current_cpu == "arm64") {
-- cflags += [ "-fwhole-program-vtables" ]
-
- if (toolchain_supports_rust_thin_lto) {
- # whole-program-vtables implies -fsplit-lto-unit, and Rust needs to match
- # behaviour. Rust needs to know the linker will be doing LTO in this case
- # or it rejects the Zsplit-lto-unit flag.
- rustflags += [
-- "-Zsplit-lto-unit",
- "-Clinker-plugin-lto=yes",
- ]
- } else {
-@@ -828,9 +774,6 @@ config("compiler") {
- rustflags += [ "-Cembed-bitcode=no" ]
- }
-
-- if (!is_win) {
-- ldflags += [ "-fwhole-program-vtables" ]
-- }
- }
-
- # This flag causes LTO to create an .ARM.attributes section with the correct
-@@ -1010,17 +953,6 @@ config("compiler") {
- # `-nodefaultlibs` from the linker invocation from Rust, which would be used
- # to compile dylibs on Android, such as for constructing unit test APKs.
- "-Cdefault-linker-libraries",
--
-- # To make Rust .d files compatible with ninja
-- "-Zdep-info-omit-d-target",
--
-- # If a macro panics during compilation, show which macro and where it is
-- # defined.
-- "-Zmacro-backtrace",
--
-- # For deterministic builds, keep the local machine's current working
-- # directory from appearing in build outputs.
-- "-Zremap-cwd-prefix=.",
- ]
-
- if (!is_win || force_rustc_color_output) {
-@@ -1540,51 +1492,6 @@
- }
- }
-
-- # Makes builds independent of absolute file path.
-- if (is_clang && strip_absolute_paths_from_debug_symbols) {
-- # If debug option is given, clang includes $cwd in debug info by default.
-- # For such build, this flag generates reproducible obj files even we use
-- # different build directory like "out/feature_a" and "out/feature_b" if
-- # we build same files with same compile flag.
-- # Other paths are already given in relative, no need to normalize them.
-- if (is_nacl) {
-- # TODO(https://crbug.com/1231236): Use -ffile-compilation-dir= here.
-- cflags += [
-- "-Xclang",
-- "-fdebug-compilation-dir",
-- "-Xclang",
-- ".",
-- ]
-- } else {
-- # -ffile-compilation-dir is an alias for both -fdebug-compilation-dir=
-- # and -fcoverage-compilation-dir=.
-- cflags += [ "-ffile-compilation-dir=." ]
--
-- # Convert absolute paths to relative paths. Expands to, for example:
-- # -file-prefix-map /path/to/chromium/src=../..
-- swiftflags += [
-- "-file-prefix-map",
-- rebase_path("//.", "") + "=" + rebase_path("//.", root_build_dir),
-- ]
-- }
-- if (!is_win) {
-- # We don't use clang -cc1as on Windows (yet? https://crbug.com/762167)
-- asmflags = [ "-Wa,-fdebug-compilation-dir,." ]
-- }
--
-- if (is_win && use_lld) {
-- if (symbol_level == 2 || (is_clang && using_sanitizer)) {
-- # Absolutize source file paths for PDB. Pass the real build directory
-- # if the pdb contains source-level debug information and if linker
-- # reproducibility is not critical.
-- ldflags += [ "/PDBSourcePath:" + rebase_path(root_build_dir) ]
-- } else {
-- # Use a fake fixed base directory for paths in the pdb to make the pdb
-- # output fully deterministic and independent of the build directory.
-- ldflags += [ "/PDBSourcePath:o:\fake\prefix" ]
-- }
-- }
-- }
-
- # Tells the compiler not to use absolute paths when passing the default
- # paths to the tools it invokes. We don't want this because we don't
-@@ -1604,39 +1511,6 @@
- }
- }
-
--config("clang_revision") {
-- if (is_clang && clang_base_path == default_clang_base_path &&
-- current_os != "zos") {
-- update_args = [
-- "--print-revision",
-- "--verify-version=$clang_version",
-- ]
-- if (llvm_force_head_revision) {
-- update_args += [ "--llvm-force-head-revision" ]
-- }
-- clang_revision = exec_script("//tools/clang/scripts/update.py",
-- update_args,
-- "trim string")
--
-- # This is here so that all files get recompiled after a clang roll and
-- # when turning clang on or off. (defines are passed via the command line,
-- # and build system rebuild things when their commandline changes). Nothing
-- # should ever read this define.
-- defines = [ "CR_CLANG_REVISION=\"$clang_revision\"" ]
-- }
--}
--
--config("rustc_revision") {
-- if (rustc_revision != "") {
-- # Similar to the above config, this is here so that all files get recompiled
-- # after a rustc roll. Nothing should ever read this cfg. This will not be
-- # set if a custom toolchain is used.
-- rustflags = [
-- "--cfg",
-- "cr_rustc_revision=\"$rustc_revision\"",
-- ]
-- }
--}
-
- config("compiler_arm_fpu") {
- if (current_cpu == "arm" && !is_ios && !is_nacl) {
-@@ -2006,11 +1865,7 @@ config("chromium_code") {
- defines = [ "_HAS_NODISCARD" ]
- }
- } else {
-- cflags = [ "-Wall" ]
-- if (is_clang) {
-- # Enable extra warnings for chromium_code when we control the compiler.
-- cflags += [ "-Wextra" ]
-- }
-+ cflags = []
-
- # In Chromium code, we define __STDC_foo_MACROS in order to get the
- # C99 macros on Mac and Linux.
-@@ -2019,24 +1874,6 @@ config("chromium_code") {
- "__STDC_FORMAT_MACROS",
- ]
-
-- if (!is_debug && !using_sanitizer && current_cpu != "s390x" &&
-- current_cpu != "s390" && current_cpu != "ppc64" &&
-- current_cpu != "mips" && current_cpu != "mips64" &&
-- current_cpu != "riscv64" && current_cpu != "loong64") {
-- # Non-chromium code is not guaranteed to compile cleanly with
-- # _FORTIFY_SOURCE. Also, fortified build may fail when optimizations are
-- # disabled, so only do that for Release build.
-- fortify_level = "2"
--
-- # ChromeOS's toolchain supports a high-quality _FORTIFY_SOURCE=3
-- # implementation with a few custom glibc patches. Use that if it's
-- # available.
-- if (is_chromeos_device && !lacros_use_chromium_toolchain) {
-- fortify_level = "3"
-- }
-- defines += [ "_FORTIFY_SOURCE=" + fortify_level ]
-- }
--
- if (is_apple) {
- cflags_objc = [ "-Wimplicit-retain-self" ]
- cflags_objcc = [ "-Wimplicit-retain-self" ]
-@@ -2429,7 +2266,8 @@ config("default_stack_frames") {
- # [0]: https://pinpoint-dot-chromeperf.appspot.com/job/147634a8be0000
- # [1]: https://pinpoint-dot-chromeperf.appspot.com/job/132bc772be0000
- # [2]: https://crrev.com/c/5447532
--config("optimize") {
-+config("optimize") { }
-+config("xoptimize") {
- if (is_win) {
- cflags = [ "/O2" ] + common_optimize_on_cflags
-
-@@ -2470,7 +2308,8 @@ config("optimize") {
- }
-
- # Turn off optimizations.
--config("no_optimize") {
-+config("no_optimize") { }
-+config("xno_optimize") {
- if (is_win) {
- cflags = [
- "/Od", # Disable optimization.
-@@ -2510,7 +2349,8 @@ config("no_optimize") {
- # Turns up the optimization level. Used to explicitly enable -O2 instead of
- # -Os for select targets on platforms that use optimize_for_size. No-op
- # elsewhere.
--config("optimize_max") {
-+config("optimize_max") { }
-+config("xoptimize_max") {
- if (is_nacl && is_nacl_irt) {
- # The NaCl IRT is a special case and always wants its own config.
- # Various components do:
-@@ -2543,7 +2383,8 @@ config("optimize_max") {
- #
- # TODO(crbug.com/41259697) - rework how all of these configs are related
- # so that we don't need this disclaimer.
--config("optimize_speed") {
-+config("optimize_speed") { }
-+config("xoptimize_speed") {
- if (is_nacl && is_nacl_irt) {
- # The NaCl IRT is a special case and always wants its own config.
- # Various components do:
-@@ -2572,7 +2413,8 @@ config("optimize_speed") {
- }
- }
-
--config("optimize_fuzzing") {
-+config("optimize_fuzzing") { }
-+config("xoptimize_fuzzing") {
- cflags = [ "-O1" ] + common_optimize_on_cflags
- rustflags = [ "-Copt-level=1" ]
- ldflags = common_optimize_on_ldflags
-@@ -2705,7 +2547,8 @@ config("win_pdbaltpath") {
- }
-
- # Full symbols.
--config("symbols") {
-+config("symbols") { }
-+config("xsymbols") {
- rustflags = []
- if (is_win) {
- if (is_clang) {
-@@ -2855,7 +2698,8 @@ config("symbols") {
- # Minimal symbols.
- # This config guarantees to hold symbol for stack trace which are shown to user
- # when crash happens in unittests running on buildbot.
--config("minimal_symbols") {
-+config("minimal_symbols") { }
-+config("xminimal_symbols") {
- rustflags = []
- if (is_win) {
- # Functions, files, and line tables only.
-@@ -2940,7 +2784,8 @@ config("minimal_symbols") {
- # This configuration contains function names only. That is, the compiler is
- # told to not generate debug information and the linker then just puts function
- # names in the final debug information.
--config("no_symbols") {
-+config("no_symbols") { }
-+config("xno_symbols") {
- if (is_win) {
- ldflags = [ "/DEBUG" ]
-
---
-2.45.2
-
diff --git a/www-client/ungoogled-chromium/files/font-gc-asan.patch b/www-client/ungoogled-chromium/files/font-gc-asan.patch
deleted file mode 100644
index a34efee3f6cf..000000000000
--- a/www-client/ungoogled-chromium/files/font-gc-asan.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-author: Andres Salomon <dilinger@queued.net>
-
-This is a workaround for the various issues around fonts being garbage
-collected instead of manually refcounted and freed. Crashes show up when
-using gcc's libstdc++ but not with llvm's libc++, because apparently
-llvm's libc++ doesn't care if string destructors are called on invalid
-strings. But gcc's libstdc++ does, as does upstream's ASAN builds (which
-manually track/validate memory usage). So upstream created this ASAN
-workaround - however, GCC needs it also.
-
-This should go upstream, but in a form that selects for GCC and
-clang with libstdc++.
-
-Also, TODO: check if that DCHECK() is actually doing something useful
-on ASAN builds, or if it's optimized away and/or calling has_value() is
-actually truly a sanity check.
-
-upstream ASAN fixes: https://chromium-review.googlesource.com/c/chromium/src/+/5629253
-
---- a/third_party/blink/renderer/platform/fonts/font_face_creation_params.h
-+++ b/third_party/blink/renderer/platform/fonts/font_face_creation_params.h
-@@ -79,8 +79,11 @@ class FontFaceCreationParams {
- }
- const std::string& Filename() const {
- DCHECK_EQ(creation_type_, kCreateFontByFciIdAndTtcIndex);
--#if defined(ADDRESS_SANITIZER)
-- DCHECK(filename_.has_value());
-+#if 1
-+ //DCHECK(filename_.has_value());
-+ if (!filename_.has_value()) {
-+ LOG(ERROR) << "filename has no value!";
-+ }
- return *filename_;
- #else
- return filename_;
-@@ -126,7 +129,7 @@ class FontFaceCreationParams {
- AtomicString family_;
-
- void SetFilename(std::string& filename) {
--#if defined(ADDRESS_SANITIZER)
-+#if 1
- *filename_ = filename;
- #else
- filename_ = filename;
-@@ -134,7 +137,7 @@ class FontFaceCreationParams {
- }
-
- bool FilenameEqual(const FontFaceCreationParams& other) const {
--#if defined(ADDRESS_SANITIZER)
-+#if 1
- if (!filename_.has_value() || !other.filename_.has_value()) {
- return filename_.has_value() == other.filename_.has_value();
- }
-@@ -145,14 +148,14 @@ class FontFaceCreationParams {
- }
-
- bool HasFilename() const {
--#if defined(ADDRESS_SANITIZER)
-+#if 1
- return filename_.has_value();
- #else
- return true;
- #endif
- }
-
--#if defined(ADDRESS_SANITIZER)
-+#if 1
- // We put the `std::string` behind an optional as ASAN counter checks require
- // that we properly call constructors and destructors for all strings. This is
- // not the case when `FontFaceCreationParams` is used in `WTF::HashMap` as key
diff --git a/www-client/ungoogled-chromium/files/font_format_check.cc b/www-client/ungoogled-chromium/files/font_format_check.cc
deleted file mode 100644
index 8b75a6abb757..000000000000
--- a/www-client/ungoogled-chromium/files/font_format_check.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/platform/fonts/opentype/font_format_check.h"
-
-// Include HarfBuzz to have a cross-platform way to retrieve table tags without
-// having to rely on the platform being able to instantiate this font format.
-#include <hb.h>
-
-#include <hb-cplusplus.hh>
-
-#include "base/containers/span.h"
-#include "base/numerics/byte_conversions.h"
-#include "third_party/blink/renderer/platform/wtf/vector.h"
-#include "third_party/skia/include/core/SkTypeface.h"
-
-namespace blink {
-
-namespace {
-
-FontFormatCheck::COLRVersion determineCOLRVersion(
- const FontFormatCheck::TableTagsVector& table_tags,
- const hb_face_t* face) {
- const hb_tag_t kCOLRTag = HB_TAG('C', 'O', 'L', 'R');
-
- // Only try to read version if header size is sufficient.
- // https://docs.microsoft.com/en-us/typography/opentype/spec/colr#header
- const unsigned int kMinCOLRHeaderSize = 14;
- if (table_tags.size() && table_tags.Contains(kCOLRTag) &&
- table_tags.Contains(HB_TAG('C', 'P', 'A', 'L'))) {
- hb::unique_ptr<hb_blob_t> table_blob(
- hb_face_reference_table(face, kCOLRTag));
- if (hb_blob_get_length(table_blob.get()) < kMinCOLRHeaderSize)
- return FontFormatCheck::COLRVersion::kNoCOLR;
-
- unsigned required_bytes_count = 2u;
- const char* colr_ptr =
- hb_blob_get_data(table_blob.get(), &required_bytes_count);
- base::span<const uint8_t> colr_data = base::as_bytes(
- // SAFETY: hb_blob_get_data() populates the 2nd argument with the
- // number of bytes at the returned pointer.
- UNSAFE_BUFFERS(base::span(colr_ptr, required_bytes_count)));
-
- if (colr_data.size() < 2u) {
- return FontFormatCheck::COLRVersion::kNoCOLR;
- }
- uint16_t colr_version = base::U16FromBigEndian(colr_data.first<2u>());
-
- if (colr_version == 0)
- return FontFormatCheck::COLRVersion::kCOLRV0;
- else if (colr_version == 1)
- return FontFormatCheck::COLRVersion::kCOLRV1;
- }
- return FontFormatCheck::COLRVersion::kNoCOLR;
-}
-
-} // namespace
-
-FontFormatCheck::FontFormatCheck(sk_sp<SkData> sk_data) {
- hb::unique_ptr<hb_blob_t> font_blob(
- hb_blob_create(reinterpret_cast<const char*>(sk_data->bytes()),
- base::checked_cast<unsigned>(sk_data->size()),
- HB_MEMORY_MODE_READONLY, nullptr, nullptr));
- hb::unique_ptr<hb_face_t> face(hb_face_create(font_blob.get(), 0));
-
- unsigned table_count = 0;
- table_count = hb_face_get_table_tags(face.get(), 0, nullptr, nullptr);
- table_tags_.resize(table_count);
- if (!hb_face_get_table_tags(face.get(), 0, &table_count, table_tags_.data()))
- table_tags_.resize(0);
-
- colr_version_ = determineCOLRVersion(table_tags_, face.get());
-}
-
-bool FontFormatCheck::IsVariableFont() const {
- return table_tags_.size() && table_tags_.Contains(HB_TAG('f', 'v', 'a', 'r'));
-}
-
-bool FontFormatCheck::IsCbdtCblcColorFont() const {
- return table_tags_.size() &&
- table_tags_.Contains(HB_TAG('C', 'B', 'D', 'T')) &&
- table_tags_.Contains(HB_TAG('C', 'B', 'L', 'C'));
-}
-
-bool FontFormatCheck::IsColrCpalColorFontV0() const {
- return colr_version_ == COLRVersion::kCOLRV0;
-}
-
-bool FontFormatCheck::IsColrCpalColorFontV1() const {
- return colr_version_ == COLRVersion::kCOLRV1;
-}
-
-bool FontFormatCheck::IsVariableColrV0Font() const {
- return IsColrCpalColorFontV0() && IsVariableFont();
-}
-
-bool FontFormatCheck::IsSbixColorFont() const {
- return table_tags_.size() && table_tags_.Contains(HB_TAG('s', 'b', 'i', 'x'));
-}
-
-bool FontFormatCheck::IsCff2OutlineFont() const {
- return table_tags_.size() && table_tags_.Contains(HB_TAG('C', 'F', 'F', '2'));
-}
-
-bool FontFormatCheck::IsColorFont() const {
- return IsCbdtCblcColorFont() || IsColrCpalColorFont() || IsSbixColorFont();
-}
-
-FontFormatCheck::VariableFontSubType FontFormatCheck::ProbeVariableFont(
- sk_sp<SkTypeface> typeface) {
- if (!typeface->getTableSize(
- SkFontTableTag(SkSetFourByteTag('f', 'v', 'a', 'r'))))
- return VariableFontSubType::kNotVariable;
-
- if (typeface->getTableSize(
- SkFontTableTag(SkSetFourByteTag('C', 'F', 'F', '2'))))
- return VariableFontSubType::kVariableCFF2;
- return VariableFontSubType::kVariableTrueType;
-}
-
-} // namespace blink
diff --git a/www-client/ungoogled-chromium/files/font_format_check.h b/www-client/ungoogled-chromium/files/font_format_check.h
deleted file mode 100644
index 824cf32403d2..000000000000
--- a/www-client/ungoogled-chromium/files/font_format_check.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_OPENTYPE_FONT_FORMAT_CHECK_H_
-#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_OPENTYPE_FONT_FORMAT_CHECK_H_
-
-#include "third_party/blink/renderer/platform/platform_export.h"
-#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
-#include "third_party/blink/renderer/platform/wtf/vector.h"
-#include "third_party/skia/include/core/SkData.h"
-#include "third_party/skia/include/core/SkRefCnt.h"
-#include "third_party/skia/include/core/SkTypeface.h"
-
-namespace blink {
-
-class PLATFORM_EXPORT FontFormatCheck {
- STACK_ALLOCATED();
-
- public:
- explicit FontFormatCheck(sk_sp<SkData>);
- virtual ~FontFormatCheck() = default;
- virtual bool IsVariableFont() const;
- virtual bool IsCbdtCblcColorFont() const;
- virtual bool IsColrCpalColorFont() const {
- return IsColrCpalColorFontV0() || IsColrCpalColorFontV1();
- }
- virtual bool IsColrCpalColorFontV0() const;
- virtual bool IsColrCpalColorFontV1() const;
- bool IsVariableColrV0Font() const;
- virtual bool IsSbixColorFont() const;
- virtual bool IsCff2OutlineFont() const;
- bool IsColorFont() const;
-
- // Still needed in FontCustomPlatformData.
- enum class VariableFontSubType {
- kNotVariable,
- kVariableTrueType,
- kVariableCFF2
- };
-
- static VariableFontSubType ProbeVariableFont(sk_sp<SkTypeface>);
-
- // hb-common.h: typedef uint32_t hb_tag_t;
- using TableTagsVector = Vector<uint32_t>;
-
- enum class COLRVersion { kCOLRV0, kCOLRV1, kNoCOLR };
-
- private:
- TableTagsVector table_tags_;
- COLRVersion colr_version_ = COLRVersion::kNoCOLR;
-};
-
-} // namespace blink
-
-#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_OPENTYPE_FONT_FORMAT_CHECK_H_
diff --git a/www-client/ungoogled-chromium/files/json_parser.cc b/www-client/ungoogled-chromium/files/json_parser.cc
deleted file mode 100644
index 0873aa1f8240..000000000000
--- a/www-client/ungoogled-chromium/files/json_parser.cc
+++ /dev/null
@@ -1,872 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/json/json_parser.h"
-
-#include <algorithm>
-#include <cmath>
-#include <iterator>
-#include <memory>
-#include <string_view>
-#include <utility>
-#include <vector>
-
-#include "base/check_op.h"
-#include "base/compiler_specific.h"
-#include "base/feature_list.h"
-#include "base/features.h"
-#include "base/json/json_reader.h"
-#include "base/notreached.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/third_party/icu/icu_utf.h"
-#include "base/types/pass_key.h"
-
-namespace base::internal {
-
-namespace {
-
-// Values 1000 and above are used by JSONFileValueSerializer::JsonFileError.
-static_assert(JSONParser::JSON_PARSE_ERROR_COUNT < 1000,
- "JSONParser error out of bounds");
-
-std::string ErrorCodeToString(JSONParser::JsonParseError error_code) {
- switch (error_code) {
- case JSONParser::JSON_NO_ERROR:
- return std::string();
- case JSONParser::JSON_SYNTAX_ERROR:
- return JSONParser::kSyntaxError;
- case JSONParser::JSON_INVALID_ESCAPE:
- return JSONParser::kInvalidEscape;
- case JSONParser::JSON_UNEXPECTED_TOKEN:
- return JSONParser::kUnexpectedToken;
- case JSONParser::JSON_TRAILING_COMMA:
- return JSONParser::kTrailingComma;
- case JSONParser::JSON_TOO_MUCH_NESTING:
- return JSONParser::kTooMuchNesting;
- case JSONParser::JSON_UNEXPECTED_DATA_AFTER_ROOT:
- return JSONParser::kUnexpectedDataAfterRoot;
- case JSONParser::JSON_UNSUPPORTED_ENCODING:
- return JSONParser::kUnsupportedEncoding;
- case JSONParser::JSON_UNQUOTED_DICTIONARY_KEY:
- return JSONParser::kUnquotedDictionaryKey;
- case JSONParser::JSON_UNREPRESENTABLE_NUMBER:
- return JSONParser::kUnrepresentableNumber;
- case JSONParser::JSON_PARSE_ERROR_COUNT:
- NOTREACHED();
- }
- NOTREACHED();
-}
-
-const int32_t kExtendedASCIIStart = 0x80;
-constexpr base_icu::UChar32 kUnicodeReplacementPoint = 0xFFFD;
-
-// UnprefixedHexStringToInt acts like |HexStringToInt|, but enforces that the
-// input consists purely of hex digits. I.e. no "0x" nor "OX" prefix is
-// permitted.
-bool UnprefixedHexStringToInt(std::string_view input, int* output) {
- for (char i : input) {
- if (!IsHexDigit(i)) {
- return false;
- }
- }
- return HexStringToInt(input, output);
-}
-
-} // namespace
-
-// This is U+FFFD.
-const char kUnicodeReplacementString[] = "\xEF\xBF\xBD";
-
-const char JSONParser::kSyntaxError[] = "Syntax error.";
-const char JSONParser::kInvalidEscape[] = "Invalid escape sequence.";
-const char JSONParser::kUnexpectedToken[] = "Unexpected token.";
-const char JSONParser::kTrailingComma[] = "Trailing comma not allowed.";
-const char JSONParser::kTooMuchNesting[] = "Too much nesting.";
-const char JSONParser::kUnexpectedDataAfterRoot[] =
- "Unexpected data after root element.";
-const char JSONParser::kUnsupportedEncoding[] =
- "Unsupported encoding. JSON must be UTF-8.";
-const char JSONParser::kUnquotedDictionaryKey[] =
- "Dictionary keys must be quoted.";
-const char JSONParser::kUnrepresentableNumber[] =
- "Number cannot be represented.";
-
-JSONParser::JSONParser(int options, size_t max_depth)
- : options_(options),
- max_depth_(max_depth),
- index_(0),
- stack_depth_(0),
- line_number_(0),
- index_last_line_(0),
- error_code_(JSON_NO_ERROR),
- error_line_(0),
- error_column_(0) {
- CHECK_LE(max_depth, kAbsoluteMaxDepth);
-}
-
-JSONParser::~JSONParser() = default;
-
-std::optional<Value> JSONParser::Parse(std::string_view input) {
- input_ = input;
- index_ = 0;
- // Line and column counting is 1-based, but |index_| is 0-based. For example,
- // if input is "Aaa\nB" then 'A' and 'B' are both in column 1 (at lines 1 and
- // 2) and have indexes of 0 and 4. We track the line number explicitly (the
- // |line_number_| field) and the column number implicitly (the difference
- // between |index_| and |index_last_line_|). In calculating that difference,
- // |index_last_line_| is the index of the '\r' or '\n', not the index of the
- // first byte after the '\n'. For the 'B' in "Aaa\nB", its |index_| and
- // |index_last_line_| would be 4 and 3: 'B' is in column (4 - 3) = 1. We
- // initialize |index_last_line_| to -1, not 0, since -1 is the (out of range)
- // index of the imaginary '\n' immediately before the start of the string:
- // 'A' is in column (0 - -1) = 1.
- line_number_ = 1;
- index_last_line_ = static_cast<size_t>(-1);
-
- error_code_ = JSON_NO_ERROR;
- error_line_ = 0;
- error_column_ = 0;
-
- // When the input JSON string starts with a UTF-8 Byte-Order-Mark,
- // advance the start position to avoid the ParseNextToken function mis-
- // treating a Unicode BOM as an invalid character and returning NULL.
- ConsumeIfMatch("\xEF\xBB\xBF");
-
- // Parse the first and any nested tokens.
- std::optional<Value> root(ParseNextToken());
- if (!root) {
- return std::nullopt;
- }
-
- // Make sure the input stream is at an end.
- if (GetNextToken() != T_END_OF_INPUT) {
- ReportError(JSON_UNEXPECTED_DATA_AFTER_ROOT, 0);
- return std::nullopt;
- }
-
- return root;
-}
-
-JSONParser::JsonParseError JSONParser::error_code() const {
- return error_code_;
-}
-
-std::string JSONParser::GetErrorMessage() const {
- return FormatErrorMessage(error_line_, error_column_,
- ErrorCodeToString(error_code_));
-}
-
-int JSONParser::error_line() const {
- return error_line_;
-}
-
-int JSONParser::error_column() const {
- return error_column_;
-}
-
-// JSONParser private //////////////////////////////////////////////////////////
-
-std::optional<std::string_view> JSONParser::PeekChars(size_t count) {
- if (count > input_.length() - index_) {
- return std::nullopt;
- }
- // Using string_view::substr() was historically significantly slower
- // (according to base_perftests) than constructing a substring manually.
- //
- // TODO(crbug.com/40284755): Is this still the case? Ideally the bounds check
- // performed by substr would be deleted by the optimizer for being redundant
- // with the runtime check above. However, to do so, the compiler would need
- // to know `index_ <= input_.length()` is a class invariant. If we
- // restructured the code so that we only stored the remaining data, that
- // would avoid this, but it would prevent rewinding (the places in this file
- // which look at `input_[index_ - 1]`.)
- return UNSAFE_BUFFERS(std::string_view(input_.data() + index_, count));
-}
-
-std::optional<char> JSONParser::PeekChar() {
- std::optional<std::string_view> chars = PeekChars(1);
- if (chars) {
- return (*chars)[0];
- }
- return std::nullopt;
-}
-
-std::optional<std::string_view> JSONParser::ConsumeChars(size_t count) {
- std::optional<std::string_view> chars = PeekChars(count);
- if (chars) {
- index_ += count;
- }
- return chars;
-}
-
-std::optional<char> JSONParser::ConsumeChar() {
- std::optional<std::string_view> chars = ConsumeChars(1);
- if (chars) {
- return (*chars)[0];
- }
- return std::nullopt;
-}
-
-const char* JSONParser::pos() {
- CHECK_LE(index_, input_.length());
- // SAFETY: Checked above.
- return UNSAFE_BUFFERS(input_.data() + index_);
-}
-
-JSONParser::Token JSONParser::GetNextToken() {
- EatWhitespaceAndComments();
-
- std::optional<char> c = PeekChar();
- if (!c) {
- return T_END_OF_INPUT;
- }
-
- switch (*c) {
- case '{':
- return T_OBJECT_BEGIN;
- case '}':
- return T_OBJECT_END;
- case '[':
- return T_ARRAY_BEGIN;
- case ']':
- return T_ARRAY_END;
- case '"':
- return T_STRING;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '-':
- return T_NUMBER;
- case 't':
- return T_BOOL_TRUE;
- case 'f':
- return T_BOOL_FALSE;
- case 'n':
- return T_NULL;
- case ',':
- return T_LIST_SEPARATOR;
- case ':':
- return T_OBJECT_PAIR_SEPARATOR;
- default:
- return T_INVALID_TOKEN;
- }
-}
-
-void JSONParser::EatWhitespaceAndComments() {
- while (std::optional<char> c = PeekChar()) {
- switch (*c) {
- case '\r':
- case '\n':
- index_last_line_ = index_;
- // Don't increment line_number_ twice for "\r\n".
- if (!(c == '\n' && index_ > 0 && input_[index_ - 1] == '\r')) {
- ++line_number_;
- }
- [[fallthrough]];
- case ' ':
- case '\t':
- ConsumeChar();
- break;
- case '/':
- if (!EatComment()) {
- return;
- }
- break;
- default:
- return;
- }
- }
-}
-
-bool JSONParser::EatComment() {
- std::optional<std::string_view> comment_start = PeekChars(2);
- if (!comment_start) {
- return false;
- }
-
- const bool comments_allowed = options_ & JSON_ALLOW_COMMENTS;
-
- if (comment_start == "//") {
- if (!comments_allowed) {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return false;
- }
-
- ConsumeChars(2);
- // Single line comment, read to newline.
- while (std::optional<char> c = PeekChar()) {
- if (c == '\n' || c == '\r') {
- return true;
- }
- ConsumeChar();
- }
- } else if (comment_start == "/*") {
- if (!comments_allowed) {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return false;
- }
-
- ConsumeChars(2);
- char previous_char = '\0';
- // Block comment, read until end marker.
- while (std::optional<char> c = PeekChar()) {
- if (previous_char == '*' && c == '/') {
- // EatWhitespaceAndComments will inspect pos(), which will still be on
- // the last / of the comment, so advance once more (which may also be
- // end of input).
- ConsumeChar();
- return true;
- }
- previous_char = *ConsumeChar();
- }
-
- // If the comment is unterminated, GetNextToken will report T_END_OF_INPUT.
- }
-
- return false;
-}
-
-std::optional<Value> JSONParser::ParseNextToken() {
- return ParseToken(GetNextToken());
-}
-
-std::optional<Value> JSONParser::ParseToken(Token token) {
- switch (token) {
- case T_OBJECT_BEGIN:
- return ConsumeDictionary();
- case T_ARRAY_BEGIN:
- return ConsumeList();
- case T_STRING:
- return ConsumeString();
- case T_NUMBER:
- return ConsumeNumber();
- case T_BOOL_TRUE:
- case T_BOOL_FALSE:
- case T_NULL:
- return ConsumeLiteral();
- default:
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-}
-
-std::optional<Value> JSONParser::ConsumeDictionary() {
- if (ConsumeChar() != '{') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- StackMarker depth_check(max_depth_, &stack_depth_);
- if (depth_check.IsTooDeep()) {
- ReportError(JSON_TOO_MUCH_NESTING, -1);
- return std::nullopt;
- }
-
- std::vector<std::pair<std::string, std::unique_ptr<Value>>> values;
-
- Token token = GetNextToken();
- while (token != T_OBJECT_END) {
- if (token != T_STRING) {
- ReportError(JSON_UNQUOTED_DICTIONARY_KEY, 0);
- return std::nullopt;
- }
-
- // First consume the key.
- std::optional<std::string> key = ConsumeStringRaw();
- if (!key) {
- return std::nullopt;
- }
-
- // Read the separator.
- token = GetNextToken();
- if (token != T_OBJECT_PAIR_SEPARATOR) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
-
- // The next token is the value. Ownership transfers to |dict|.
- ConsumeChar();
- std::optional<Value> value = ParseNextToken();
- if (!value) {
- // ReportError from deeper level.
- return std::nullopt;
- }
-
- values.emplace_back(std::move(*key),
- std::make_unique<Value>(std::move(*value)));
-
- token = GetNextToken();
- if (token == T_LIST_SEPARATOR) {
- ConsumeChar();
- token = GetNextToken();
- if (token == T_OBJECT_END && !(options_ & JSON_ALLOW_TRAILING_COMMAS)) {
- ReportError(JSON_TRAILING_COMMA, 0);
- return std::nullopt;
- }
- } else if (token != T_OBJECT_END) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- }
-
- ConsumeChar(); // Closing '}'.
- // Reverse |dict_storage| to keep the last of elements with the same key in
- // the input.
- std::ranges::reverse(values);
- return Value(Value::Dict(PassKey<JSONParser>(), std::move(values)));
-}
-
-std::optional<Value> JSONParser::ConsumeList() {
- if (ConsumeChar() != '[') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- StackMarker depth_check(max_depth_, &stack_depth_);
- if (depth_check.IsTooDeep()) {
- ReportError(JSON_TOO_MUCH_NESTING, -1);
- return std::nullopt;
- }
-
- Value::List list;
-
- Token token = GetNextToken();
- while (token != T_ARRAY_END) {
- std::optional<Value> item = ParseToken(token);
- if (!item) {
- // ReportError from deeper level.
- return std::nullopt;
- }
-
- list.Append(std::move(*item));
-
- token = GetNextToken();
- if (token == T_LIST_SEPARATOR) {
- ConsumeChar();
- token = GetNextToken();
- if (token == T_ARRAY_END && !(options_ & JSON_ALLOW_TRAILING_COMMAS)) {
- ReportError(JSON_TRAILING_COMMA, 0);
- return std::nullopt;
- }
- } else if (token != T_ARRAY_END) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- }
-
- ConsumeChar(); // Closing ']'.
-
- return Value(std::move(list));
-}
-
-std::optional<Value> JSONParser::ConsumeString() {
- std::optional<std::string> string = ConsumeStringRaw();
- if (!string) {
- return std::nullopt;
- }
- return Value(std::move(*string));
-}
-
-std::optional<std::string> JSONParser::ConsumeStringRaw() {
- if (ConsumeChar() != '"') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- std::string string;
- for (;;) {
- auto [result, consumed] = ConsumeStringPart();
- switch (result) {
- case StringResult::kError:
- return std::nullopt;
-
- case StringResult::kDone:
- // This is the last time we're appending, so pre-reserve the desired
- // size, to prevent `+=` from overallocating. (In other cases, the
- // overallocating is desirable for amortization.) In particular,
- // the common case is that `string` is empty and we return in one step.
- string.reserve(string.size() + consumed.size());
- string += consumed;
- return std::move(string);
-
- case StringResult::kReplacementCharacter:
- string += consumed;
- string += kUnicodeReplacementString;
- break; // Keep parsing.
-
- case StringResult::kEscape:
- string += consumed;
- std::optional<char> escape_char = ConsumeChar();
- if (!escape_char) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
-
- switch (*escape_char) {
- // Allowed esape sequences:
- case 'x': { // UTF-8 sequence.
- // UTF-8 \x escape sequences are not allowed in the spec, but they
- // are supported here for backwards-compatiblity with the old
- // parser.
- if (!(options_ & JSON_ALLOW_X_ESCAPES)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
-
- std::optional<std::string_view> escape_sequence = ConsumeChars(2);
- if (!escape_sequence) {
- ReportError(JSON_INVALID_ESCAPE, -3);
- return std::nullopt;
- }
-
- int hex_digit = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &hex_digit)) {
- ReportError(JSON_INVALID_ESCAPE, -3);
- return std::nullopt;
- }
-
- // A two-character hex sequence is at most 0xff and all codepoints
- // up to 0xff are valid.
- DCHECK_LE(hex_digit, 0xff);
- DCHECK(IsValidCharacter(hex_digit));
- WriteUnicodeCharacter(hex_digit, &string);
- break;
- }
- case 'u': { // UTF-16 sequence.
- // UTF units are of the form \uXXXX.
- base_icu::UChar32 code_point;
- if (!DecodeUTF16(&code_point)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- WriteUnicodeCharacter(code_point, &string);
- break;
- }
- case '"':
- string.push_back('"');
- break;
- case '\\':
- string.push_back('\\');
- break;
- case '/':
- string.push_back('/');
- break;
- case 'b':
- string.push_back('\b');
- break;
- case 'f':
- string.push_back('\f');
- break;
- case 'n':
- string.push_back('\n');
- break;
- case 'r':
- string.push_back('\r');
- break;
- case 't':
- string.push_back('\t');
- break;
- case 'v': // Not listed as valid escape sequence in the RFC.
- if (!(options_ & JSON_ALLOW_VERT_TAB)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- string.push_back('\v');
- break;
- // All other escape squences are illegal.
- default:
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- break; // Keep parsing.
- }
- }
-}
-
-std::pair<JSONParser::StringResult, std::string_view>
-JSONParser::ConsumeStringPart() {
- const size_t start_index = index_;
- while (std::optional<char> c = PeekChar()) {
- // Handle non-ASCII characters, which never trigger any special handling
- // beyond needing to be valid UTF-8. ASCII characters will be handled
- // separately below.
- if (static_cast<unsigned char>(*c) >= kExtendedASCIIStart) {
- base_icu::UChar32 next_char = 0;
- size_t last_index = index_;
- if (!ReadUnicodeCharacter(input_.data(), input_.length(), &index_,
- &next_char)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- ReportError(JSON_UNSUPPORTED_ENCODING, 0);
- // No need to return consumed data.
- return {StringResult::kError, {}};
- }
- ConsumeChar();
- return {StringResult::kReplacementCharacter,
- input_.substr(start_index, last_index - start_index)};
- }
-
- // Valid UTF-8 will be copied as-is into the output, so keep processing.
- DCHECK_GE(next_char, kExtendedASCIIStart);
- ConsumeChar();
- continue;
- }
-
- if (*c == '"') {
- std::string_view ret = input_.substr(start_index, index_ - start_index);
- ConsumeChar();
- return {StringResult::kDone, ret};
- }
- if (*c == '\\') {
- std::string_view ret = input_.substr(start_index, index_ - start_index);
- ConsumeChar();
- return {StringResult::kEscape, ret};
- }
-
- // Per Section 7, "All Unicode characters may be placed within the
- // quotation marks, except for the characters that MUST be escaped:
- // quotation mark, reverse solidus, and the control characters (U+0000
- // through U+001F)".
- if (*c == '\n' || *c == '\r') {
- if (!(options_ & JSON_ALLOW_NEWLINES_IN_STRINGS)) {
- ReportError(JSON_UNSUPPORTED_ENCODING, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
- }
- } else if (*c <= 0x1F) {
- ReportError(JSON_UNSUPPORTED_ENCODING, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
- }
-
- // If this character is not an escape sequence, track any line breaks and
- // keep parsing. The JSON spec forbids unescaped ASCII control characters
- // within a string, including '\r' and '\n', but this implementation is more
- // lenient.
- if (*c == '\r' || *c == '\n') {
- index_last_line_ = index_;
- // Don't increment line_number_ twice for "\r\n". We are guaranteed that
- // (index_ > 0) because we are consuming a string, so we must have seen an
- // opening '"' quote character.
- if ((*c == '\r') || (input_[index_ - 1] != '\r')) {
- ++line_number_;
- }
- }
- ConsumeChar();
- }
-
- ReportError(JSON_SYNTAX_ERROR, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
-}
-
-// Entry is at the first X in \uXXXX.
-bool JSONParser::DecodeUTF16(base_icu::UChar32* out_code_point) {
- std::optional<std::string_view> escape_sequence = ConsumeChars(4);
- if (!escape_sequence) {
- return false;
- }
-
- // Consume the UTF-16 code unit, which may be a high surrogate.
- int code_unit16_high = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &code_unit16_high)) {
- return false;
- }
-
- // If this is a high surrogate, consume the next code unit to get the
- // low surrogate.
- if (CBU16_IS_SURROGATE(code_unit16_high)) {
- // Make sure this is the high surrogate.
- if (!CBU16_IS_SURROGATE_LEAD(code_unit16_high)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- // Make sure that the token has more characters to consume the
- // lower surrogate.
- if (!ConsumeIfMatch("\\u")) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- escape_sequence = ConsumeChars(4);
- if (!escape_sequence) {
- return false;
- }
-
- int code_unit16_low = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &code_unit16_low)) {
- return false;
- }
-
- if (!CBU16_IS_TRAIL(code_unit16_low)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- base_icu::UChar32 code_point =
- CBU16_GET_SUPPLEMENTARY(code_unit16_high, code_unit16_low);
-
- *out_code_point = code_point;
- } else {
- // Not a surrogate.
- DCHECK(CBU16_IS_SINGLE(code_unit16_high));
-
- *out_code_point = code_unit16_high;
- }
-
- return true;
-}
-
-std::optional<Value> JSONParser::ConsumeNumber() {
- const char* num_start = pos();
- const size_t start_index = index_;
- size_t end_index = start_index;
-
- if (PeekChar() == '-') {
- ConsumeChar();
- }
-
- if (!ReadInt(false)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
-
- // The optional fraction part.
- if (PeekChar() == '.') {
- ConsumeChar();
- if (!ReadInt(true)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
- }
-
- // Optional exponent part.
- std::optional<char> c = PeekChar();
- if (c == 'e' || c == 'E') {
- ConsumeChar();
- if (PeekChar() == '-' || PeekChar() == '+') {
- ConsumeChar();
- }
- if (!ReadInt(true)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
- }
-
- std::string_view num_string(num_start, end_index - start_index);
-
- int num_int;
- if (StringToInt(num_string, &num_int)) {
- // StringToInt will treat `-0` as zero, losing the significance of the
- // negation.
- if (num_int == 0 && num_string.starts_with('-')) {
- return Value(-0.0);
- }
- return Value(num_int);
- }
-
- double num_double;
- if (StringToDouble(num_string, &num_double) && std::isfinite(num_double)) {
- return Value(num_double);
- }
-
- ReportError(JSON_UNREPRESENTABLE_NUMBER, 0);
- return std::nullopt;
-}
-
-bool JSONParser::ReadInt(bool allow_leading_zeros) {
- size_t len = 0;
- char first = 0;
-
- while (std::optional<char> c = PeekChar()) {
- if (!IsAsciiDigit(*c)) {
- break;
- }
-
- if (len == 0) {
- first = *c;
- }
-
- ++len;
- ConsumeChar();
- }
-
- if (len == 0) {
- return false;
- }
-
- if (!allow_leading_zeros && len > 1 && first == '0') {
- return false;
- }
-
- return true;
-}
-
-std::optional<Value> JSONParser::ConsumeLiteral() {
- if (ConsumeIfMatch("true")) {
- return Value(true);
- }
- if (ConsumeIfMatch("false")) {
- return Value(false);
- }
- if (ConsumeIfMatch("null")) {
- return Value(Value::Type::NONE);
- }
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
-}
-
-bool JSONParser::ConsumeIfMatch(std::string_view match) {
- if (match == PeekChars(match.size())) {
- ConsumeChars(match.size());
- return true;
- }
- return false;
-}
-
-void JSONParser::ReportError(JsonParseError code, int column_adjust) {
- error_code_ = code;
- error_line_ = line_number_;
- error_column_ = static_cast<int>(index_ - index_last_line_) + column_adjust;
-
- // For a final blank line ('\n' and then EOF), a negative column_adjust may
- // put us below 1, which doesn't really make sense for 1-based columns.
- if (error_column_ < 1) {
- error_column_ = 1;
- }
-}
-
-// static
-std::string JSONParser::FormatErrorMessage(int line,
- int column,
- const std::string& description) {
- if (line || column) {
- return StringPrintf("Line: %i, column: %i, %s", line, column,
- description.c_str());
- }
- return description;
-}
-
-} // namespace base::internal
diff --git a/www-client/ungoogled-chromium/files/json_parser.h b/www-client/ungoogled-chromium/files/json_parser.h
deleted file mode 100644
index 92e058640b4b..000000000000
--- a/www-client/ungoogled-chromium/files/json_parser.h
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_JSON_JSON_PARSER_H_
-#define BASE_JSON_JSON_PARSER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <optional>
-#include <string>
-#include <string_view>
-#include <utility>
-
-#include "base/base_export.h"
-#include "base/compiler_specific.h"
-#include "base/gtest_prod_util.h"
-#include "base/json/json_common.h"
-#include "base/third_party/icu/icu_utf.h"
-#include "base/values.h"
-
-namespace base {
-
-class Value;
-
-namespace internal {
-
-class JSONParserTest;
-
-// The implementation behind the JSONReader interface. This class is not meant
-// to be used directly; it encapsulates logic that need not be exposed publicly.
-//
-// This parser guarantees O(n) time through the input string. Iteration happens
-// on the byte level, with the functions ConsumeChars() and ConsumeChar(). The
-// conversion from byte to JSON token happens without advancing the parser in
-// GetNextToken/ParseToken, that is tokenization operates on the current parser
-// position without advancing.
-//
-// Built on top of these are a family of Consume functions that iterate
-// internally. Invariant: on entry of a Consume function, the parser is wound
-// to the first byte of a valid JSON token. On exit, it is on the first byte
-// after the token that was just consumed, which would likely be the first byte
-// of the next token.
-class BASE_EXPORT JSONParser {
- public:
- // Error codes during parsing.
- enum JsonParseError {
- JSON_NO_ERROR = base::ValueDeserializer::kErrorCodeNoError,
- JSON_SYNTAX_ERROR = base::ValueDeserializer::kErrorCodeInvalidFormat,
- JSON_INVALID_ESCAPE,
- JSON_UNEXPECTED_TOKEN,
- JSON_TRAILING_COMMA,
- JSON_TOO_MUCH_NESTING,
- JSON_UNEXPECTED_DATA_AFTER_ROOT,
- JSON_UNSUPPORTED_ENCODING,
- JSON_UNQUOTED_DICTIONARY_KEY,
- JSON_UNREPRESENTABLE_NUMBER,
- JSON_PARSE_ERROR_COUNT
- };
-
- // String versions of parse error codes.
- static const char kSyntaxError[];
- static const char kInvalidEscape[];
- static const char kUnexpectedToken[];
- static const char kTrailingComma[];
- static const char kTooMuchNesting[];
- static const char kUnexpectedDataAfterRoot[];
- static const char kUnsupportedEncoding[];
- static const char kUnquotedDictionaryKey[];
- static const char kUnrepresentableNumber[];
-
- explicit JSONParser(int options, size_t max_depth = kAbsoluteMaxDepth);
-
- JSONParser(const JSONParser&) = delete;
- JSONParser& operator=(const JSONParser&) = delete;
-
- ~JSONParser();
-
- // Parses the input string according to the set options and returns the
- // result as a Value.
- // Wrap this in base::FooValue::From() to check the Value is of type Foo and
- // convert to a FooValue at the same time.
- std::optional<Value> Parse(std::string_view input);
-
- // Returns the error code.
- JsonParseError error_code() const;
-
- // Returns the human-friendly error message.
- std::string GetErrorMessage() const;
-
- // Returns the error line number if parse error happened. Otherwise always
- // returns 0.
- int error_line() const;
-
- // Returns the error column number if parse error happened. Otherwise always
- // returns 0.
- int error_column() const;
-
- private:
- enum Token {
- T_OBJECT_BEGIN, // {
- T_OBJECT_END, // }
- T_ARRAY_BEGIN, // [
- T_ARRAY_END, // ]
- T_STRING,
- T_NUMBER,
- T_BOOL_TRUE, // true
- T_BOOL_FALSE, // false
- T_NULL, // null
- T_LIST_SEPARATOR, // ,
- T_OBJECT_PAIR_SEPARATOR, // :
- T_END_OF_INPUT,
- T_INVALID_TOKEN,
- };
-
- // Returns the next |count| bytes of the input stream, or nullopt if fewer
- // than |count| bytes remain.
- std::optional<std::string_view> PeekChars(size_t count);
-
- // Calls PeekChars() with a |count| of 1.
- std::optional<char> PeekChar();
-
- // Returns the next |count| bytes of the input stream, or nullopt if fewer
- // than |count| bytes remain, and advances the parser position by |count|.
- std::optional<std::string_view> ConsumeChars(size_t count);
-
- // Calls ConsumeChars() with a |count| of 1.
- std::optional<char> ConsumeChar();
-
- // Returns a pointer to the current character position.
- const char* pos();
-
- // Skips over whitespace and comments to find the next token in the stream.
- // This does not advance the parser for non-whitespace or comment chars.
- Token GetNextToken();
-
- // Consumes whitespace characters and comments until the next non-that is
- // encountered.
- void EatWhitespaceAndComments();
- // Helper function that consumes a comment, assuming that the parser is
- // currently wound to a '/'.
- bool EatComment();
-
- // Calls GetNextToken() and then ParseToken().
- std::optional<Value> ParseNextToken();
-
- // Takes a token that represents the start of a Value ("a structural token"
- // in RFC terms) and consumes it, returning the result as a Value.
- std::optional<Value> ParseToken(Token token);
-
- // Assuming that the parser is currently wound to '{', this parses a JSON
- // object into a Value.
- std::optional<Value> ConsumeDictionary();
-
- // Assuming that the parser is wound to '[', this parses a JSON list into a
- // Value.
- std::optional<Value> ConsumeList();
-
- // Calls through ConsumeStringRaw and wraps it in a value.
- std::optional<Value> ConsumeString();
-
- // Assuming that the parser is wound to a double quote, this parses a string,
- // decoding any escape sequences and validating UTF-8. Returns the string on
- // success or std::nullopt on error, with error information set.
- std::optional<std::string> ConsumeStringRaw();
-
- enum class StringResult {
- // Parsing stopped because of invalid input. Error information has been set.
- // The caller should return failure.
- kError,
- // Parsing stopped because the string is finished. The parser is wound to
- // just paste the closing quote. The caller should stop parsing the string.
- kDone,
- // Parsing stopped because of invalid Unicode which should be replaced with
- // a replacement character. The parser is wound to just past the input that
- // should be a replacement character. The caller should add a replacement
- // character and continue parsing.
- kReplacementCharacter,
- // Parsing stopped because of an escape sequence. The parser is wound to
- // just past the backslash. The caller should consume the escape sequence
- // and continue parsing.
- kEscape,
- };
-
- // Consumes the portion of a JavaScript string which may be copied to the
- // input with no conversions, stopping at one of the events above. Returns the
- // reason parsing stopped and the data that was consumed. This should be
- // called in a loop, handling all the cases above until reaching kDone.
- std::pair<StringResult, std::string_view> ConsumeStringPart();
-
- // Helper function for ConsumeStringRaw() that consumes the next four or 10
- // bytes (parser is wound to the first character of a HEX sequence, with the
- // potential for consuming another \uXXXX for a surrogate). Returns true on
- // success and places the code point |out_code_point|, and false on failure.
- bool DecodeUTF16(base_icu::UChar32* out_code_point);
-
- // Assuming that the parser is wound to the start of a valid JSON number,
- // this parses and converts it to either an int or double value.
- std::optional<Value> ConsumeNumber();
- // Helper that reads characters that are ints. Returns true if a number was
- // read and false on error.
- bool ReadInt(bool allow_leading_zeros);
-
- // Consumes the literal values of |true|, |false|, and |null|, assuming the
- // parser is wound to the first character of any of those.
- std::optional<Value> ConsumeLiteral();
-
- // Helper function that returns true if the byte squence |match| can be
- // consumed at the current parser position. Returns false if there are fewer
- // than |match|-length bytes or if the sequence does not match, and the
- // parser state is unchanged.
- bool ConsumeIfMatch(std::string_view match);
-
- // Sets the error information to |code| at the current column, based on
- // |index_| and |index_last_line_|, with an optional positive/negative
- // adjustment by |column_adjust|.
- void ReportError(JsonParseError code, int column_adjust);
-
- // Given the line and column number of an error, formats one of the error
- // message contants from json_reader.h for human display.
- static std::string FormatErrorMessage(int line,
- int column,
- const std::string& description);
-
- // base::JSONParserOptions that control parsing.
- const int options_;
-
- // Maximum depth to parse.
- const size_t max_depth_;
-
- // The input stream being parsed. Note: Not guaranteed to NUL-terminated.
- std::string_view input_;
-
- // The index in the input stream to which the parser is wound.
- size_t index_;
-
- // The number of times the parser has recursed (current stack depth).
- size_t stack_depth_;
-
- // The line number that the parser is at currently.
- int line_number_;
-
- // The last value of |index_| on the previous line.
- size_t index_last_line_;
-
- // Error information.
- JsonParseError error_code_;
- int error_line_;
- int error_column_;
-
- friend class JSONParserTest;
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, NextChar);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeDictionary);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeList);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeString);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeLiterals);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ConsumeNumbers);
- FRIEND_TEST_ALL_PREFIXES(JSONParserTest, ErrorMessages);
-};
-
-// Used when decoding and an invalid utf-8 sequence is encountered.
-BASE_EXPORT extern const char kUnicodeReplacementString[];
-
-} // namespace internal
-} // namespace base
-
-#endif // BASE_JSON_JSON_PARSER_H_
diff --git a/www-client/ungoogled-chromium/files/json_parser_r1.cc b/www-client/ungoogled-chromium/files/json_parser_r1.cc
deleted file mode 100644
index 6ee66a0067e4..000000000000
--- a/www-client/ungoogled-chromium/files/json_parser_r1.cc
+++ /dev/null
@@ -1,872 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/json/json_parser.h"
-
-#include <algorithm>
-#include <cmath>
-#include <iterator>
-#include <memory>
-#include <string_view>
-#include <utility>
-#include <vector>
-
-#include "base/check_op.h"
-#include "base/compiler_specific.h"
-#include "base/feature_list.h"
-#include "base/features.h"
-#include "base/json/json_reader.h"
-#include "base/notreached.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/third_party/icu/icu_utf.h"
-#include "base/types/pass_key.h"
-
-namespace base::internal {
-
-namespace {
-
-// Values 1000 and above are used by JSONFileValueSerializer::JsonFileError.
-static_assert(JSONParser::JSON_PARSE_ERROR_COUNT < 1000,
- "JSONParser error out of bounds");
-
-std::string ErrorCodeToString(JSONParser::JsonParseError error_code) {
- switch (error_code) {
- case JSONParser::JSON_NO_ERROR:
- return std::string();
- case JSONParser::JSON_SYNTAX_ERROR:
- return JSONParser::kSyntaxError;
- case JSONParser::JSON_INVALID_ESCAPE:
- return JSONParser::kInvalidEscape;
- case JSONParser::JSON_UNEXPECTED_TOKEN:
- return JSONParser::kUnexpectedToken;
- case JSONParser::JSON_TRAILING_COMMA:
- return JSONParser::kTrailingComma;
- case JSONParser::JSON_TOO_MUCH_NESTING:
- return JSONParser::kTooMuchNesting;
- case JSONParser::JSON_UNEXPECTED_DATA_AFTER_ROOT:
- return JSONParser::kUnexpectedDataAfterRoot;
- case JSONParser::JSON_UNSUPPORTED_ENCODING:
- return JSONParser::kUnsupportedEncoding;
- case JSONParser::JSON_UNQUOTED_DICTIONARY_KEY:
- return JSONParser::kUnquotedDictionaryKey;
- case JSONParser::JSON_UNREPRESENTABLE_NUMBER:
- return JSONParser::kUnrepresentableNumber;
- case JSONParser::JSON_PARSE_ERROR_COUNT:
- NOTREACHED();
- }
- NOTREACHED();
-}
-
-const int32_t kExtendedASCIIStart = 0x80;
-constexpr base_icu::UChar32 kUnicodeReplacementPoint = 0xFFFD;
-
-// UnprefixedHexStringToInt acts like |HexStringToInt|, but enforces that the
-// input consists purely of hex digits. I.e. no "0x" nor "OX" prefix is
-// permitted.
-bool UnprefixedHexStringToInt(std::string_view input, int* output) {
- for (char i : input) {
- if (!IsHexDigit(i)) {
- return false;
- }
- }
- return HexStringToInt(input, output);
-}
-
-} // namespace
-
-// This is U+FFFD.
-const char kUnicodeReplacementString[] = "\xEF\xBF\xBD";
-
-const char JSONParser::kSyntaxError[] = "Syntax error.";
-const char JSONParser::kInvalidEscape[] = "Invalid escape sequence.";
-const char JSONParser::kUnexpectedToken[] = "Unexpected token.";
-const char JSONParser::kTrailingComma[] = "Trailing comma not allowed.";
-const char JSONParser::kTooMuchNesting[] = "Too much nesting.";
-const char JSONParser::kUnexpectedDataAfterRoot[] =
- "Unexpected data after root element.";
-const char JSONParser::kUnsupportedEncoding[] =
- "Unsupported encoding. JSON must be UTF-8.";
-const char JSONParser::kUnquotedDictionaryKey[] =
- "Dictionary keys must be quoted.";
-const char JSONParser::kUnrepresentableNumber[] =
- "Number cannot be represented.";
-
-JSONParser::JSONParser(int options, size_t max_depth)
- : options_(options),
- max_depth_(max_depth),
- index_(0),
- stack_depth_(0),
- line_number_(0),
- index_last_line_(0),
- error_code_(JSON_NO_ERROR),
- error_line_(0),
- error_column_(0) {
- CHECK_LE(max_depth, kAbsoluteMaxDepth);
-}
-
-JSONParser::~JSONParser() = default;
-
-std::optional<Value> JSONParser::Parse(std::string_view input) {
- input_ = input;
- index_ = 0;
- // Line and column counting is 1-based, but |index_| is 0-based. For example,
- // if input is "Aaa\nB" then 'A' and 'B' are both in column 1 (at lines 1 and
- // 2) and have indexes of 0 and 4. We track the line number explicitly (the
- // |line_number_| field) and the column number implicitly (the difference
- // between |index_| and |index_last_line_|). In calculating that difference,
- // |index_last_line_| is the index of the '\r' or '\n', not the index of the
- // first byte after the '\n'. For the 'B' in "Aaa\nB", its |index_| and
- // |index_last_line_| would be 4 and 3: 'B' is in column (4 - 3) = 1. We
- // initialize |index_last_line_| to -1, not 0, since -1 is the (out of range)
- // index of the imaginary '\n' immediately before the start of the string:
- // 'A' is in column (0 - -1) = 1.
- line_number_ = 1;
- index_last_line_ = static_cast<size_t>(-1);
-
- error_code_ = JSON_NO_ERROR;
- error_line_ = 0;
- error_column_ = 0;
-
- // When the input JSON string starts with a UTF-8 Byte-Order-Mark,
- // advance the start position to avoid the ParseNextToken function mis-
- // treating a Unicode BOM as an invalid character and returning NULL.
- ConsumeIfMatch("\xEF\xBB\xBF");
-
- // Parse the first and any nested tokens.
- std::optional<Value> root(ParseNextToken());
- if (!root) {
- return std::nullopt;
- }
-
- // Make sure the input stream is at an end.
- if (GetNextToken() != T_END_OF_INPUT) {
- ReportError(JSON_UNEXPECTED_DATA_AFTER_ROOT, 0);
- return std::nullopt;
- }
-
- return root;
-}
-
-JSONParser::JsonParseError JSONParser::error_code() const {
- return error_code_;
-}
-
-std::string JSONParser::GetErrorMessage() const {
- return FormatErrorMessage(error_line_, error_column_,
- ErrorCodeToString(error_code_));
-}
-
-int JSONParser::error_line() const {
- return error_line_;
-}
-
-int JSONParser::error_column() const {
- return error_column_;
-}
-
-// JSONParser private //////////////////////////////////////////////////////////
-
-std::optional<std::string_view> JSONParser::PeekChars(size_t count) {
- if (count > input_.length() - index_) {
- return std::nullopt;
- }
- // Using string_view::substr() was historically significantly slower
- // (according to base_perftests) than constructing a substring manually.
- //
- // TODO(crbug.com/40284755): Is this still the case? Ideally the bounds check
- // performed by substr would be deleted by the optimizer for being redundant
- // with the runtime check above. However, to do so, the compiler would need
- // to know `index_ <= input_.length()` is a class invariant. If we
- // restructured the code so that we only stored the remaining data, that
- // would avoid this, but it would prevent rewinding (the places in this file
- // which look at `input_[index_ - 1]`.)
- return UNSAFE_BUFFERS(std::string_view(input_.data() + index_, count));
-}
-
-std::optional<char> JSONParser::PeekChar() {
- std::optional<std::string_view> chars = PeekChars(1);
- if (chars) {
- return (*chars)[0];
- }
- return std::nullopt;
-}
-
-std::optional<std::string_view> JSONParser::ConsumeChars(size_t count) {
- std::optional<std::string_view> chars = PeekChars(count);
- if (chars) {
- index_ += count;
- }
- return chars;
-}
-
-std::optional<char> JSONParser::ConsumeChar() {
- std::optional<std::string_view> chars = ConsumeChars(1);
- if (chars) {
- return (*chars)[0];
- }
- return std::nullopt;
-}
-
-const char* JSONParser::pos() {
- CHECK_LE(index_, input_.length());
- // SAFETY: Checked above.
- return UNSAFE_BUFFERS(input_.data() + index_);
-}
-
-JSONParser::Token JSONParser::GetNextToken() {
- EatWhitespaceAndComments();
-
- std::optional<char> c = PeekChar();
- if (!c) {
- return T_END_OF_INPUT;
- }
-
- switch (*c) {
- case '{':
- return T_OBJECT_BEGIN;
- case '}':
- return T_OBJECT_END;
- case '[':
- return T_ARRAY_BEGIN;
- case ']':
- return T_ARRAY_END;
- case '"':
- return T_STRING;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '-':
- return T_NUMBER;
- case 't':
- return T_BOOL_TRUE;
- case 'f':
- return T_BOOL_FALSE;
- case 'n':
- return T_NULL;
- case ',':
- return T_LIST_SEPARATOR;
- case ':':
- return T_OBJECT_PAIR_SEPARATOR;
- default:
- return T_INVALID_TOKEN;
- }
-}
-
-void JSONParser::EatWhitespaceAndComments() {
- while (std::optional<char> c = PeekChar()) {
- switch (*c) {
- case '\r':
- case '\n':
- index_last_line_ = index_;
- // Don't increment line_number_ twice for "\r\n".
- if (!(c == '\n' && index_ > 0 && input_[index_ - 1] == '\r')) {
- ++line_number_;
- }
- [[fallthrough]];
- case ' ':
- case '\t':
- ConsumeChar();
- break;
- case '/':
- if (!EatComment()) {
- return;
- }
- break;
- default:
- return;
- }
- }
-}
-
-bool JSONParser::EatComment() {
- std::optional<std::string_view> comment_start = PeekChars(2);
- if (!comment_start) {
- return false;
- }
-
- const bool comments_allowed = options_ & JSON_ALLOW_COMMENTS;
-
- if (comment_start == "//") {
- if (!comments_allowed) {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return false;
- }
-
- ConsumeChars(2);
- // Single line comment, read to newline.
- while (std::optional<char> c = PeekChar()) {
- if (c == '\n' || c == '\r') {
- return true;
- }
- ConsumeChar();
- }
- } else if (comment_start == "/*") {
- if (!comments_allowed) {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return false;
- }
-
- ConsumeChars(2);
- char previous_char = '\0';
- // Block comment, read until end marker.
- while (std::optional<char> c = PeekChar()) {
- if (previous_char == '*' && c == '/') {
- // EatWhitespaceAndComments will inspect pos(), which will still be on
- // the last / of the comment, so advance once more (which may also be
- // end of input).
- ConsumeChar();
- return true;
- }
- previous_char = *ConsumeChar();
- }
-
- // If the comment is unterminated, GetNextToken will report T_END_OF_INPUT.
- }
-
- return false;
-}
-
-std::optional<Value> JSONParser::ParseNextToken() {
- return ParseToken(GetNextToken());
-}
-
-std::optional<Value> JSONParser::ParseToken(Token token) {
- switch (token) {
- case T_OBJECT_BEGIN:
- return ConsumeDictionary();
- case T_ARRAY_BEGIN:
- return ConsumeList();
- case T_STRING:
- return ConsumeString();
- case T_NUMBER:
- return ConsumeNumber();
- case T_BOOL_TRUE:
- case T_BOOL_FALSE:
- case T_NULL:
- return ConsumeLiteral();
- default:
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-}
-
-std::optional<Value> JSONParser::ConsumeDictionary() {
- if (ConsumeChar() != '{') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- StackMarker depth_check(max_depth_, &stack_depth_);
- if (depth_check.IsTooDeep()) {
- ReportError(JSON_TOO_MUCH_NESTING, -1);
- return std::nullopt;
- }
-
- std::vector<std::pair<std::string, std::unique_ptr<Value>>> values;
-
- Token token = GetNextToken();
- while (token != T_OBJECT_END) {
- if (token != T_STRING) {
- ReportError(JSON_UNQUOTED_DICTIONARY_KEY, 0);
- return std::nullopt;
- }
-
- // First consume the key.
- std::optional<std::string> key = ConsumeStringRaw();
- if (!key) {
- return std::nullopt;
- }
-
- // Read the separator.
- token = GetNextToken();
- if (token != T_OBJECT_PAIR_SEPARATOR) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
-
- // The next token is the value. Ownership transfers to |dict|.
- ConsumeChar();
- std::optional<Value> value = ParseNextToken();
- if (!value) {
- // ReportError from deeper level.
- return std::nullopt;
- }
-
- values.emplace_back(std::move(*key),
- std::make_unique<Value>(std::move(*value)));
-
- token = GetNextToken();
- if (token == T_LIST_SEPARATOR) {
- ConsumeChar();
- token = GetNextToken();
- if (token == T_OBJECT_END && !(options_ & JSON_ALLOW_TRAILING_COMMAS)) {
- ReportError(JSON_TRAILING_COMMA, 0);
- return std::nullopt;
- }
- } else if (token != T_OBJECT_END) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- }
-
- ConsumeChar(); // Closing '}'.
- // Reverse |dict_storage| to keep the last of elements with the same key in
- // the input.
- std::ranges::reverse(values);
- return Value(base::DictValue(PassKey<JSONParser>(), std::move(values)));
-}
-
-std::optional<Value> JSONParser::ConsumeList() {
- if (ConsumeChar() != '[') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- StackMarker depth_check(max_depth_, &stack_depth_);
- if (depth_check.IsTooDeep()) {
- ReportError(JSON_TOO_MUCH_NESTING, -1);
- return std::nullopt;
- }
-
- base::ListValue list;
-
- Token token = GetNextToken();
- while (token != T_ARRAY_END) {
- std::optional<Value> item = ParseToken(token);
- if (!item) {
- // ReportError from deeper level.
- return std::nullopt;
- }
-
- list.Append(std::move(*item));
-
- token = GetNextToken();
- if (token == T_LIST_SEPARATOR) {
- ConsumeChar();
- token = GetNextToken();
- if (token == T_ARRAY_END && !(options_ & JSON_ALLOW_TRAILING_COMMAS)) {
- ReportError(JSON_TRAILING_COMMA, 0);
- return std::nullopt;
- }
- } else if (token != T_ARRAY_END) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- }
-
- ConsumeChar(); // Closing ']'.
-
- return Value(std::move(list));
-}
-
-std::optional<Value> JSONParser::ConsumeString() {
- std::optional<std::string> string = ConsumeStringRaw();
- if (!string) {
- return std::nullopt;
- }
- return Value(std::move(*string));
-}
-
-std::optional<std::string> JSONParser::ConsumeStringRaw() {
- if (ConsumeChar() != '"') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- std::string string;
- for (;;) {
- auto [result, consumed] = ConsumeStringPart();
- switch (result) {
- case StringResult::kError:
- return std::nullopt;
-
- case StringResult::kDone:
- // This is the last time we're appending, so pre-reserve the desired
- // size, to prevent `+=` from overallocating. (In other cases, the
- // overallocating is desirable for amortization.) In particular,
- // the common case is that `string` is empty and we return in one step.
- string.reserve(string.size() + consumed.size());
- string += consumed;
- return std::move(string);
-
- case StringResult::kReplacementCharacter:
- string += consumed;
- string += kUnicodeReplacementString;
- break; // Keep parsing.
-
- case StringResult::kEscape:
- string += consumed;
- std::optional<char> escape_char = ConsumeChar();
- if (!escape_char) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
-
- switch (*escape_char) {
- // Allowed esape sequences:
- case 'x': { // UTF-8 sequence.
- // UTF-8 \x escape sequences are not allowed in the spec, but they
- // are supported here for backwards-compatiblity with the old
- // parser.
- if (!(options_ & JSON_ALLOW_X_ESCAPES)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
-
- std::optional<std::string_view> escape_sequence = ConsumeChars(2);
- if (!escape_sequence) {
- ReportError(JSON_INVALID_ESCAPE, -3);
- return std::nullopt;
- }
-
- int hex_digit = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &hex_digit)) {
- ReportError(JSON_INVALID_ESCAPE, -3);
- return std::nullopt;
- }
-
- // A two-character hex sequence is at most 0xff and all codepoints
- // up to 0xff are valid.
- DCHECK_LE(hex_digit, 0xff);
- DCHECK(IsValidCharacter(hex_digit));
- WriteUnicodeCharacter(hex_digit, &string);
- break;
- }
- case 'u': { // UTF-16 sequence.
- // UTF units are of the form \uXXXX.
- base_icu::UChar32 code_point;
- if (!DecodeUTF16(&code_point)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- WriteUnicodeCharacter(code_point, &string);
- break;
- }
- case '"':
- string.push_back('"');
- break;
- case '\\':
- string.push_back('\\');
- break;
- case '/':
- string.push_back('/');
- break;
- case 'b':
- string.push_back('\b');
- break;
- case 'f':
- string.push_back('\f');
- break;
- case 'n':
- string.push_back('\n');
- break;
- case 'r':
- string.push_back('\r');
- break;
- case 't':
- string.push_back('\t');
- break;
- case 'v': // Not listed as valid escape sequence in the RFC.
- if (!(options_ & JSON_ALLOW_VERT_TAB)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- string.push_back('\v');
- break;
- // All other escape squences are illegal.
- default:
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- break; // Keep parsing.
- }
- }
-}
-
-std::pair<JSONParser::StringResult, std::string_view>
-JSONParser::ConsumeStringPart() {
- const size_t start_index = index_;
- while (std::optional<char> c = PeekChar()) {
- // Handle non-ASCII characters, which never trigger any special handling
- // beyond needing to be valid UTF-8. ASCII characters will be handled
- // separately below.
- if (static_cast<unsigned char>(*c) >= kExtendedASCIIStart) {
- base_icu::UChar32 next_char = 0;
- size_t last_index = index_;
- if (!ReadUnicodeCharacter(input_.data(), input_.length(), &index_,
- &next_char)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- ReportError(JSON_UNSUPPORTED_ENCODING, 0);
- // No need to return consumed data.
- return {StringResult::kError, {}};
- }
- ConsumeChar();
- return {StringResult::kReplacementCharacter,
- input_.substr(start_index, last_index - start_index)};
- }
-
- // Valid UTF-8 will be copied as-is into the output, so keep processing.
- DCHECK_GE(next_char, kExtendedASCIIStart);
- ConsumeChar();
- continue;
- }
-
- if (*c == '"') {
- std::string_view ret = input_.substr(start_index, index_ - start_index);
- ConsumeChar();
- return {StringResult::kDone, ret};
- }
- if (*c == '\\') {
- std::string_view ret = input_.substr(start_index, index_ - start_index);
- ConsumeChar();
- return {StringResult::kEscape, ret};
- }
-
- // Per Section 7, "All Unicode characters may be placed within the
- // quotation marks, except for the characters that MUST be escaped:
- // quotation mark, reverse solidus, and the control characters (U+0000
- // through U+001F)".
- if (*c == '\n' || *c == '\r') {
- if (!(options_ & JSON_ALLOW_NEWLINES_IN_STRINGS)) {
- ReportError(JSON_UNSUPPORTED_ENCODING, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
- }
- } else if (*c <= 0x1F) {
- ReportError(JSON_UNSUPPORTED_ENCODING, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
- }
-
- // If this character is not an escape sequence, track any line breaks and
- // keep parsing. The JSON spec forbids unescaped ASCII control characters
- // within a string, including '\r' and '\n', but this implementation is more
- // lenient.
- if (*c == '\r' || *c == '\n') {
- index_last_line_ = index_;
- // Don't increment line_number_ twice for "\r\n". We are guaranteed that
- // (index_ > 0) because we are consuming a string, so we must have seen an
- // opening '"' quote character.
- if ((*c == '\r') || (input_[index_ - 1] != '\r')) {
- ++line_number_;
- }
- }
- ConsumeChar();
- }
-
- ReportError(JSON_SYNTAX_ERROR, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
-}
-
-// Entry is at the first X in \uXXXX.
-bool JSONParser::DecodeUTF16(base_icu::UChar32* out_code_point) {
- std::optional<std::string_view> escape_sequence = ConsumeChars(4);
- if (!escape_sequence) {
- return false;
- }
-
- // Consume the UTF-16 code unit, which may be a high surrogate.
- int code_unit16_high = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &code_unit16_high)) {
- return false;
- }
-
- // If this is a high surrogate, consume the next code unit to get the
- // low surrogate.
- if (CBU16_IS_SURROGATE(code_unit16_high)) {
- // Make sure this is the high surrogate.
- if (!CBU16_IS_SURROGATE_LEAD(code_unit16_high)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- // Make sure that the token has more characters to consume the
- // lower surrogate.
- if (!ConsumeIfMatch("\\u")) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- escape_sequence = ConsumeChars(4);
- if (!escape_sequence) {
- return false;
- }
-
- int code_unit16_low = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &code_unit16_low)) {
- return false;
- }
-
- if (!CBU16_IS_TRAIL(code_unit16_low)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- base_icu::UChar32 code_point =
- CBU16_GET_SUPPLEMENTARY(code_unit16_high, code_unit16_low);
-
- *out_code_point = code_point;
- } else {
- // Not a surrogate.
- DCHECK(CBU16_IS_SINGLE(code_unit16_high));
-
- *out_code_point = code_unit16_high;
- }
-
- return true;
-}
-
-std::optional<Value> JSONParser::ConsumeNumber() {
- const char* num_start = pos();
- const size_t start_index = index_;
- size_t end_index = start_index;
-
- if (PeekChar() == '-') {
- ConsumeChar();
- }
-
- if (!ReadInt(false)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
-
- // The optional fraction part.
- if (PeekChar() == '.') {
- ConsumeChar();
- if (!ReadInt(true)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
- }
-
- // Optional exponent part.
- std::optional<char> c = PeekChar();
- if (c == 'e' || c == 'E') {
- ConsumeChar();
- if (PeekChar() == '-' || PeekChar() == '+') {
- ConsumeChar();
- }
- if (!ReadInt(true)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
- }
-
- std::string_view num_string(num_start, end_index - start_index);
-
- int num_int;
- if (StringToInt(num_string, &num_int)) {
- // StringToInt will treat `-0` as zero, losing the significance of the
- // negation.
- if (num_int == 0 && num_string.starts_with('-')) {
- return Value(-0.0);
- }
- return Value(num_int);
- }
-
- double num_double;
- if (StringToDouble(num_string, &num_double) && std::isfinite(num_double)) {
- return Value(num_double);
- }
-
- ReportError(JSON_UNREPRESENTABLE_NUMBER, 0);
- return std::nullopt;
-}
-
-bool JSONParser::ReadInt(bool allow_leading_zeros) {
- size_t len = 0;
- char first = 0;
-
- while (std::optional<char> c = PeekChar()) {
- if (!IsAsciiDigit(*c)) {
- break;
- }
-
- if (len == 0) {
- first = *c;
- }
-
- ++len;
- ConsumeChar();
- }
-
- if (len == 0) {
- return false;
- }
-
- if (!allow_leading_zeros && len > 1 && first == '0') {
- return false;
- }
-
- return true;
-}
-
-std::optional<Value> JSONParser::ConsumeLiteral() {
- if (ConsumeIfMatch("true")) {
- return Value(true);
- }
- if (ConsumeIfMatch("false")) {
- return Value(false);
- }
- if (ConsumeIfMatch("null")) {
- return Value(Value::Type::NONE);
- }
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
-}
-
-bool JSONParser::ConsumeIfMatch(std::string_view match) {
- if (match == PeekChars(match.size())) {
- ConsumeChars(match.size());
- return true;
- }
- return false;
-}
-
-void JSONParser::ReportError(JsonParseError code, int column_adjust) {
- error_code_ = code;
- error_line_ = line_number_;
- error_column_ = static_cast<int>(index_ - index_last_line_) + column_adjust;
-
- // For a final blank line ('\n' and then EOF), a negative column_adjust may
- // put us below 1, which doesn't really make sense for 1-based columns.
- if (error_column_ < 1) {
- error_column_ = 1;
- }
-}
-
-// static
-std::string JSONParser::FormatErrorMessage(int line,
- int column,
- const std::string& description) {
- if (line || column) {
- return StringPrintf("Line: %i, column: %i, %s", line, column,
- description.c_str());
- }
- return description;
-}
-
-} // namespace base::internal
diff --git a/www-client/ungoogled-chromium/files/json_parser_r2.cc b/www-client/ungoogled-chromium/files/json_parser_r2.cc
deleted file mode 100644
index 814008bc1b3c..000000000000
--- a/www-client/ungoogled-chromium/files/json_parser_r2.cc
+++ /dev/null
@@ -1,872 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/json/json_parser.h"
-
-#include <algorithm>
-#include <cmath>
-#include <iterator>
-#include <memory>
-#include <string_view>
-#include <utility>
-#include <vector>
-
-#include "base/check_op.h"
-#include "base/compiler_specific.h"
-#include "base/feature_list.h"
-#include "base/features.h"
-#include "base/json/json_reader.h"
-#include "base/notreached.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/third_party/icu/icu_utf.h"
-#include "base/types/pass_key.h"
-
-namespace base::internal {
-
-namespace {
-
-// Values 1000 and above are used by JSONFileValueSerializer::JsonFileError.
-static_assert(JSONParser::JSON_PARSE_ERROR_COUNT < 1000,
- "JSONParser error out of bounds");
-
-std::string ErrorCodeToString(JSONParser::JsonParseError error_code) {
- switch (error_code) {
- case JSONParser::JSON_NO_ERROR:
- return std::string();
- case JSONParser::JSON_SYNTAX_ERROR:
- return JSONParser::kSyntaxError;
- case JSONParser::JSON_INVALID_ESCAPE:
- return JSONParser::kInvalidEscape;
- case JSONParser::JSON_UNEXPECTED_TOKEN:
- return JSONParser::kUnexpectedToken;
- case JSONParser::JSON_TRAILING_COMMA:
- return JSONParser::kTrailingComma;
- case JSONParser::JSON_TOO_MUCH_NESTING:
- return JSONParser::kTooMuchNesting;
- case JSONParser::JSON_UNEXPECTED_DATA_AFTER_ROOT:
- return JSONParser::kUnexpectedDataAfterRoot;
- case JSONParser::JSON_UNSUPPORTED_ENCODING:
- return JSONParser::kUnsupportedEncoding;
- case JSONParser::JSON_UNQUOTED_DICTIONARY_KEY:
- return JSONParser::kUnquotedDictionaryKey;
- case JSONParser::JSON_UNREPRESENTABLE_NUMBER:
- return JSONParser::kUnrepresentableNumber;
- case JSONParser::JSON_PARSE_ERROR_COUNT:
- NOTREACHED();
- }
- NOTREACHED();
-}
-
-const int32_t kExtendedASCIIStart = 0x80;
-constexpr base_icu::UChar32 kUnicodeReplacementPoint = 0xFFFD;
-
-// UnprefixedHexStringToInt acts like |HexStringToInt|, but enforces that the
-// input consists purely of hex digits. I.e. no "0x" nor "OX" prefix is
-// permitted.
-bool UnprefixedHexStringToInt(std::string_view input, int* output) {
- for (char i : input) {
- if (!IsHexDigit(i)) {
- return false;
- }
- }
- return HexStringToInt(input, output);
-}
-
-} // namespace
-
-// This is U+FFFD.
-const char kUnicodeReplacementString[] = "\xEF\xBF\xBD";
-
-const char JSONParser::kSyntaxError[] = "Syntax error.";
-const char JSONParser::kInvalidEscape[] = "Invalid escape sequence.";
-const char JSONParser::kUnexpectedToken[] = "Unexpected token.";
-const char JSONParser::kTrailingComma[] = "Trailing comma not allowed.";
-const char JSONParser::kTooMuchNesting[] = "Too much nesting.";
-const char JSONParser::kUnexpectedDataAfterRoot[] =
- "Unexpected data after root element.";
-const char JSONParser::kUnsupportedEncoding[] =
- "Unsupported encoding. JSON must be UTF-8.";
-const char JSONParser::kUnquotedDictionaryKey[] =
- "Dictionary keys must be quoted.";
-const char JSONParser::kUnrepresentableNumber[] =
- "Number cannot be represented.";
-
-JSONParser::JSONParser(int options, size_t max_depth)
- : options_(options),
- max_depth_(max_depth),
- index_(0),
- stack_depth_(0),
- line_number_(0),
- index_last_line_(0),
- error_code_(JSON_NO_ERROR),
- error_line_(0),
- error_column_(0) {
- CHECK_LE(max_depth, kAbsoluteMaxDepth);
-}
-
-JSONParser::~JSONParser() = default;
-
-std::optional<Value> JSONParser::Parse(std::string_view input) {
- input_ = input;
- index_ = 0;
- // Line and column counting is 1-based, but |index_| is 0-based. For example,
- // if input is "Aaa\nB" then 'A' and 'B' are both in column 1 (at lines 1 and
- // 2) and have indexes of 0 and 4. We track the line number explicitly (the
- // |line_number_| field) and the column number implicitly (the difference
- // between |index_| and |index_last_line_|). In calculating that difference,
- // |index_last_line_| is the index of the '\r' or '\n', not the index of the
- // first byte after the '\n'. For the 'B' in "Aaa\nB", its |index_| and
- // |index_last_line_| would be 4 and 3: 'B' is in column (4 - 3) = 1. We
- // initialize |index_last_line_| to -1, not 0, since -1 is the (out of range)
- // index of the imaginary '\n' immediately before the start of the string:
- // 'A' is in column (0 - -1) = 1.
- line_number_ = 1;
- index_last_line_ = static_cast<size_t>(-1);
-
- error_code_ = JSON_NO_ERROR;
- error_line_ = 0;
- error_column_ = 0;
-
- // When the input JSON string starts with a UTF-8 Byte-Order-Mark,
- // advance the start position to avoid the ParseNextToken function mis-
- // treating a Unicode BOM as an invalid character and returning NULL.
- ConsumeIfMatch("\xEF\xBB\xBF");
-
- // Parse the first and any nested tokens.
- std::optional<Value> root(ParseNextToken());
- if (!root) {
- return std::nullopt;
- }
-
- // Make sure the input stream is at an end.
- if (GetNextToken() != T_END_OF_INPUT) {
- ReportError(JSON_UNEXPECTED_DATA_AFTER_ROOT, 0);
- return std::nullopt;
- }
-
- return root;
-}
-
-JSONParser::JsonParseError JSONParser::error_code() const {
- return error_code_;
-}
-
-std::string JSONParser::GetErrorMessage() const {
- return FormatErrorMessage(error_line_, error_column_,
- ErrorCodeToString(error_code_));
-}
-
-int JSONParser::error_line() const {
- return error_line_;
-}
-
-int JSONParser::error_column() const {
- return error_column_;
-}
-
-// JSONParser private //////////////////////////////////////////////////////////
-
-std::optional<std::string_view> JSONParser::PeekChars(size_t count) {
- if (count > input_.length() - index_) {
- return std::nullopt;
- }
- // Using string_view::substr() was historically significantly slower
- // (according to base_perftests) than constructing a substring manually.
- //
- // TODO(crbug.com/40284755): Is this still the case? Ideally the bounds check
- // performed by substr would be deleted by the optimizer for being redundant
- // with the runtime check above. However, to do so, the compiler would need
- // to know `index_ <= input_.length()` is a class invariant. If we
- // restructured the code so that we only stored the remaining data, that
- // would avoid this, but it would prevent rewinding (the places in this file
- // which look at `input_[index_ - 1]`.)
- return UNSAFE_BUFFERS(std::string_view(input_.data() + index_, count));
-}
-
-std::optional<char> JSONParser::PeekChar() {
- std::optional<std::string_view> chars = PeekChars(1);
- if (chars) {
- return (*chars)[0];
- }
- return std::nullopt;
-}
-
-std::optional<std::string_view> JSONParser::ConsumeChars(size_t count) {
- std::optional<std::string_view> chars = PeekChars(count);
- if (chars) {
- index_ += count;
- }
- return chars;
-}
-
-std::optional<char> JSONParser::ConsumeChar() {
- std::optional<std::string_view> chars = ConsumeChars(1);
- if (chars) {
- return (*chars)[0];
- }
- return std::nullopt;
-}
-
-const char* JSONParser::pos() {
- CHECK_LE(index_, input_.length());
- // SAFETY: Checked above.
- return UNSAFE_BUFFERS(input_.data() + index_);
-}
-
-JSONParser::Token JSONParser::GetNextToken() {
- EatWhitespaceAndComments();
-
- std::optional<char> c = PeekChar();
- if (!c) {
- return T_END_OF_INPUT;
- }
-
- switch (*c) {
- case '{':
- return T_OBJECT_BEGIN;
- case '}':
- return T_OBJECT_END;
- case '[':
- return T_ARRAY_BEGIN;
- case ']':
- return T_ARRAY_END;
- case '"':
- return T_STRING;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '-':
- return T_NUMBER;
- case 't':
- return T_BOOL_TRUE;
- case 'f':
- return T_BOOL_FALSE;
- case 'n':
- return T_NULL;
- case ',':
- return T_LIST_SEPARATOR;
- case ':':
- return T_OBJECT_PAIR_SEPARATOR;
- default:
- return T_INVALID_TOKEN;
- }
-}
-
-void JSONParser::EatWhitespaceAndComments() {
- while (std::optional<char> c = PeekChar()) {
- switch (*c) {
- case '\r':
- case '\n':
- index_last_line_ = index_;
- // Don't increment line_number_ twice for "\r\n".
- if (!(c == '\n' && index_ > 0 && input_[index_ - 1] == '\r')) {
- ++line_number_;
- }
- [[fallthrough]];
- case ' ':
- case '\t':
- ConsumeChar();
- break;
- case '/':
- if (!EatComment()) {
- return;
- }
- break;
- default:
- return;
- }
- }
-}
-
-bool JSONParser::EatComment() {
- std::optional<std::string_view> comment_start = PeekChars(2);
- if (!comment_start) {
- return false;
- }
-
- const bool comments_allowed = options_ & JSON_ALLOW_COMMENTS;
-
- if (comment_start == "//") {
- if (!comments_allowed) {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return false;
- }
-
- ConsumeChars(2);
- // Single line comment, read to newline.
- while (std::optional<char> c = PeekChar()) {
- if (c == '\n' || c == '\r') {
- return true;
- }
- ConsumeChar();
- }
- } else if (comment_start == "/*") {
- if (!comments_allowed) {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return false;
- }
-
- ConsumeChars(2);
- char previous_char = '\0';
- // Block comment, read until end marker.
- while (std::optional<char> c = PeekChar()) {
- if (previous_char == '*' && c == '/') {
- // EatWhitespaceAndComments will inspect pos(), which will still be on
- // the last / of the comment, so advance once more (which may also be
- // end of input).
- ConsumeChar();
- return true;
- }
- previous_char = *ConsumeChar();
- }
-
- // If the comment is unterminated, GetNextToken will report T_END_OF_INPUT.
- }
-
- return false;
-}
-
-std::optional<Value> JSONParser::ParseNextToken() {
- return ParseToken(GetNextToken());
-}
-
-std::optional<Value> JSONParser::ParseToken(Token token) {
- switch (token) {
- case T_OBJECT_BEGIN:
- return ConsumeDictionary();
- case T_ARRAY_BEGIN:
- return ConsumeList();
- case T_STRING:
- return ConsumeString();
- case T_NUMBER:
- return ConsumeNumber();
- case T_BOOL_TRUE:
- case T_BOOL_FALSE:
- case T_NULL:
- return ConsumeLiteral();
- default:
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-}
-
-std::optional<Value> JSONParser::ConsumeDictionary() {
- if (ConsumeChar() != '{') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- StackMarker depth_check(max_depth_, &stack_depth_);
- if (depth_check.IsTooDeep()) {
- ReportError(JSON_TOO_MUCH_NESTING, -1);
- return std::nullopt;
- }
-
- std::vector<std::pair<std::string, std::unique_ptr<Value>>> values;
-
- Token token = GetNextToken();
- while (token != T_OBJECT_END) {
- if (token != T_STRING) {
- ReportError(JSON_UNQUOTED_DICTIONARY_KEY, 0);
- return std::nullopt;
- }
-
- // First consume the key.
- std::optional<std::string> key = ConsumeStringRaw();
- if (!key) {
- return std::nullopt;
- }
-
- // Read the separator.
- token = GetNextToken();
- if (token != T_OBJECT_PAIR_SEPARATOR) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
-
- // The next token is the value. Ownership transfers to |dict|.
- ConsumeChar();
- std::optional<Value> value = ParseNextToken();
- if (!value) {
- // ReportError from deeper level.
- return std::nullopt;
- }
-
- values.emplace_back(std::move(*key),
- std::make_unique<Value>(std::move(*value)));
-
- token = GetNextToken();
- if (token == T_LIST_SEPARATOR) {
- ConsumeChar();
- token = GetNextToken();
- if (token == T_OBJECT_END && !(options_ & JSON_ALLOW_TRAILING_COMMAS)) {
- ReportError(JSON_TRAILING_COMMA, 0);
- return std::nullopt;
- }
- } else if (token != T_OBJECT_END) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- }
-
- ConsumeChar(); // Closing '}'.
- // Reverse |dict_storage| to keep the last of elements with the same key in
- // the input.
- std::ranges::reverse(values);
- return Value(base::DictValue(PassKey<JSONParser>(), std::move(values)));
-}
-
-std::optional<Value> JSONParser::ConsumeList() {
- if (ConsumeChar() != '[') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- StackMarker depth_check(max_depth_, &stack_depth_);
- if (depth_check.IsTooDeep()) {
- ReportError(JSON_TOO_MUCH_NESTING, -1);
- return std::nullopt;
- }
-
- base::ListValue list;
-
- Token token = GetNextToken();
- while (token != T_ARRAY_END) {
- std::optional<Value> item = ParseToken(token);
- if (!item) {
- // ReportError from deeper level.
- return std::nullopt;
- }
-
- list.Append(std::move(*item));
-
- token = GetNextToken();
- if (token == T_LIST_SEPARATOR) {
- ConsumeChar();
- token = GetNextToken();
- if (token == T_ARRAY_END && !(options_ & JSON_ALLOW_TRAILING_COMMAS)) {
- ReportError(JSON_TRAILING_COMMA, 0);
- return std::nullopt;
- }
- } else if (token != T_ARRAY_END) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- }
-
- ConsumeChar(); // Closing ']'.
-
- return Value(std::move(list));
-}
-
-std::optional<Value> JSONParser::ConsumeString() {
- std::optional<std::string> string = ConsumeStringRaw();
- if (!string) {
- return std::nullopt;
- }
- return Value(std::move(*string));
-}
-
-std::optional<std::string> JSONParser::ConsumeStringRaw() {
- if (ConsumeChar() != '"') {
- ReportError(JSON_UNEXPECTED_TOKEN, 0);
- return std::nullopt;
- }
-
- std::string string;
- for (;;) {
- auto [result, consumed] = ConsumeStringPart();
- switch (result) {
- case StringResult::kError:
- return std::nullopt;
-
- case StringResult::kDone:
- // This is the last time we're appending, so pre-reserve the desired
- // size, to prevent `+=` from overallocating. (In other cases, the
- // overallocating is desirable for amortization.) In particular,
- // the common case is that `string` is empty and we return in one step.
- string.reserve(string.size() + consumed.size());
- string += consumed;
- return std::move(string);
-
- case StringResult::kReplacementCharacter:
- string += consumed;
- string += kUnicodeReplacementString;
- break; // Keep parsing.
-
- case StringResult::kEscape:
- string += consumed;
- std::optional<char> escape_char = ConsumeChar();
- if (!escape_char) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
-
- switch (*escape_char) {
- // Allowed esape sequences:
- case 'x': { // UTF-8 sequence.
- // UTF-8 \x escape sequences are not allowed in the spec, but they
- // are supported here for backwards-compatiblity with the old
- // parser.
- if (!(options_ & JSON_ALLOW_X_ESCAPES)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
-
- std::optional<std::string_view> escape_sequence = ConsumeChars(2);
- if (!escape_sequence) {
- ReportError(JSON_INVALID_ESCAPE, -3);
- return std::nullopt;
- }
-
- int hex_digit = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &hex_digit)) {
- ReportError(JSON_INVALID_ESCAPE, -3);
- return std::nullopt;
- }
-
- // A two-character hex sequence is at most 0xff and all codepoints
- // up to 0xff are valid.
- DCHECK_LE(hex_digit, 0xff);
- DCHECK(IsValidCharacter(hex_digit));
- WriteUnicodeCharacter(hex_digit, &string);
- break;
- }
- case 'u': { // UTF-16 sequence.
- // UTF units are of the form \uXXXX.
- base_icu::UChar32 code_point;
- if (!DecodeUTF16(&code_point)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- WriteUnicodeCharacter(code_point, &string);
- break;
- }
- case '"':
- string.push_back('"');
- break;
- case '\\':
- string.push_back('\\');
- break;
- case '/':
- string.push_back('/');
- break;
- case 'b':
- string.push_back('\b');
- break;
- case 'f':
- string.push_back('\f');
- break;
- case 'n':
- string.push_back('\n');
- break;
- case 'r':
- string.push_back('\r');
- break;
- case 't':
- string.push_back('\t');
- break;
- case 'v': // Not listed as valid escape sequence in the RFC.
- if (!(options_ & JSON_ALLOW_VERT_TAB)) {
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- string.push_back('\v');
- break;
- // All other escape squences are illegal.
- default:
- ReportError(JSON_INVALID_ESCAPE, -1);
- return std::nullopt;
- }
- break; // Keep parsing.
- }
- }
-}
-
-std::pair<JSONParser::StringResult, std::string_view>
-JSONParser::ConsumeStringPart() {
- const size_t start_index = index_;
- while (std::optional<char> c = PeekChar()) {
- // Handle non-ASCII characters, which never trigger any special handling
- // beyond needing to be valid UTF-8. ASCII characters will be handled
- // separately below.
- if (static_cast<unsigned char>(*c) >= kExtendedASCIIStart) {
- base_icu::UChar32 next_char = 0;
- size_t last_index = index_;
- if (!ReadUnicodeCharacter(input_, &index_,
- &next_char)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- ReportError(JSON_UNSUPPORTED_ENCODING, 0);
- // No need to return consumed data.
- return {StringResult::kError, {}};
- }
- ConsumeChar();
- return {StringResult::kReplacementCharacter,
- input_.substr(start_index, last_index - start_index)};
- }
-
- // Valid UTF-8 will be copied as-is into the output, so keep processing.
- DCHECK_GE(next_char, kExtendedASCIIStart);
- ConsumeChar();
- continue;
- }
-
- if (*c == '"') {
- std::string_view ret = input_.substr(start_index, index_ - start_index);
- ConsumeChar();
- return {StringResult::kDone, ret};
- }
- if (*c == '\\') {
- std::string_view ret = input_.substr(start_index, index_ - start_index);
- ConsumeChar();
- return {StringResult::kEscape, ret};
- }
-
- // Per Section 7, "All Unicode characters may be placed within the
- // quotation marks, except for the characters that MUST be escaped:
- // quotation mark, reverse solidus, and the control characters (U+0000
- // through U+001F)".
- if (*c == '\n' || *c == '\r') {
- if (!(options_ & JSON_ALLOW_NEWLINES_IN_STRINGS)) {
- ReportError(JSON_UNSUPPORTED_ENCODING, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
- }
- } else if (*c <= 0x1F) {
- ReportError(JSON_UNSUPPORTED_ENCODING, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
- }
-
- // If this character is not an escape sequence, track any line breaks and
- // keep parsing. The JSON spec forbids unescaped ASCII control characters
- // within a string, including '\r' and '\n', but this implementation is more
- // lenient.
- if (*c == '\r' || *c == '\n') {
- index_last_line_ = index_;
- // Don't increment line_number_ twice for "\r\n". We are guaranteed that
- // (index_ > 0) because we are consuming a string, so we must have seen an
- // opening '"' quote character.
- if ((*c == '\r') || (input_[index_ - 1] != '\r')) {
- ++line_number_;
- }
- }
- ConsumeChar();
- }
-
- ReportError(JSON_SYNTAX_ERROR, -1);
- return {StringResult::kError, {}}; // No need to return consumed data.
-}
-
-// Entry is at the first X in \uXXXX.
-bool JSONParser::DecodeUTF16(base_icu::UChar32* out_code_point) {
- std::optional<std::string_view> escape_sequence = ConsumeChars(4);
- if (!escape_sequence) {
- return false;
- }
-
- // Consume the UTF-16 code unit, which may be a high surrogate.
- int code_unit16_high = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &code_unit16_high)) {
- return false;
- }
-
- // If this is a high surrogate, consume the next code unit to get the
- // low surrogate.
- if (CBU16_IS_SURROGATE(code_unit16_high)) {
- // Make sure this is the high surrogate.
- if (!CBU16_IS_SURROGATE_LEAD(code_unit16_high)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- // Make sure that the token has more characters to consume the
- // lower surrogate.
- if (!ConsumeIfMatch("\\u")) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- escape_sequence = ConsumeChars(4);
- if (!escape_sequence) {
- return false;
- }
-
- int code_unit16_low = 0;
- if (!UnprefixedHexStringToInt(*escape_sequence, &code_unit16_low)) {
- return false;
- }
-
- if (!CBU16_IS_TRAIL(code_unit16_low)) {
- if ((options_ & JSON_REPLACE_INVALID_CHARACTERS) == 0) {
- return false;
- }
- *out_code_point = kUnicodeReplacementPoint;
- return true;
- }
-
- base_icu::UChar32 code_point =
- CBU16_GET_SUPPLEMENTARY(code_unit16_high, code_unit16_low);
-
- *out_code_point = code_point;
- } else {
- // Not a surrogate.
- DCHECK(CBU16_IS_SINGLE(code_unit16_high));
-
- *out_code_point = code_unit16_high;
- }
-
- return true;
-}
-
-std::optional<Value> JSONParser::ConsumeNumber() {
- const char* num_start = pos();
- const size_t start_index = index_;
- size_t end_index = start_index;
-
- if (PeekChar() == '-') {
- ConsumeChar();
- }
-
- if (!ReadInt(false)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
-
- // The optional fraction part.
- if (PeekChar() == '.') {
- ConsumeChar();
- if (!ReadInt(true)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
- }
-
- // Optional exponent part.
- std::optional<char> c = PeekChar();
- if (c == 'e' || c == 'E') {
- ConsumeChar();
- if (PeekChar() == '-' || PeekChar() == '+') {
- ConsumeChar();
- }
- if (!ReadInt(true)) {
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
- }
- end_index = index_;
- }
-
- std::string_view num_string(num_start, end_index - start_index);
-
- int num_int;
- if (StringToInt(num_string, &num_int)) {
- // StringToInt will treat `-0` as zero, losing the significance of the
- // negation.
- if (num_int == 0 && num_string.starts_with('-')) {
- return Value(-0.0);
- }
- return Value(num_int);
- }
-
- double num_double;
- if (StringToDouble(num_string, &num_double) && std::isfinite(num_double)) {
- return Value(num_double);
- }
-
- ReportError(JSON_UNREPRESENTABLE_NUMBER, 0);
- return std::nullopt;
-}
-
-bool JSONParser::ReadInt(bool allow_leading_zeros) {
- size_t len = 0;
- char first = 0;
-
- while (std::optional<char> c = PeekChar()) {
- if (!IsAsciiDigit(*c)) {
- break;
- }
-
- if (len == 0) {
- first = *c;
- }
-
- ++len;
- ConsumeChar();
- }
-
- if (len == 0) {
- return false;
- }
-
- if (!allow_leading_zeros && len > 1 && first == '0') {
- return false;
- }
-
- return true;
-}
-
-std::optional<Value> JSONParser::ConsumeLiteral() {
- if (ConsumeIfMatch("true")) {
- return Value(true);
- }
- if (ConsumeIfMatch("false")) {
- return Value(false);
- }
- if (ConsumeIfMatch("null")) {
- return Value(Value::Type::NONE);
- }
- ReportError(JSON_SYNTAX_ERROR, 0);
- return std::nullopt;
-}
-
-bool JSONParser::ConsumeIfMatch(std::string_view match) {
- if (match == PeekChars(match.size())) {
- ConsumeChars(match.size());
- return true;
- }
- return false;
-}
-
-void JSONParser::ReportError(JsonParseError code, int column_adjust) {
- error_code_ = code;
- error_line_ = line_number_;
- error_column_ = static_cast<int>(index_ - index_last_line_) + column_adjust;
-
- // For a final blank line ('\n' and then EOF), a negative column_adjust may
- // put us below 1, which doesn't really make sense for 1-based columns.
- if (error_column_ < 1) {
- error_column_ = 1;
- }
-}
-
-// static
-std::string JSONParser::FormatErrorMessage(int line,
- int column,
- const std::string& description) {
- if (line || column) {
- return StringPrintf("Line: %i, column: %i, %s", line, column,
- description.c_str());
- }
- return description;
-}
-
-} // namespace base::internal
diff --git a/www-client/ungoogled-chromium/files/perfetto-system-zlib.patch b/www-client/ungoogled-chromium/files/perfetto-system-zlib.patch
deleted file mode 100644
index e1bd9c8c02af..000000000000
--- a/www-client/ungoogled-chromium/files/perfetto-system-zlib.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/third_party/perfetto/gn/BUILD.gn
-+++ b/third_party/perfetto/gn/BUILD.gn
-@@ -382,7 +382,7 @@
- if (enable_perfetto_zlib) {
- group("zlib") {
- if (perfetto_use_system_zlib) {
-- public_configs = [ "//gn:system_zlib_config" ]
-+ public_configs = [ ":system_zlib_config" ]
- } else if (perfetto_root_path == "//") {
- public_configs = [ "//buildtools:zlib_config" ]
- public_deps = [ "//buildtools:zlib" ]
diff --git a/www-client/ungoogled-chromium/files/png_image_decoder.cc b/www-client/ungoogled-chromium/files/png_image_decoder.cc
deleted file mode 100644
index 7c78b9b87f33..000000000000
--- a/www-client/ungoogled-chromium/files/png_image_decoder.cc
+++ /dev/null
@@ -1,1587 +0,0 @@
-/*
- * Copyright (C) 2006 Apple Computer, Inc.
- * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
- *
- * Portions are Copyright (C) 2001 mozilla.org
- *
- * Other contributors:
- * Stuart Parmenter <stuart@mozilla.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Alternatively, the contents of this file may be used under the terms
- * of either the Mozilla Public License Version 1.1, found at
- * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
- * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
- * (the "GPL"), in which case the provisions of the MPL or the GPL are
- * applicable instead of those above. If you wish to allow use of your
- * version of this file only under the terms of one of those two
- * licenses (the MPL or the GPL) and not to allow others to use your
- * version of this file under the LGPL, indicate your decision by
- * deletingthe provisions above and replace them with the notice and
- * other provisions required by the MPL or the GPL, as the case may be.
- * If you do not delete the provisions above, a recipient may use your
- * version of this file under any of the LGPL, the MPL or the GPL.
- */
-#include <memory>
-#include "base/compiler_specific.h"
-#include "base/numerics/checked_math.h"
-#include "third_party/blink/renderer/platform/image-decoders/fast_shared_buffer_reader.h"
-#include "third_party/blink/renderer/platform/image-decoders/png/png_image_decoder.h"
-#include "third_party/blink/renderer/platform/image-decoders/segment_reader.h"
-#include "zlib.h"
-namespace {
-inline blink::PngImageDecoder* imageDecoder(png_structp png) {
- return static_cast<blink::PngImageDecoder*>(png_get_progressive_ptr(png));
-}
-void PNGAPI pngHeaderAvailable(png_structp png, png_infop) {
- imageDecoder(png)->HeaderAvailable();
-}
-void PNGAPI pngRowAvailable(png_structp png,
- png_bytep row,
- png_uint_32 rowIndex,
- int state) {
- imageDecoder(png)->RowAvailable(row, rowIndex, state);
-}
-void PNGAPI pngFrameComplete(png_structp png, png_infop) {
- imageDecoder(png)->FrameComplete();
-}
-void PNGAPI pngFailed(png_structp png, png_const_charp) {
- longjmp(JMPBUF(png), 1);
-}
-} // namespace
-namespace blink {
-PNGImageReader::PNGImageReader(PngImageDecoder* decoder,
- wtf_size_t initial_offset)
- : width_(0),
- height_(0),
- decoder_(decoder),
- initial_offset_(initial_offset),
- read_offset_(initial_offset),
- progressive_decode_offset_(0),
- ihdr_offset_(0),
- idat_offset_(0),
- idat_is_part_of_animation_(false),
- expect_idats_(true),
- is_animated_(false),
- parsed_signature_(false),
- parsed_ihdr_(false),
- parse_completed_(false),
- reported_frame_count_(0),
- next_sequence_number_(0),
- fctl_needs_dat_chunk_(false),
- ignore_animation_(false) {
- png_ = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, pngFailed,
- nullptr);
- // Configure the PNG encoder to always keep the cICP, cLLI and mDCV chunks if
- // present.
- // TODO(veluca): when libpng starts supporting cICP/cLLI chunks explicitly,
- // remove this code.
- png_set_keep_unknown_chunks(
- png_, PNG_HANDLE_CHUNK_ALWAYS,
- reinterpret_cast<const png_byte*>("cICP\0cLLi\0mDCv\0cLLI\0mDCV"), 5);
- info_ = png_create_info_struct(png_);
- png_set_progressive_read_fn(png_, decoder_, nullptr, pngRowAvailable,
- pngFrameComplete);
- // This setting ensures that we display images with incorrect CMF bytes.
- // See crbug.com/807324.
- png_set_option(png_, PNG_MAXIMUM_INFLATE_WINDOW, PNG_OPTION_ON);
-}
-PNGImageReader::~PNGImageReader() {
- png_destroy_read_struct(png_ ? &png_ : nullptr, info_ ? &info_ : nullptr,
- nullptr);
- DCHECK(!png_ && !info_);
-}
-// This method reads from the FastSharedBufferReader, starting at offset,
-// and returns |length| bytes in the form of a pointer to a const png_byte*.
-// This function is used to make it easy to access data from the reader in a
-// png friendly way, and pass it to libpng for decoding.
-//
-// Pre-conditions before using this:
-// - |reader|.size() >= |read_offset| + |length|
-// - |buffer|.size() >= |length|
-// - |length| <= |kPngReadBufferSize|
-//
-// The reason for the last two precondition is that currently the png signature
-// plus IHDR chunk (8B + 25B = 33B) is the largest chunk that is read using this
-// method. If the data is not consecutive, it is stored in |buffer|, which must
-// have the size of (at least) |length|, but there's no need for it to be larger
-// than |kPngReadBufferSize|.
-static constexpr wtf_size_t kPngReadBufferSize = 33;
-const png_byte* ReadAsConstPngBytep(const FastSharedBufferReader& reader,
- wtf_size_t read_offset,
- wtf_size_t length,
- base::span<uint8_t> buffer) {
- DCHECK_LE(length, kPngReadBufferSize);
- return reinterpret_cast<const png_byte*>(
- reader.GetConsecutiveData(read_offset, length, buffer).data());
-}
-bool PNGImageReader::ShouldDecodeWithNewPNG(wtf_size_t index) const {
- if (!png_) {
- return true;
- }
- const bool first_frame_decode_in_progress = progressive_decode_offset_;
- const bool frame_size_matches_ihdr =
- frame_info_[index].frame_rect == gfx::Rect(0, 0, width_, height_);
- if (index) {
- return first_frame_decode_in_progress || !frame_size_matches_ihdr;
- }
- return !first_frame_decode_in_progress && !frame_size_matches_ihdr;
-}
-// Return false on a fatal error.
-bool PNGImageReader::Decode(SegmentReader& data, wtf_size_t index) {
- if (index >= frame_info_.size()) {
- return true;
- }
- const FastSharedBufferReader reader(&data);
- if (!is_animated_) {
- if (setjmp(JMPBUF(png_))) {
- return false;
- }
- DCHECK_EQ(0u, index);
- progressive_decode_offset_ += ProcessData(
- reader, frame_info_[0].start_offset + progressive_decode_offset_, 0);
- return true;
- }
- DCHECK(is_animated_);
- const bool decode_with_new_png = ShouldDecodeWithNewPNG(index);
- if (decode_with_new_png) {
- ClearDecodeState(0);
- png_ = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, pngFailed,
- nullptr);
- info_ = png_create_info_struct(png_);
- png_set_progressive_read_fn(png_, decoder_, pngHeaderAvailable,
- pngRowAvailable, pngFrameComplete);
- }
- if (setjmp(JMPBUF(png_))) {
- return false;
- }
- if (decode_with_new_png) {
- StartFrameDecoding(reader, index);
- }
- if (!index && (!FirstFrameFullyReceived() || progressive_decode_offset_)) {
- const bool decoded_entire_frame = ProgressivelyDecodeFirstFrame(reader);
- if (!decoded_entire_frame) {
- return true;
- }
- progressive_decode_offset_ = 0;
- } else {
- DecodeFrame(reader, index);
- }
- static png_byte iend[12] = {0, 0, 0, 0, 'I', 'E', 'N', 'D', 174, 66, 96, 130};
- png_process_data(png_, info_, iend, 12);
- png_destroy_read_struct(&png_, &info_, nullptr);
- DCHECK(!png_ && !info_);
- return true;
-}
-void PNGImageReader::StartFrameDecoding(const FastSharedBufferReader& reader,
- wtf_size_t index) {
- DCHECK_GT(ihdr_offset_, initial_offset_);
- ProcessData(reader, initial_offset_, ihdr_offset_ - initial_offset_);
- const gfx::Rect& frame_rect = frame_info_[index].frame_rect;
- if (frame_rect == gfx::Rect(0, 0, width_, height_)) {
- DCHECK_GT(idat_offset_, ihdr_offset_);
- ProcessData(reader, ihdr_offset_, idat_offset_ - ihdr_offset_);
- return;
- }
- // Process the IHDR chunk, but change the width and height so it reflects
- // the frame's width and height. ImageDecoder will apply the x,y offset.
- constexpr wtf_size_t kHeaderSize = 25;
- std::array<uint8_t, kHeaderSize> read_buffer;
- const png_byte* chunk =
- ReadAsConstPngBytep(reader, ihdr_offset_, kHeaderSize, read_buffer);
- png_byte* header = reinterpret_cast<png_byte*>(read_buffer.data());
- if (chunk != header) {
- UNSAFE_TODO(memcpy(header, chunk, kHeaderSize));
- }
- png_save_uint_32(UNSAFE_TODO(header + 8), frame_rect.width());
- png_save_uint_32(UNSAFE_TODO(header + 12), frame_rect.height());
- // IHDR has been modified, so tell libpng to ignore CRC errors.
- png_set_crc_action(png_, PNG_CRC_QUIET_USE, PNG_CRC_QUIET_USE);
- png_process_data(png_, info_, header, kHeaderSize);
- // Process the rest of the header chunks.
- DCHECK_GE(idat_offset_, ihdr_offset_ + kHeaderSize);
- ProcessData(reader, ihdr_offset_ + kHeaderSize,
- idat_offset_ - ihdr_offset_ - kHeaderSize);
-}
-// Determine if the bytes 4 to 7 of |chunk| indicate that it is a |tag| chunk.
-// - The length of |chunk| must be >= 8
-// - The length of |tag| must be = 4
-static inline bool IsChunk(const png_byte* chunk, const char* tag) {
- return UNSAFE_TODO(memcmp(chunk + 4, tag, 4)) == 0;
-}
-bool PNGImageReader::ProgressivelyDecodeFirstFrame(
- const FastSharedBufferReader& reader) {
- wtf_size_t offset = frame_info_[0].start_offset;
- // Loop while there is enough data to do progressive decoding.
- while (reader.size() >= offset + 8) {
- std::array<uint8_t, 8> read_buffer;
- // At the beginning of each loop, the offset is at the start of a chunk.
- const png_byte* chunk = ReadAsConstPngBytep(reader, offset, 8, read_buffer);
- // A large length would have been rejected in Parse.
- const png_uint_32 length = UNSAFE_TODO(png_get_uint_32(chunk));
- DCHECK_LE(length, PNG_UINT_31_MAX);
- // When an fcTL or IEND chunk is encountered, the frame data has ended.
- if (IsChunk(chunk, "fcTL") || IsChunk(chunk, "IEND")) {
- return true;
- }
- const wtf_size_t chunk_end_offset = offset + length + 12;
- DCHECK_GT(chunk_end_offset, offset);
- // If this chunk was already decoded, move on to the next.
- if (progressive_decode_offset_ >= chunk_end_offset) {
- offset = chunk_end_offset;
- continue;
- }
- // Three scenarios are possible here:
- // 1) Some bytes of this chunk were already decoded in a previous call.
- // Continue from there.
- // 2) This is an fdAT chunk. Convert it to an IDAT chunk to decode.
- // 3) This is any other chunk. Pass it to libpng for processing.
- if (progressive_decode_offset_ >= offset + 8) {
- offset = progressive_decode_offset_;
- } else if (IsChunk(chunk, "fdAT")) {
- ProcessFdatChunkAsIdat(length);
- // Skip the sequence number.
- offset += 12;
- } else {
- png_process_data(png_, info_, const_cast<png_byte*>(chunk), 8);
- offset += 8;
- }
- wtf_size_t bytes_left_in_chunk = chunk_end_offset - offset;
- wtf_size_t bytes_decoded = ProcessData(reader, offset, bytes_left_in_chunk);
- progressive_decode_offset_ = offset + bytes_decoded;
- if (bytes_decoded < bytes_left_in_chunk) {
- return false;
- }
- offset += bytes_decoded;
- }
- return false;
-}
-void PNGImageReader::ProcessFdatChunkAsIdat(png_uint_32 fdat_length) {
- // An fdAT chunk is built as follows:
- // - |length| (4B)
- // - fdAT tag (4B)
- // - sequence number (4B)
- // - frame data (|length| - 4B)
- // - CRC (4B)
- // Thus, to reformat this into an IDAT chunk, do the following:
- // - write |length| - 4 as the new length, since the sequence number
- // must be removed.
- // - change the tag to IDAT.
- // - omit the sequence number from the data part of the chunk.
- png_byte chunk_idat[] = {0, 0, 0, 0, 'I', 'D', 'A', 'T'};
- DCHECK_GE(fdat_length, 4u);
- png_save_uint_32(chunk_idat, fdat_length - 4u);
- // The CRC is incorrect when applied to the modified fdAT.
- png_set_crc_action(png_, PNG_CRC_QUIET_USE, PNG_CRC_QUIET_USE);
- png_process_data(png_, info_, chunk_idat, 8);
-}
-void PNGImageReader::DecodeFrame(const FastSharedBufferReader& reader,
- wtf_size_t index) {
- wtf_size_t offset = frame_info_[index].start_offset;
- wtf_size_t end_offset = offset + frame_info_[index].byte_length;
- std::array<uint8_t, 8> read_buffer;
- while (offset < end_offset) {
- const png_byte* chunk = ReadAsConstPngBytep(reader, offset, 8, read_buffer);
- const png_uint_32 length = UNSAFE_TODO(png_get_uint_32(chunk));
- DCHECK_LE(length, PNG_UINT_31_MAX);
- if (IsChunk(chunk, "fdAT")) {
- ProcessFdatChunkAsIdat(length);
- // The frame data and the CRC span |length| bytes, so skip the
- // sequence number and process |length| bytes to decode the frame.
- ProcessData(reader, offset + 12, length);
- } else {
- png_process_data(png_, info_, const_cast<png_byte*>(chunk), 8);
- ProcessData(reader, offset + 8, length + 4);
- }
- offset += 12 + length;
- }
-}
-// Compute the CRC and compare to the stored value.
-static bool CheckCrc(const FastSharedBufferReader& reader,
- wtf_size_t chunk_start,
- wtf_size_t chunk_length) {
- constexpr wtf_size_t kSizeNeededForfcTL = 26 + 4;
- std::array<uint8_t, kSizeNeededForfcTL> read_buffer;
- DCHECK_LE(chunk_length + 4u, kSizeNeededForfcTL);
- const png_byte* chunk = ReadAsConstPngBytep(reader, chunk_start + 4,
- chunk_length + 4, read_buffer);
- std::array<uint8_t, 4> crc_buffer;
- const png_byte* crc_position = ReadAsConstPngBytep(
- reader, chunk_start + 8 + chunk_length, 4, crc_buffer);
- png_uint_32 crc = UNSAFE_TODO(png_get_uint_32(crc_position));
- return crc == crc32(crc32(0, Z_NULL, 0), chunk, chunk_length + 4);
-}
-bool PNGImageReader::CheckSequenceNumber(const png_byte* position) {
- png_uint_32 sequence = UNSAFE_TODO(png_get_uint_32(position));
- if (sequence != next_sequence_number_ || sequence > PNG_UINT_31_MAX) {
- return false;
- }
- ++next_sequence_number_;
- return true;
-}
-// Return false if there was a fatal error; true otherwise.
-bool PNGImageReader::Parse(SegmentReader& data, ParseQuery query) {
- if (parse_completed_) {
- return true;
- }
- const FastSharedBufferReader reader(&data);
- if (!ParseSize(reader)) {
- return false;
- }
- if (!decoder_->IsDecodedSizeAvailable()) {
- return true;
- }
- // For non animated images (identified by no acTL chunk before the IDAT),
- // there is no need to continue parsing.
- if (!is_animated_) {
- FrameInfo frame;
- frame.start_offset = read_offset_;
- // This should never be read in this case, but initialize just in case.
- frame.byte_length = kFirstFrameIndicator;
- frame.duration = 0;
- frame.frame_rect = gfx::Rect(0, 0, width_, height_);
- frame.disposal_method = ImageFrame::DisposalMethod::kDisposeKeep;
- frame.alpha_blend = ImageFrame::AlphaBlendSource::kBlendAtopBgcolor;
- DCHECK(frame_info_.empty());
- frame_info_.push_back(frame);
- parse_completed_ = true;
- return true;
- }
- if (query == ParseQuery::kSize) {
- return true;
- }
- DCHECK_EQ(ParseQuery::kMetaData, query);
- DCHECK(is_animated_);
- // Loop over the data and manually register all frames. Nothing is passed to
- // libpng for processing. A frame is registered on the next fcTL chunk or
- // when the IEND chunk is found. This ensures that only complete frames are
- // reported, unless there is an error in the stream.
- std::array<uint8_t, kPngReadBufferSize> read_buffer;
- for (;;) {
- constexpr wtf_size_t kChunkHeaderSize = 8;
- wtf_size_t chunk_start_offset;
- if (!base::CheckAdd(read_offset_, kChunkHeaderSize)
- .AssignIfValid(&chunk_start_offset)) {
- // Overflow.
- return false;
- }
- if (reader.size() < chunk_start_offset) {
- // Insufficient data to decode the next chunk header.
- break;
- }
- const png_byte* chunk = ReadAsConstPngBytep(reader, read_offset_,
- kChunkHeaderSize, read_buffer);
- const wtf_size_t length = UNSAFE_TODO(png_get_uint_32(chunk));
- if (length > PNG_UINT_31_MAX) {
- return false;
- }
- wtf_size_t chunk_end_offset;
- if (!base::CheckAdd(read_offset_, base::CheckAdd(12, length))
- .AssignIfValid(&chunk_end_offset)) {
- // Overflow.
- return false;
- }
- const bool idat = IsChunk(chunk, "IDAT");
- if (idat && !expect_idats_) {
- return false;
- }
- const bool fdat = IsChunk(chunk, "fdAT");
- if (fdat && expect_idats_) {
- return false;
- }
- if (fdat || (idat && idat_is_part_of_animation_)) {
- fctl_needs_dat_chunk_ = false;
- if (!new_frame_.start_offset) {
- // Beginning of a new frame's data.
- new_frame_.start_offset = read_offset_;
- if (frame_info_.empty()) {
- // This is the first frame. Report it immediately so it can be
- // decoded progressively.
- new_frame_.byte_length = kFirstFrameIndicator;
- frame_info_.push_back(new_frame_);
- }
- }
- if (fdat) {
- if (length < 4) {
- // The sequence number requires 4 bytes. Further,
- // ProcessFdatChunkAsIdat expects to be able to create an IDAT with
- // |newLength| = length - 4. Prevent underflow in that calculation.
- return false;
- }
- if (reader.size() < read_offset_ + 8 + 4) {
- return true;
- }
- const png_byte* sequence_position =
- ReadAsConstPngBytep(reader, read_offset_ + 8, 4, read_buffer);
- if (!CheckSequenceNumber(sequence_position)) {
- return false;
- }
- }
- } else if (IsChunk(chunk, "fcTL") || IsChunk(chunk, "IEND")) {
- // This marks the end of the previous frame.
- if (new_frame_.start_offset) {
- new_frame_.byte_length = read_offset_ - new_frame_.start_offset;
- if (frame_info_[0].byte_length == kFirstFrameIndicator) {
- frame_info_[0].byte_length = new_frame_.byte_length;
- } else {
- frame_info_.push_back(new_frame_);
- if (IsChunk(chunk, "fcTL")) {
- if (frame_info_.size() >= reported_frame_count_) {
- return false;
- }
- } else { // IEND
- if (frame_info_.size() != reported_frame_count_) {
- return false;
- }
- }
- }
- new_frame_.start_offset = 0;
- }
- if (reader.size() < chunk_end_offset) {
- return true;
- }
- if (IsChunk(chunk, "IEND")) {
- parse_completed_ = true;
- return true;
- }
- if (length != 26 || !CheckCrc(reader, read_offset_, length)) {
- return false;
- }
- chunk =
- ReadAsConstPngBytep(reader, read_offset_ + 8, length, read_buffer);
- if (!ParseFrameInfo(chunk)) {
- return false;
- }
- expect_idats_ = false;
- } else if (IsChunk(chunk, "acTL")) {
- // There should only be one acTL chunk, and it should be before the
- // IDAT chunk.
- return false;
- }
- read_offset_ = chunk_end_offset;
- }
- return true;
-}
-// If `length` == 0, read until the stream ends. Return number of bytes
-// processed.
-wtf_size_t PNGImageReader::ProcessData(const FastSharedBufferReader& reader,
- wtf_size_t offset,
- wtf_size_t length) {
- wtf_size_t total_processed_bytes = 0;
- while (reader.size() > offset) {
- base::span<const uint8_t> segment = reader.GetSomeData(offset);
- if (length > 0 && segment.size() > length - total_processed_bytes) {
- segment = segment.first(length - total_processed_bytes);
- }
- png_process_data(png_, info_, const_cast<uint8_t*>(segment.data()),
- segment.size());
- offset += segment.size();
- total_processed_bytes += segment.size();
- if (total_processed_bytes == length) {
- return length;
- }
- }
- return total_processed_bytes;
-}
-// Process up to the start of the IDAT with libpng.
-// Return false for a fatal error. True otherwise.
-bool PNGImageReader::ParseSize(const FastSharedBufferReader& reader) {
- if (decoder_->IsDecodedSizeAvailable()) {
- return true;
- }
- std::array<uint8_t, kPngReadBufferSize> read_buffer;
- if (setjmp(JMPBUF(png_))) {
- return false;
- }
- if (!parsed_signature_) {
- constexpr wtf_size_t kNumSignatureBytes = 8;
- wtf_size_t signature_end_offset;
- if (!base::CheckAdd(read_offset_, kNumSignatureBytes)
- .AssignIfValid(&signature_end_offset)) {
- return false;
- }
- if (reader.size() < signature_end_offset) {
- return true;
- }
- const png_byte* chunk = ReadAsConstPngBytep(
- reader, read_offset_, kNumSignatureBytes, read_buffer);
- png_process_data(png_, info_, const_cast<png_byte*>(chunk),
- kNumSignatureBytes);
- read_offset_ = signature_end_offset;
- parsed_signature_ = true;
- new_frame_.start_offset = 0;
- }
- // Process some chunks manually, and pass some to libpng.
- for (png_uint_32 length = 0; reader.size() >= read_offset_ + 8;
- // This call will not overflow since it was already checked below, after
- // calculating chunk_end_offset.
- read_offset_ += length + 12) {
- const png_byte* chunk =
- ReadAsConstPngBytep(reader, read_offset_, 8, read_buffer);
- length = UNSAFE_TODO(png_get_uint_32(chunk));
- if (length > PNG_UINT_31_MAX) {
- return false;
- }
- wtf_size_t chunk_end_offset;
- if (!base::CheckAdd(read_offset_, base::CheckAdd(12, length))
- .AssignIfValid(&chunk_end_offset)) {
- // Overflow
- return false;
- }
- if (IsChunk(chunk, "IDAT")) {
- // Done with header chunks.
- idat_offset_ = read_offset_;
- fctl_needs_dat_chunk_ = false;
- if (ignore_animation_) {
- is_animated_ = false;
- }
- // SetSize() requires bit depth information to correctly fallback to 8888
- // decoding if there is not enough memory to decode to f16 pixel format.
- // SetBitDepth() requires repition count to correctly fallback to 8888
- // decoding for multi-frame APNGs (https://crbug.com/874057). Therefore,
- // the order of the next three calls matters.
- if (!is_animated_ || 1 == reported_frame_count_) {
- decoder_->SetRepetitionCount(kAnimationNone);
- }
- decoder_->SetBitDepth();
- if (!decoder_->SetSize(width_, height_)) {
- return false;
- }
- decoder_->SetColorSpace();
- decoder_->HeaderAvailable();
- return true;
- }
- // Wait until the entire chunk is available for parsing simplicity.
- if (reader.size() < chunk_end_offset) {
- break;
- }
- if (IsChunk(chunk, "acTL")) {
- if (ignore_animation_) {
- continue;
- }
- if (is_animated_ || length != 8 || !parsed_ihdr_ ||
- !CheckCrc(reader, read_offset_, 8)) {
- ignore_animation_ = true;
- continue;
- }
- chunk =
- ReadAsConstPngBytep(reader, read_offset_ + 8, length, read_buffer);
- reported_frame_count_ = UNSAFE_TODO(png_get_uint_32(chunk));
- if (!reported_frame_count_ || reported_frame_count_ > PNG_UINT_31_MAX) {
- ignore_animation_ = true;
- continue;
- }
- png_uint_32 repetition_count = UNSAFE_TODO(png_get_uint_32(chunk + 4));
- if (repetition_count > PNG_UINT_31_MAX) {
- ignore_animation_ = true;
- continue;
- }
- is_animated_ = true;
- decoder_->SetRepetitionCount(static_cast<int>(repetition_count) - 1);
- } else if (IsChunk(chunk, "fcTL")) {
- if (ignore_animation_) {
- continue;
- }
- if (length != 26 || !parsed_ihdr_ ||
- !CheckCrc(reader, read_offset_, 26)) {
- ignore_animation_ = true;
- continue;
- }
- chunk =
- ReadAsConstPngBytep(reader, read_offset_ + 8, length, read_buffer);
- if (!ParseFrameInfo(chunk) ||
- new_frame_.frame_rect != gfx::Rect(0, 0, width_, height_)) {
- ignore_animation_ = true;
- continue;
- }
- idat_is_part_of_animation_ = true;
- } else if (IsChunk(chunk, "fdAT")) {
- ignore_animation_ = true;
- } else {
- auto is_necessary_ancillary = [](const png_byte* chunk) {
- for (const char* tag : {"tRNS", "cHRM", "iCCP", "sRGB", "gAMA", "cICP",
- "cLLi", "cLLI", "mDCv", "mDCV", "eXIf"}) {
- if (IsChunk(chunk, tag)) {
- return true;
- }
- }
- return false;
- };
- // Determine if the chunk type of |chunk| is "critical".
- // (Ancillary bit == 0; the chunk is required for display).
- bool is_critical_chunk = (UNSAFE_TODO(chunk[4]) & 1u << 5) == 0;
- if (is_critical_chunk || is_necessary_ancillary(chunk)) {
- png_process_data(png_, info_, const_cast<png_byte*>(chunk), 8);
- ProcessData(reader, read_offset_ + 8, length + 4);
- if (IsChunk(chunk, "IHDR")) {
- parsed_ihdr_ = true;
- ihdr_offset_ = read_offset_;
- width_ = png_get_image_width(png_, info_);
- height_ = png_get_image_height(png_, info_);
- }
- }
- }
- }
- // Not enough data to call HeaderAvailable.
- return true;
-}
-void PNGImageReader::ClearDecodeState(wtf_size_t index) {
- if (index) {
- return;
- }
- png_destroy_read_struct(png_ ? &png_ : nullptr, info_ ? &info_ : nullptr,
- nullptr);
- DCHECK(!png_ && !info_);
- progressive_decode_offset_ = 0;
-}
-const PNGImageReader::FrameInfo& PNGImageReader::GetFrameInfo(
- wtf_size_t index) const {
- DCHECK(index < frame_info_.size());
- return frame_info_[index];
-}
-// Extract the fcTL frame control info and store it in new_frame_. The length
-// check on the fcTL data has been done by the calling code.
-bool PNGImageReader::ParseFrameInfo(const png_byte* data) {
- if (fctl_needs_dat_chunk_) {
- return false;
- }
- png_uint_32 frame_width = UNSAFE_TODO(png_get_uint_32(data + 4));
- png_uint_32 frame_height = UNSAFE_TODO(png_get_uint_32(data + 8));
- png_uint_32 x_offset = UNSAFE_TODO(png_get_uint_32(data + 12));
- png_uint_32 y_offset = UNSAFE_TODO(png_get_uint_32(data + 16));
- png_uint_16 delay_numerator = UNSAFE_TODO(png_get_uint_16(data + 20));
- png_uint_16 delay_denominator = UNSAFE_TODO(png_get_uint_16(data + 22));
- if (!CheckSequenceNumber(data)) {
- return false;
- }
- if (!frame_width || !frame_height) {
- return false;
- }
- {
- png_uint_32 frame_right;
- if (!base::CheckAdd(x_offset, frame_width).AssignIfValid(&frame_right) ||
- frame_right > width_) {
- return false;
- }
- }
- {
- png_uint_32 frame_bottom;
- if (!base::CheckAdd(y_offset, frame_height).AssignIfValid(&frame_bottom) ||
- frame_bottom > height_) {
- return false;
- }
- }
- new_frame_.frame_rect =
- gfx::Rect(x_offset, y_offset, frame_width, frame_height);
- if (delay_denominator) {
- new_frame_.duration = delay_numerator * 1000 / delay_denominator;
- } else {
- new_frame_.duration = delay_numerator * 10;
- }
- enum DisposeOperations : png_byte {
- kAPNG_DISPOSE_OP_NONE = 0,
- kAPNG_DISPOSE_OP_BACKGROUND = 1,
- kAPNG_DISPOSE_OP_PREVIOUS = 2,
- };
- const png_byte& dispose_op = UNSAFE_TODO(data[24]);
- switch (dispose_op) {
- case kAPNG_DISPOSE_OP_NONE:
- new_frame_.disposal_method = ImageFrame::DisposalMethod::kDisposeKeep;
- break;
- case kAPNG_DISPOSE_OP_BACKGROUND:
- new_frame_.disposal_method =
- ImageFrame::DisposalMethod::kDisposeOverwriteBgcolor;
- break;
- case kAPNG_DISPOSE_OP_PREVIOUS:
- new_frame_.disposal_method =
- ImageFrame::DisposalMethod::kDisposeOverwritePrevious;
- break;
- default:
- return false;
- }
- enum BlendOperations : png_byte {
- kAPNG_BLEND_OP_SOURCE = 0,
- kAPNG_BLEND_OP_OVER = 1,
- };
- const png_byte& blend_op = UNSAFE_TODO(data[25]);
- switch (blend_op) {
- case kAPNG_BLEND_OP_SOURCE:
- new_frame_.alpha_blend = ImageFrame::AlphaBlendSource::kBlendAtopBgcolor;
- break;
- case kAPNG_BLEND_OP_OVER:
- new_frame_.alpha_blend =
- ImageFrame::AlphaBlendSource::kBlendAtopPreviousFrame;
- break;
- default:
- return false;
- }
- fctl_needs_dat_chunk_ = true;
- return true;
-}
-} // namespace blink
-
-/*
- * Copyright (C) 2006 Apple Computer, Inc.
- * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
- *
- * Portions are Copyright (C) 2001 mozilla.org
- *
- * Other contributors:
- * Stuart Parmenter <stuart@mozilla.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Alternatively, the contents of this file may be used under the terms
- * of either the Mozilla Public License Version 1.1, found at
- * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
- * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
- * (the "GPL"), in which case the provisions of the MPL or the GPL are
- * applicable instead of those above. If you wish to allow use of your
- * version of this file only under the terms of one of those two
- * licenses (the MPL or the GPL) and not to allow others to use your
- * version of this file under the LGPL, indicate your decision by
- * deletingthe provisions above and replace them with the notice and
- * other provisions required by the MPL or the GPL, as the case may be.
- * If you do not delete the provisions above, a recipient may use your
- * version of this file under any of the LGPL, the MPL or the GPL.
- */
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/351564777): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-#include "third_party/blink/renderer/platform/image-decoders/png/png_image_decoder.h"
-#include <memory>
-#include "base/containers/adapters.h"
-#include "base/numerics/checked_math.h"
-#include "media/base/video_color_space.h"
-#include "skia/ext/cicp.h"
-#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
-#include "third_party/skia/include/core/SkColorSpace.h"
-#include "third_party/skia/modules/skcms/skcms.h"
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
-#include <arm_neon.h>
-#endif
-namespace blink {
-PngImageDecoder::PngImageDecoder(
- AlphaOption alpha_option,
- ColorBehavior color_behavior,
- wtf_size_t max_decoded_bytes,
- wtf_size_t offset,
- HighBitDepthDecodingOption high_bit_depth_decoding_option)
- : ImageDecoder(alpha_option,
- high_bit_depth_decoding_option,
- color_behavior,
- cc::AuxImage::kDefault,
- max_decoded_bytes),
- offset_(offset),
- current_frame_(0),
- // It would be logical to default to kAnimationNone, but BitmapImage uses
- // that as a signal to never check again, meaning the actual count will
- // never be respected.
- repetition_count_(kAnimationLoopOnce),
- has_alpha_channel_(false),
- current_buffer_saw_alpha_(false),
- decode_to_half_float_(false),
- bit_depth_(0) {}
-PngImageDecoder::~PngImageDecoder() = default;
-String PngImageDecoder::FilenameExtension() const {
- return "png";
-}
-const AtomicString& PngImageDecoder::MimeType() const {
- DEFINE_STATIC_LOCAL(const AtomicString, png_mime_type, ("image/png"));
- return png_mime_type;
-}
-bool PngImageDecoder::SetFailed() {
- reader_.reset();
- return ImageDecoder::SetFailed();
-}
-wtf_size_t PngImageDecoder::DecodeFrameCount() {
- Parse(ParseQuery::kMetaData);
- return Failed() ? frame_buffer_cache_.size() : reader_->FrameCount();
-}
-void PngImageDecoder::DecodeSize() {
- Parse(ParseQuery::kSize);
-}
-void PngImageDecoder::Decode(wtf_size_t index) {
- Parse(ParseQuery::kMetaData);
- if (Failed()) {
- return;
- }
- UpdateAggressivePurging(index);
- bool incomplete_parse = false;
- Vector<wtf_size_t> frames_to_decode = FindFramesToDecode(index);
- for (const auto& frame : base::Reversed(frames_to_decode)) {
- current_frame_ = frame;
- if (!reader_->Decode(*data_, frame)) {
- SetFailed();
- return;
- }
- // If this returns false, we need more data to continue decoding.
- if (!PostDecodeProcessing(frame)) {
- incomplete_parse = true;
- break;
- }
- }
- // It is also a fatal error if all data is received and we have decoded all
- // frames available but the file is truncated.
- if (index >= frame_buffer_cache_.size() - 1 && IsAllDataReceived()) {
- incomplete_parse |= (reader_ && !reader_->ParseCompleted());
- if (incomplete_parse) {
- SetFailed();
- }
- }
-}
-void PngImageDecoder::Parse(ParseQuery query) {
- if (Failed() || (reader_ && reader_->ParseCompleted())) {
- return;
- }
- if (!reader_) {
- reader_ = std::make_unique<PNGImageReader>(this, offset_);
- }
- if (!reader_->Parse(*data_, query)) {
- SetFailed();
- }
-}
-void PngImageDecoder::ClearFrameBuffer(wtf_size_t index) {
- if (reader_) {
- reader_->ClearDecodeState(index);
- }
- ImageDecoder::ClearFrameBuffer(index);
-}
-bool PngImageDecoder::CanReusePreviousFrameBuffer(wtf_size_t index) const {
- DCHECK(index < frame_buffer_cache_.size());
- return frame_buffer_cache_[index].GetDisposalMethod() !=
- ImageFrame::kDisposeOverwritePrevious;
-}
-void PngImageDecoder::SetRepetitionCount(int repetition_count) {
- repetition_count_ = repetition_count;
-}
-int PngImageDecoder::RepetitionCount() const {
- return Failed() ? kAnimationLoopOnce : repetition_count_;
-}
-void PngImageDecoder::InitializeNewFrame(wtf_size_t index) {
- const PNGImageReader::FrameInfo& frame_info = reader_->GetFrameInfo(index);
- ImageFrame& buffer = frame_buffer_cache_[index];
- if (decode_to_half_float_) {
- buffer.SetPixelFormat(ImageFrame::PixelFormat::kRGBA_F16);
- }
- DCHECK(gfx::Rect(Size()).Contains(frame_info.frame_rect));
- buffer.SetOriginalFrameRect(frame_info.frame_rect);
- buffer.SetDuration(base::Milliseconds(frame_info.duration));
- buffer.SetDisposalMethod(frame_info.disposal_method);
- buffer.SetAlphaBlendSource(frame_info.alpha_blend);
- wtf_size_t previous_frame_index = FindRequiredPreviousFrame(index, false);
- buffer.SetRequiredPreviousFrameIndex(previous_frame_index);
-}
-// Returns nullptr if the cICP chunk is invalid, or if it describes an
-// unsupported color profile.
-// See https://w3c.github.io/PNG-spec/#11cICP for the definition of this chunk.
-static std::unique_ptr<ColorProfile> ParseCicpChunk(
- const png_unknown_chunk& chunk) {
- // First, validate the cICP chunk.
- // cICP must be 4 bytes.
- if (chunk.size != 4) {
- return nullptr;
- }
- // Memory layout: ptmf, with p representing the colour primaries, t
- // representing the transfer characteristics, m the matrix coefficients, and f
- // whether the data is full or limited range.
- uint8_t primaries = chunk.data[0];
- uint8_t trc = chunk.data[1];
- uint8_t matrix_coefficients = chunk.data[2];
- uint8_t range_u8 = chunk.data[3];
- sk_sp<SkColorSpace> sk_color_space = skia::CICPGetSkColorSpace(
- primaries, trc, matrix_coefficients, range_u8, /*prefer_srgb_trfn=*/true);
- if (!sk_color_space) {
- return nullptr;
- }
- skcms_ICCProfile profile;
- sk_color_space->toProfile(&profile);
- return std::make_unique<ColorProfile>(profile);
-}
-static inline std::unique_ptr<ColorProfile> ReadColorProfile(png_structp png,
- png_infop info) {
- png_unknown_chunkp unknown_chunks;
- size_t num_unknown_chunks =
- png_get_unknown_chunks(png, info, &unknown_chunks);
- for (size_t i = 0; i < num_unknown_chunks; i++) {
- const auto& chunk = unknown_chunks[i];
- if (strcmp(reinterpret_cast<const char*>(chunk.name), "cICP") == 0) {
- // We found a cICP chunk, which takes priority over other chunks.
- std::unique_ptr<ColorProfile> cicp_color_profile = ParseCicpChunk(chunk);
- // Ignore cICP if it is invalid or if the color profile it describes is
- // not supported.
- if (cicp_color_profile) {
- return cicp_color_profile;
- }
- }
- }
- if (png_get_valid(png, info, PNG_INFO_sRGB)) {
- return std::make_unique<ColorProfile>(*skcms_sRGB_profile());
- }
- png_charp name;
- int compression;
- png_bytep buffer;
- png_uint_32 length;
- if (png_get_iCCP(png, info, &name, &compression, &buffer, &length)) {
- return ColorProfile::Create(base::as_bytes(base::span(buffer, length)));
- }
- png_fixed_point inverse_gamma;
- bool got_gama_chunk = png_get_gAMA_fixed(png, info, &inverse_gamma);
- if (!got_gama_chunk) {
- return nullptr;
- }
- struct pngFixedToFloat {
- explicit pngFixedToFloat(png_fixed_point value)
- : float_value(.00001f * value) {}
- operator float() { return float_value; }
- float float_value;
- };
- png_fixed_point chrm[8];
- if (!png_get_cHRM_fixed(png, info, &chrm[0], &chrm[1], &chrm[2], &chrm[3],
- &chrm[4], &chrm[5], &chrm[6], &chrm[7])) {
- if (got_gama_chunk) {
- // `kPngGammaThreshold` mimics `PNG_GAMMA_THRESHOLD_FIXED` from `libpng`
- // without using internal/private `png_muldiv` and/or
- // `png_gamma_significant`.
- constexpr float kPngGammaThreshold = 0.05f;
- constexpr float kMinNeutralValue = 1.0f - kPngGammaThreshold;
- constexpr float kMaxNeutralValue = 1.0f + kPngGammaThreshold;
- float floating_inverse_gamma = pngFixedToFloat(inverse_gamma);
- float tmp = floating_inverse_gamma * 2.2f;
- bool is_neutral = kMinNeutralValue < tmp && tmp < kMaxNeutralValue;
- if (!is_neutral) {
- skcms_ICCProfile profile;
- skcms_Init(&profile);
- skcms_SetXYZD50(&profile, &SkNamedGamut::kSRGB);
- skcms_TransferFunction fn = SkNamedTransferFn::k2Dot2;
- fn.g = 1.0f / floating_inverse_gamma;
- skcms_SetTransferFunction(&profile, &fn);
- return std::make_unique<ColorProfile>(profile);
- }
- }
- return nullptr;
- }
- // cHRM and gAMA tags are both present. The PNG spec states that cHRM is
- // valid even without gAMA but we cannot apply the cHRM without guessing
- // a gAMA. Color correction is not a guessing game: match the behavior
- // of Safari and Firefox instead (compat).
- float rx = pngFixedToFloat(chrm[2]);
- float ry = pngFixedToFloat(chrm[3]);
- float gx = pngFixedToFloat(chrm[4]);
- float gy = pngFixedToFloat(chrm[5]);
- float bx = pngFixedToFloat(chrm[6]);
- float by = pngFixedToFloat(chrm[7]);
- float wx = pngFixedToFloat(chrm[0]);
- float wy = pngFixedToFloat(chrm[1]);
- skcms_Matrix3x3 to_xyzd50;
- if (!skcms_PrimariesToXYZD50(rx, ry, gx, gy, bx, by, wx, wy, &to_xyzd50)) {
- return nullptr;
- }
- skcms_TransferFunction fn;
- fn.g = 1.0f / pngFixedToFloat(inverse_gamma);
- fn.a = 1.0f;
- fn.b = fn.c = fn.d = fn.e = fn.f = 0.0f;
- skcms_ICCProfile profile;
- skcms_Init(&profile);
- skcms_SetTransferFunction(&profile, &fn);
- skcms_SetXYZD50(&profile, &to_xyzd50);
- return std::make_unique<ColorProfile>(profile);
-}
-static inline void ReadHDRMetadata(
- png_structp png,
- png_infop info,
- gfx::HDRMetadata* hdr_metadata) {
- std::optional<gfx::HdrMetadataCta861_3> clli;
- std::optional<gfx::HdrMetadataSmpteSt2086> mdcv;
- png_unknown_chunkp unknown_chunks;
- size_t num_unknown_chunks =
- png_get_unknown_chunks(png, info, &unknown_chunks);
- for (size_t chunk_index = 0; chunk_index < num_unknown_chunks;
- chunk_index++) {
- const auto& chunk = unknown_chunks[chunk_index];
- if (strcmp(reinterpret_cast<const char*>(chunk.name), "cLLi") == 0 ||
- strcmp(reinterpret_cast<const char*>(chunk.name), "cLLI") == 0) {
- if (chunk.size != 8) {
- continue;
- }
- const uint32_t max_cll_times_10000 = (chunk.data[0] << 24) |
- (chunk.data[1] << 16) |
- (chunk.data[2] << 8) | chunk.data[3];
- const uint32_t max_fall_times_10000 =
- (chunk.data[4] << 24) | (chunk.data[5] << 16) | (chunk.data[6] << 8) |
- chunk.data[7];
- clli.emplace(max_cll_times_10000 / 10000, max_fall_times_10000 / 10000);
- continue;
- }
- if (strcmp(reinterpret_cast<const char*>(chunk.name), "mDCv") == 0 ||
- strcmp(reinterpret_cast<const char*>(chunk.name), "mDCV") == 0) {
- if (chunk.size != 24) {
- continue;
- }
- // Red, green, blue, white, each with x and y.
- uint16_t chromaticities_times_50000[8];
- for (int i = 0; i < 8; ++i) {
- chromaticities_times_50000[i] =
- (chunk.data[2 * i] << 8) | chunk.data[2 * i + 1];
- }
- const uint32_t max_luminance_times_10000 =
- (chunk.data[16] << 24) | (chunk.data[17] << 16) |
- (chunk.data[18] << 8) | chunk.data[19];
- const uint32_t min_luminance_times_10000 =
- (chunk.data[20] << 24) | (chunk.data[21] << 16) |
- (chunk.data[22] << 8) | chunk.data[23];
- SkColorSpacePrimaries primaries = {
- chromaticities_times_50000[0] / 50000.f,
- chromaticities_times_50000[1] / 50000.f,
- chromaticities_times_50000[2] / 50000.f,
- chromaticities_times_50000[3] / 50000.f,
- chromaticities_times_50000[4] / 50000.f,
- chromaticities_times_50000[5] / 50000.f,
- chromaticities_times_50000[6] / 50000.f,
- chromaticities_times_50000[7] / 50000.f,
- };
- mdcv.emplace(primaries, max_luminance_times_10000 * 1e-4f,
- min_luminance_times_10000 * 1e-4f);
- continue;
- }
- }
- if (clli || mdcv) {
- if (clli) {
- (*hdr_metadata).cta_861_3 = clli;
- }
- if (mdcv) {
- (*hdr_metadata).smpte_st_2086 = mdcv;
- }
- }
-}
-void PngImageDecoder::SetColorSpace() {
- if (IgnoresColorSpace()) {
- return;
- }
- png_structp png = reader_->PngPtr();
- png_infop info = reader_->InfoPtr();
- if (auto profile = ReadColorProfile(png, info)) {
- SetEmbeddedColorProfile(std::move(profile));
- }
- ReadHDRMetadata(png, info, &hdr_metadata_);
-}
-void PngImageDecoder::SetBitDepth() {
- if (bit_depth_) {
- return;
- }
- png_structp png = reader_->PngPtr();
- png_infop info = reader_->InfoPtr();
- bit_depth_ = png_get_bit_depth(png, info);
- decode_to_half_float_ =
- bit_depth_ == 16 &&
- high_bit_depth_decoding_option_ == kHighBitDepthToHalfFloat &&
- // TODO(crbug.com/874057): Implement support for 16-bit PNGs w/
- // ImageFrame::kBlendAtopPreviousFrame.
- repetition_count_ == kAnimationNone;
-}
-bool PngImageDecoder::ImageIsHighBitDepth() {
- SetBitDepth();
- return bit_depth_ == 16 &&
- // TODO(crbug.com/874057): Implement support for 16-bit PNGs w/
- // ImageFrame::kBlendAtopPreviousFrame.
- repetition_count_ == kAnimationNone;
-}
-bool PngImageDecoder::SetSize(unsigned width, unsigned height) {
- DCHECK(!IsDecodedSizeAvailable());
- // Protect against large PNGs. See http://bugzil.la/251381 for more details.
- const uint32_t kMaxPNGSize = 1000000;
- return (width <= kMaxPNGSize) && (height <= kMaxPNGSize) &&
- ImageDecoder::SetSize(width, height);
-}
-void PngImageDecoder::HeaderAvailable() {
- DCHECK(IsDecodedSizeAvailable());
- png_structp png = reader_->PngPtr();
- png_infop info = reader_->InfoPtr();
- png_uint_32 width, height;
- int bit_depth, color_type, interlace_type, compression_type;
- png_get_IHDR(png, info, &width, &height, &bit_depth, &color_type,
- &interlace_type, &compression_type, nullptr);
- // The options we set here match what Mozilla does.
- // Expand to ensure we use 24-bit for RGB and 32-bit for RGBA.
- if (color_type == PNG_COLOR_TYPE_PALETTE ||
- (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)) {
- png_set_expand(png);
- }
- if (png_get_valid(png, info, PNG_INFO_tRNS)) {
- png_set_expand(png);
- }
- if (!decode_to_half_float_) {
- png_set_strip_16(png);
- }
- if (color_type == PNG_COLOR_TYPE_GRAY ||
- color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
- png_set_gray_to_rgb(png);
- }
- // process eXIf chunk
- png_uint_32 exif_size = 0;
- png_bytep exif_buffer = nullptr;
- if (png_get_eXIf_1(png, info, &exif_size, &exif_buffer) != 0) {
- // exif data exists
- if (exif_size != 0 && exif_buffer) {
- ApplyExifMetadata(SkData::MakeWithoutCopy(exif_buffer, exif_size).get(),
- gfx::Size(width, height));
- }
- }
- // Tell libpng to send us rows for interlaced pngs.
- if (interlace_type == PNG_INTERLACE_ADAM7) {
- png_set_interlace_handling(png);
- }
- // Update our info now (so we can get color channel info).
- png_read_update_info(png, info);
- int channels = png_get_channels(png, info);
- DCHECK(channels == 3 || channels == 4);
- has_alpha_channel_ = (channels == 4);
-}
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
-// Premultiply RGB color channels by alpha, swizzle RGBA to SkPMColor
-// order, and return the AND of all alpha channels.
-static inline void SetRGBAPremultiplyRowNeon(png_bytep src_ptr,
- const int pixel_count,
- ImageFrame::PixelData* dst_pixel,
- unsigned* const alpha_mask) {
- assert(dst_pixel);
- assert(alpha_mask);
- constexpr int kPixelsPerLoad = 8;
- // Input registers.
- uint8x8x4_t rgba;
- // Alpha mask.
- uint8x8_t alpha_mask_vector = vdup_n_u8(255);
- // Scale the color channel by alpha - the opacity coefficient.
- auto premultiply = [](uint8x8_t c, uint8x8_t a) {
- // First multiply the color by alpha, expanding to 16-bit (max 255*255).
- uint16x8_t ca = vmull_u8(c, a);
- // Now we need to round back down to 8-bit, returning (x+127)/255.
- // (x+127)/255 == (x + ((x+128)>>8) + 128)>>8. This form is well suited
- // to NEON: vrshrq_n_u16(...,8) gives the inner (x+128)>>8, and
- // vraddhn_u16() both the outer add-shift and our conversion back to 8-bit.
- return vraddhn_u16(ca, vrshrq_n_u16(ca, 8));
- };
- int i = pixel_count;
- for (; i >= kPixelsPerLoad; i -= kPixelsPerLoad) {
- // Reads 8 pixels at once, each color channel in a different
- // 64-bit register.
- rgba = vld4_u8(src_ptr);
- // AND pixel alpha values into the alpha detection mask.
- alpha_mask_vector = vand_u8(alpha_mask_vector, rgba.val[3]);
- uint64_t alphas_u64 = vget_lane_u64(vreinterpret_u64_u8(rgba.val[3]), 0);
- // If all of the pixels are opaque, no need to premultiply.
- if (~alphas_u64 == 0) {
-#if SK_PMCOLOR_BYTE_ORDER(R, G, B, A)
- // Already in right order, write back (interleaved) results to memory.
- vst4_u8(reinterpret_cast<uint8_t*>(dst_pixel), rgba);
-#elif SK_PMCOLOR_BYTE_ORDER(B, G, R, A)
- // Re-order color channels for BGRA.
- uint8x8x4_t bgra = {rgba.val[2], rgba.val[1], rgba.val[0], rgba.val[3]};
- // Write back (interleaved) results to memory.
- vst4_u8(reinterpret_cast<uint8_t*>(dst_pixel), bgra);
-#endif
- } else {
-#if SK_PMCOLOR_BYTE_ORDER(R, G, B, A)
- // Premultiply color channels, already in right order.
- rgba.val[0] = premultiply(rgba.val[0], rgba.val[3]);
- rgba.val[1] = premultiply(rgba.val[1], rgba.val[3]);
- rgba.val[2] = premultiply(rgba.val[2], rgba.val[3]);
- // Write back (interleaved) results to memory.
- vst4_u8(reinterpret_cast<uint8_t*>(dst_pixel), rgba);
-#elif SK_PMCOLOR_BYTE_ORDER(B, G, R, A)
- uint8x8x4_t bgra;
- // Premultiply and re-order color channels for BGRA.
- bgra.val[0] = premultiply(rgba.val[2], rgba.val[3]);
- bgra.val[1] = premultiply(rgba.val[1], rgba.val[3]);
- bgra.val[2] = premultiply(rgba.val[0], rgba.val[3]);
- bgra.val[3] = rgba.val[3];
- // Write back (interleaved) results to memory.
- vst4_u8(reinterpret_cast<uint8_t*>(dst_pixel), bgra);
-#endif
- }
- // Advance to next elements.
- src_ptr += kPixelsPerLoad * 4;
- dst_pixel += kPixelsPerLoad;
- }
- // AND together the 8 alpha values in the alpha_mask_vector.
- uint64_t alpha_mask_u64 =
- vget_lane_u64(vreinterpret_u64_u8(alpha_mask_vector), 0);
- alpha_mask_u64 &= (alpha_mask_u64 >> 32);
- alpha_mask_u64 &= (alpha_mask_u64 >> 16);
- alpha_mask_u64 &= (alpha_mask_u64 >> 8);
- *alpha_mask &= alpha_mask_u64;
- // Handle the tail elements.
- for (; i > 0; i--, dst_pixel++, src_ptr += 4) {
- ImageFrame::SetRGBAPremultiply(dst_pixel, src_ptr[0], src_ptr[1],
- src_ptr[2], src_ptr[3]);
- *alpha_mask &= src_ptr[3];
- }
-}
-// Swizzle RGBA to SkPMColor order, and return the AND of all alpha channels.
-static inline void SetRGBARawRowNeon(png_bytep src_ptr,
- const int pixel_count,
- ImageFrame::PixelData* dst_pixel,
- unsigned* const alpha_mask) {
- assert(dst_pixel);
- assert(alpha_mask);
- constexpr int kPixelsPerLoad = 16;
- // Input registers.
- uint8x16x4_t rgba;
- // Alpha mask.
- uint8x16_t alpha_mask_vector = vdupq_n_u8(255);
- int i = pixel_count;
- for (; i >= kPixelsPerLoad; i -= kPixelsPerLoad) {
- // Reads 16 pixels at once, each color channel in a different
- // 128-bit register.
- rgba = vld4q_u8(src_ptr);
- // AND pixel alpha values into the alpha detection mask.
- alpha_mask_vector = vandq_u8(alpha_mask_vector, rgba.val[3]);
-#if SK_PMCOLOR_BYTE_ORDER(R, G, B, A)
- // Already in right order, write back (interleaved) results to memory.
- vst4q_u8(reinterpret_cast<uint8_t*>(dst_pixel), rgba);
-#elif SK_PMCOLOR_BYTE_ORDER(B, G, R, A)
- // Re-order color channels for BGRA.
- uint8x16x4_t bgra = {rgba.val[2], rgba.val[1], rgba.val[0], rgba.val[3]};
- // Write back (interleaved) results to memory.
- vst4q_u8(reinterpret_cast<uint8_t*>(dst_pixel), bgra);
-#endif
- // Advance to next elements.
- src_ptr += kPixelsPerLoad * 4;
- dst_pixel += kPixelsPerLoad;
- }
- // AND together the 16 alpha values in the alpha_mask_vector.
- uint64_t alpha_mask_u64 =
- vget_lane_u64(vreinterpret_u64_u8(vget_low_u8(alpha_mask_vector)), 0);
- alpha_mask_u64 &=
- vget_lane_u64(vreinterpret_u64_u8(vget_high_u8(alpha_mask_vector)), 0);
- alpha_mask_u64 &= (alpha_mask_u64 >> 32);
- alpha_mask_u64 &= (alpha_mask_u64 >> 16);
- alpha_mask_u64 &= (alpha_mask_u64 >> 8);
- *alpha_mask &= alpha_mask_u64;
- // Handle the tail elements.
- for (; i > 0; i--, dst_pixel++, src_ptr += 4) {
- ImageFrame::SetRGBARaw(dst_pixel, src_ptr[0], src_ptr[1], src_ptr[2],
- src_ptr[3]);
- *alpha_mask &= src_ptr[3];
- }
-}
-// Swizzle RGB to opaque SkPMColor order, and return the AND
-// of all alpha channels.
-static inline void SetRGBARawRowNoAlphaNeon(png_bytep src_ptr,
- const int pixel_count,
- ImageFrame::PixelData* dst_pixel) {
- assert(dst_pixel);
- constexpr int kPixelsPerLoad = 16;
- // Input registers.
- uint8x16x3_t rgb;
- int i = pixel_count;
- for (; i >= kPixelsPerLoad; i -= kPixelsPerLoad) {
- // Reads 16 pixels at once, each color channel in a different
- // 128-bit register.
- rgb = vld3q_u8(src_ptr);
-#if SK_PMCOLOR_BYTE_ORDER(R, G, B, A)
- // RGB already in right order, add opaque alpha channel.
- uint8x16x4_t rgba = {rgb.val[0], rgb.val[1], rgb.val[2], vdupq_n_u8(255)};
- // Write back (interleaved) results to memory.
- vst4q_u8(reinterpret_cast<uint8_t*>(dst_pixel), rgba);
-#elif SK_PMCOLOR_BYTE_ORDER(B, G, R, A)
- // Re-order color channels for BGR, add opaque alpha channel.
- uint8x16x4_t bgra = {rgb.val[2], rgb.val[1], rgb.val[0], vdupq_n_u8(255)};
- // Write back (interleaved) results to memory.
- vst4q_u8(reinterpret_cast<uint8_t*>(dst_pixel), bgra);
-#endif
- // Advance to next elements.
- src_ptr += kPixelsPerLoad * 3;
- dst_pixel += kPixelsPerLoad;
- }
- // Handle the tail elements.
- for (; i > 0; i--, dst_pixel++, src_ptr += 3) {
- ImageFrame::SetRGBARaw(dst_pixel, src_ptr[0], src_ptr[1], src_ptr[2], 255);
- }
-}
-#endif
-void PngImageDecoder::RowAvailable(unsigned char* row_buffer,
- unsigned row_index,
- int) {
- if (current_frame_ >= frame_buffer_cache_.size()) {
- return;
- }
- ImageFrame& buffer = frame_buffer_cache_[current_frame_];
- if (buffer.GetStatus() == ImageFrame::kFrameEmpty) {
- png_structp png = reader_->PngPtr();
- if (!InitFrameBuffer(current_frame_)) {
- longjmp(JMPBUF(png), 1);
- }
- DCHECK_EQ(ImageFrame::kFramePartial, buffer.GetStatus());
- if (PNG_INTERLACE_ADAM7 ==
- png_get_interlace_type(png, reader_->InfoPtr())) {
- unsigned color_channels = has_alpha_channel_ ? 4 : 3;
- base::CheckedNumeric<int> interlace_buffer_size = color_channels;
- interlace_buffer_size *= Size().GetCheckedArea();
- if (decode_to_half_float_) {
- interlace_buffer_size *= 2;
- }
- if (!interlace_buffer_size.IsValid()) {
- longjmp(JMPBUF(png), 1);
- }
- reader_->CreateInterlaceBuffer(interlace_buffer_size.ValueOrDie());
- if (!reader_->InterlaceBuffer()) {
- longjmp(JMPBUF(png), 1);
- }
- }
- current_buffer_saw_alpha_ = false;
- }
- const gfx::Rect& frame_rect = buffer.OriginalFrameRect();
- DCHECK(gfx::Rect(Size()).Contains(frame_rect));
- /* libpng comments (here to explain what follows).
- *
- * this function is called for every row in the image. If the
- * image is interlacing, and you turned on the interlace handler,
- * this function will be called for every row in every pass.
- * Some of these rows will not be changed from the previous pass.
- * When the row is not changed, the new_row variable will be NULL.
- * The rows and passes are called in order, so you don't really
- * need the row_num and pass, but I'm supplying them because it
- * may make your life easier.
- */
- // Nothing to do if the row is unchanged, or the row is outside the image
- // bounds. In the case that a frame presents more data than the indicated
- // frame size, ignore the extra rows and use the frame size as the source
- // of truth. libpng can send extra rows: ignore them too, this to prevent
- // memory writes outside of the image bounds (security).
- if (!row_buffer) {
- return;
- }
- DCHECK_GT(frame_rect.height(), 0);
- if (row_index >= static_cast<unsigned>(frame_rect.height())) {
- return;
- }
- int y = row_index + frame_rect.y();
- if (y < 0) {
- return;
- }
- DCHECK_LT(y, Size().height());
- /* libpng comments (continued).
- *
- * For the non-NULL rows of interlaced images, you must call
- * png_progressive_combine_row() passing in the row and the
- * old row. You can call this function for NULL rows (it will
- * just return) and for non-interlaced images (it just does the
- * memcpy for you) if it will make the code easier. Thus, you
- * can just do this for all cases:
- *
- * png_progressive_combine_row(png_ptr, old_row, new_row);
- *
- * where old_row is what was displayed for previous rows. Note
- * that the first pass (pass == 0 really) will completely cover
- * the old row, so the rows do not have to be initialized. After
- * the first pass (and only for interlaced images), you will have
- * to pass the current row, and the function will combine the
- * old row and the new row.
- */
- bool has_alpha = has_alpha_channel_;
- png_bytep row = row_buffer;
- if (png_bytep interlace_buffer = reader_->InterlaceBuffer()) {
- unsigned bytes_per_pixel = has_alpha ? 4 : 3;
- if (decode_to_half_float_) {
- bytes_per_pixel *= 2;
- }
- row = interlace_buffer + (row_index * bytes_per_pixel * Size().width());
- png_progressive_combine_row(reader_->PngPtr(), row, row_buffer);
- }
- // Write the decoded row pixels to the frame buffer. The repetitive
- // form of the row write loops is for speed.
- const int width = frame_rect.width();
- png_bytep src_ptr = row;
- if (!decode_to_half_float_) {
- ImageFrame::PixelData* const dst_row = buffer.GetAddr(frame_rect.x(), y);
- if (has_alpha) {
- if (ColorProfileTransform* xform = ColorTransform()) {
- ImageFrame::PixelData* xform_dst = dst_row;
- // If we're blending over the previous frame, we can't overwrite that
- // when we do the color transform. So we allocate another row of pixels
- // to hold the temporary result before blending. In all other cases,
- // we can safely transform directly to the destination buffer, then do
- // any operations in-place (premul, swizzle).
- if (frame_buffer_cache_[current_frame_].GetAlphaBlendSource() ==
- ImageFrame::kBlendAtopPreviousFrame) {
- if (!color_transform_scanline_) {
- // This buffer may be wider than necessary for this frame, but by
- // allocating the full width of the PNG, we know it will be able to
- // hold temporary data for any subsequent frame.
- color_transform_scanline_.reset(
- new ImageFrame::PixelData[Size().width()]);
- }
- xform_dst = color_transform_scanline_.get();
- }
- skcms_PixelFormat color_format = skcms_PixelFormat_RGBA_8888;
- skcms_AlphaFormat alpha_format = skcms_AlphaFormat_Unpremul;
- bool color_conversion_successful = skcms_Transform(
- src_ptr, color_format, alpha_format, xform->SrcProfile(), xform_dst,
- color_format, alpha_format, xform->DstProfile(), width);
- DCHECK(color_conversion_successful);
- src_ptr = png_bytep(xform_dst);
- }
- unsigned alpha_mask = 255;
- if (frame_buffer_cache_[current_frame_].GetAlphaBlendSource() ==
- ImageFrame::kBlendAtopBgcolor) {
- if (buffer.PremultiplyAlpha()) {
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
- SetRGBAPremultiplyRowNeon(src_ptr, width, dst_row, &alpha_mask);
-#else
- for (auto* dst_pixel = dst_row; dst_pixel < dst_row + width;
- dst_pixel++, src_ptr += 4) {
- ImageFrame::SetRGBAPremultiply(dst_pixel, src_ptr[0], src_ptr[1],
- src_ptr[2], src_ptr[3]);
- alpha_mask &= src_ptr[3];
- }
-#endif
- } else {
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
- SetRGBARawRowNeon(src_ptr, width, dst_row, &alpha_mask);
-#else
- for (auto* dst_pixel = dst_row; dst_pixel < dst_row + width;
- dst_pixel++, src_ptr += 4) {
- ImageFrame::SetRGBARaw(dst_pixel, src_ptr[0], src_ptr[1],
- src_ptr[2], src_ptr[3]);
- alpha_mask &= src_ptr[3];
- }
-#endif
- }
- } else {
- // Now, the blend method is ImageFrame::BlendAtopPreviousFrame. Since
- // the frame data of the previous frame is copied at InitFrameBuffer, we
- // can blend the pixel of this frame, stored in |src_ptr|, over the
- // previous pixel stored in |dst_pixel|.
- if (buffer.PremultiplyAlpha()) {
- for (auto* dst_pixel = dst_row; dst_pixel < dst_row + width;
- dst_pixel++, src_ptr += 4) {
- ImageFrame::BlendRGBAPremultiplied(
- dst_pixel, src_ptr[0], src_ptr[1], src_ptr[2], src_ptr[3]);
- alpha_mask &= src_ptr[3];
- }
- } else {
- for (auto* dst_pixel = dst_row; dst_pixel < dst_row + width;
- dst_pixel++, src_ptr += 4) {
- ImageFrame::BlendRGBARaw(dst_pixel, src_ptr[0], src_ptr[1],
- src_ptr[2], src_ptr[3]);
- alpha_mask &= src_ptr[3];
- }
- }
- }
- if (alpha_mask != 255) {
- current_buffer_saw_alpha_ = true;
- }
- } else {
-#if (defined(__ARM_NEON__) || defined(__ARM_NEON))
- SetRGBARawRowNoAlphaNeon(src_ptr, width, dst_row);
-#else
- for (auto* dst_pixel = dst_row; dst_pixel < dst_row + width;
- src_ptr += 3, ++dst_pixel) {
- ImageFrame::SetRGBARaw(dst_pixel, src_ptr[0], src_ptr[1], src_ptr[2],
- 255);
- }
-#endif
- // We'll apply the color space xform to opaque pixels after they have been
- // written to the ImageFrame.
- // TODO: Apply the xform to the RGB pixels, skipping second pass over
- // data.
- if (ColorProfileTransform* xform = ColorTransform()) {
- skcms_AlphaFormat alpha_format = skcms_AlphaFormat_Unpremul;
- bool color_conversion_successful =
- skcms_Transform(dst_row, XformColorFormat(), alpha_format,
- xform->SrcProfile(), dst_row, XformColorFormat(),
- alpha_format, xform->DstProfile(), width);
- DCHECK(color_conversion_successful);
- }
- }
- } else { // for if (!decode_to_half_float_)
- ImageFrame::PixelDataF16* const dst_row_f16 =
- buffer.GetAddrF16(frame_rect.x(), y);
- // TODO(zakerinasab): https://crbug.com/874057
- // Due to a lack of 16 bit APNG encoders, multi-frame 16 bit APNGs are not
- // supported. Hence, we expect the blending mode always be
- // kBlendAtopBgcolor.
- DCHECK(frame_buffer_cache_[current_frame_].GetAlphaBlendSource() ==
- ImageFrame::kBlendAtopBgcolor);
- // Color space transformation to the dst space and converting the decoded
- // color componenets from uint16 to float16.
- auto* xform = ColorTransform();
- auto* src_profile = xform ? xform->SrcProfile() : nullptr;
- auto* dst_profile = xform ? xform->DstProfile() : nullptr;
- auto src_format = has_alpha ? skcms_PixelFormat_RGBA_16161616BE
- : skcms_PixelFormat_RGB_161616BE;
- auto src_alpha_format = skcms_AlphaFormat_Unpremul;
- auto dst_alpha_format = (has_alpha && buffer.PremultiplyAlpha())
- ? skcms_AlphaFormat_PremulAsEncoded
- : skcms_AlphaFormat_Unpremul;
- bool success = skcms_Transform(
- src_ptr, src_format, src_alpha_format, src_profile, dst_row_f16,
- skcms_PixelFormat_RGBA_hhhh, dst_alpha_format, dst_profile, width);
- DCHECK(success);
- current_buffer_saw_alpha_ = has_alpha;
- }
- buffer.SetPixelsChanged(true);
-}
-void PngImageDecoder::FrameComplete() {
- if (current_frame_ >= frame_buffer_cache_.size()) {
- return;
- }
- if (reader_->InterlaceBuffer()) {
- reader_->ClearInterlaceBuffer();
- }
- ImageFrame& buffer = frame_buffer_cache_[current_frame_];
- if (buffer.GetStatus() == ImageFrame::kFrameEmpty) {
- longjmp(JMPBUF(reader_->PngPtr()), 1);
- }
- if (!current_buffer_saw_alpha_) {
- CorrectAlphaWhenFrameBufferSawNoAlpha(current_frame_);
- }
- buffer.SetStatus(ImageFrame::kFrameComplete);
-}
-bool PngImageDecoder::FrameIsReceivedAtIndex(wtf_size_t index) const {
- if (!IsDecodedSizeAvailable()) {
- return false;
- }
- DCHECK(!Failed() && reader_);
- // For non-animated images, return ImageDecoder::FrameIsReceivedAtIndex.
- // This matches the behavior of WEBPImageDecoder.
- if (reader_->ParseCompleted() && reader_->FrameCount() == 1) {
- return ImageDecoder::FrameIsReceivedAtIndex(index);
- }
- return reader_->FrameIsReceivedAtIndex(index);
-}
-base::TimeDelta PngImageDecoder::FrameDurationAtIndex(wtf_size_t index) const {
- if (index < frame_buffer_cache_.size()) {
- return frame_buffer_cache_[index].Duration();
- }
- return base::TimeDelta();
-}
-} // namespace blink
-
diff --git a/www-client/ungoogled-chromium/files/png_image_decoder.h b/www-client/ungoogled-chromium/files/png_image_decoder.h
deleted file mode 100644
index c65eda4f2f4d..000000000000
--- a/www-client/ungoogled-chromium/files/png_image_decoder.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_PNG_PNG_IMAGE_READER_H_
-#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_PNG_PNG_IMAGE_READER_H_
-#include "base/memory/raw_ptr.h"
-#include "third_party/blink/renderer/platform/image-decoders/image_frame.h"
-#include "third_party/blink/renderer/platform/platform_export.h"
-#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
-#include "third_party/blink/renderer/platform/wtf/vector.h"
-#include "ui/gfx/geometry/rect.h"
-#define PNG_SET_OPTION_SUPPORTED
-#include "png.h"
-#if !defined(PNG_LIBPNG_VER_MAJOR) || !defined(PNG_LIBPNG_VER_MINOR)
-#error version error: compile against a versioned libpng.
-#endif
-#if PNG_LIBPNG_VER_MAJOR > 1 || \
- (PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 4)
-#define JMPBUF(png_ptr) png_jmpbuf(png_ptr)
-#else
-#define JMPBUF(png_ptr) png_ptr->jmpbuf
-#endif
-namespace blink {
-class FastSharedBufferReader;
-class PngImageDecoder;
-class SegmentReader;
-class PLATFORM_EXPORT PNGImageReader final {
- USING_FAST_MALLOC(PNGImageReader);
- public:
- PNGImageReader(PngImageDecoder*, wtf_size_t initial_offset);
- PNGImageReader(const PNGImageReader&) = delete;
- PNGImageReader& operator=(const PNGImageReader&) = delete;
- ~PNGImageReader();
- struct FrameInfo {
- // The offset where the frame data of this frame starts.
- wtf_size_t start_offset;
- // The number of bytes that contain frame data, starting at start_offset.
- wtf_size_t byte_length;
- wtf_size_t duration;
- gfx::Rect frame_rect;
- ImageFrame::DisposalMethod disposal_method;
- ImageFrame::AlphaBlendSource alpha_blend;
- };
- enum class ParseQuery { kSize, kMetaData };
- bool Parse(SegmentReader&, ParseQuery);
- // Returns false on a fatal error.
- bool Decode(SegmentReader&, wtf_size_t);
- const FrameInfo& GetFrameInfo(wtf_size_t) const;
- // Number of complete frames parsed so far; includes frame 0 even if partial.
- wtf_size_t FrameCount() const { return frame_info_.size(); }
- bool ParseCompleted() const { return parse_completed_; }
- bool FrameIsReceivedAtIndex(wtf_size_t index) const {
- if (!index) {
- return FirstFrameFullyReceived();
- }
- return index < FrameCount();
- }
- void ClearDecodeState(wtf_size_t);
- png_structp PngPtr() const { return png_; }
- png_infop InfoPtr() const { return info_; }
- png_bytep InterlaceBuffer() const { return interlace_buffer_.get(); }
- void CreateInterlaceBuffer(int size) {
- interlace_buffer_ = std::make_unique<png_byte[]>(size);
- }
- void ClearInterlaceBuffer() { interlace_buffer_.reset(); }
- private:
- png_structp png_;
- png_infop info_;
- png_uint_32 width_;
- png_uint_32 height_;
- raw_ptr<PngImageDecoder> decoder_;
- // The offset in the stream where the PNG image starts.
- const wtf_size_t initial_offset_;
- // How many bytes have been read during parsing.
- wtf_size_t read_offset_;
- wtf_size_t progressive_decode_offset_;
- wtf_size_t ihdr_offset_;
- wtf_size_t idat_offset_;
- bool idat_is_part_of_animation_;
- // All IDAT chunks must precede the first fdAT chunk, and all fdAT chunks
- // should be separated from the IDAT chunks by an fcTL chunk. So this is true
- // until the first fcTL chunk after an IDAT chunk. After that, only fdAT
- // chunks are expected.
- bool expect_idats_;
- bool is_animated_;
- bool parsed_signature_;
- bool parsed_ihdr_;
- bool parse_completed_;
- uint32_t reported_frame_count_;
- uint32_t next_sequence_number_;
- // True when an fcTL has been parsed but not its corresponding fdAT or IDAT
- // chunk. Consecutive fcTLs is an error.
- bool fctl_needs_dat_chunk_;
- bool ignore_animation_;
- std::unique_ptr<png_byte[]> interlace_buffer_;
- // Value used for the byte_length of a FrameInfo struct to indicate that it is
- // the first frame and its byte_length is not yet known. 1 is a safe value
- // since the byte_length field of a frame is at least 12.
- static constexpr wtf_size_t kFirstFrameIndicator = 1;
- // Stores information about a frame until it can be pushed to |frame_info|
- // once all the frame data has been read from the stream.
- FrameInfo new_frame_;
- Vector<FrameInfo, 1> frame_info_;
- wtf_size_t ProcessData(const FastSharedBufferReader&,
- wtf_size_t offset,
- wtf_size_t length);
- // Returns false on a fatal error.
- bool ParseSize(const FastSharedBufferReader&);
- // Returns false on an error.
- bool ParseFrameInfo(const png_byte* data);
- bool ShouldDecodeWithNewPNG(wtf_size_t) const;
- void StartFrameDecoding(const FastSharedBufferReader&, wtf_size_t);
- // Returns whether the frame was completely decoded.
- bool ProgressivelyDecodeFirstFrame(const FastSharedBufferReader&);
- void DecodeFrame(const FastSharedBufferReader&, wtf_size_t);
- void ProcessFdatChunkAsIdat(png_uint_32 fdat_length);
- // Returns false on a fatal error.
- bool CheckSequenceNumber(const png_byte* position);
- bool FirstFrameFullyReceived() const {
- return !frame_info_.empty() &&
- frame_info_[0].byte_length != kFirstFrameIndicator;
- }
-};
-} // namespace blink
-#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_PNG_PNG_IMAGE_READER_H_
-
-/*
- * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_PNG_PNG_IMAGE_DECODER_H_
-#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_PNG_PNG_IMAGE_DECODER_H_
-#include <memory>
-#include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
-
-namespace blink {
-// This class decodes the PNG image format using `libpng`. This class also
-// provides support for chunks that are not directly supported by `libpng` (e.g.
-// APNG chunks like `acTL` or `fdAT`, or color-space chunks like `cICP`).
-class PLATFORM_EXPORT PngImageDecoder final : public ImageDecoder {
- public:
- PngImageDecoder(AlphaOption,
- ColorBehavior,
- wtf_size_t max_decoded_bytes,
- wtf_size_t offset = 0,
- HighBitDepthDecodingOption high_bit_depth_decoding_option =
- HighBitDepthDecodingOption::kDefaultBitDepth);
- static constexpr wtf_size_t kNoReadingOffset = 0;
- PngImageDecoder(const PngImageDecoder&) = delete;
- PngImageDecoder& operator=(const PngImageDecoder&) = delete;
- ~PngImageDecoder() override;
- // ImageDecoder:
- String FilenameExtension() const override;
- const AtomicString& MimeType() const override;
- bool SetSize(unsigned, unsigned) override;
- int RepetitionCount() const override;
- bool ImageIsHighBitDepth() override;
- bool FrameIsReceivedAtIndex(wtf_size_t) const override;
- base::TimeDelta FrameDurationAtIndex(wtf_size_t) const override;
- bool SetFailed() override;
- // Callbacks from libpng
- void HeaderAvailable();
- void RowAvailable(unsigned char* row, unsigned row_index, int);
- void FrameComplete();
- void SetColorSpace();
- void SetRepetitionCount(int);
- void SetBitDepth();
- private:
- using ParseQuery = PNGImageReader::ParseQuery;
- // ImageDecoder:
- void DecodeSize() override;
- void Decode(wtf_size_t) override;
- void Parse(ParseQuery);
- wtf_size_t DecodeFrameCount() override;
- void InitializeNewFrame(wtf_size_t) override;
- void ClearFrameBuffer(wtf_size_t) override;
- bool CanReusePreviousFrameBuffer(wtf_size_t) const override;
- std::unique_ptr<PNGImageReader> reader_;
- const unsigned offset_;
- wtf_size_t current_frame_;
- int repetition_count_;
- bool has_alpha_channel_;
- bool current_buffer_saw_alpha_;
- bool decode_to_half_float_;
- wtf_size_t bit_depth_;
- std::unique_ptr<ImageFrame::PixelData[]> color_transform_scanline_;
-};
-} // namespace blink
-#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_IMAGE_DECODERS_PNG_PNG_IMAGE_DECODER_H_
-
diff --git a/www-client/ungoogled-chromium/files/rust_static_library.gni b/www-client/ungoogled-chromium/files/rust_static_library.gni
deleted file mode 100644
index d2106be22eb5..000000000000
--- a/www-client/ungoogled-chromium/files/rust_static_library.gni
+++ /dev/null
@@ -1,74 +0,0 @@
-template("rust_static_library") {
- if (defined(invoker.deps)) {
- deps_ = invoker.deps
- deps_ = []
- }
- if (defined(invoker.public_deps)) {
- public_deps_ = invoker.public_deps
- public_deps_ = []
- }
- if (defined(invoker.visibility)) {
- visibility_ = invoker.visibility
- visibility_ = []
- }
- if (defined(invoker.sources)) {
- sources_ = invoker.sources
- sources_ = []
- }
- if (defined(invoker.crate_root)) {
- crate_root_ = invoker.crate_root
- crate_root_ = []
- }
- if (defined(invoker.crate_name)) {
- crate_name_ = invoker.crate_name
- crate_name_ = []
- }
- if (defined(invoker.allow_unsafe)) {
- allow_unsafe_ = invoker.allow_unsafe
- allow_unsafe_ = []
- }
- if (defined(invoker.cxx_bindings)) {
- cxx_bindings_ = invoker.cxx_bindings
- cxx_bindings_ = []
- }
- if (defined(invoker.no_chromium_prelude)) {
- no_chromium_prelude_ = invoker.no_chromium_prelude
- no_chromium_prelude_ = []
- }
- if (defined(invoker.no_allocator_crate)) {
- no_allocator_crate_ = invoker.no_allocator_crate
- no_allocator_crate_ = []
- }
- if (defined(invoker.bindgen_deps)) {
- bindgen_deps_ = invoker.bindgen_deps
- bindgen_deps_ = []
- }
- if (defined(invoker.rustflags)) {
- rustflags_ = invoker.rustflags
- rustflags_ = []
- }
- if (defined(invoker.testonly)) {
- testonly_ = invoker.testonly
- testonly_ = []
- }
- if (defined(invoker.features)) {
- features_ = invoker.features
- features_ = []
- }
- if (defined(invoker.edition)) {
- edition_ = invoker.edition
- edition_ = []
- }
- if (defined(invoker.no_clippy)) {
- no_clippy_ = invoker.no_clippy
- no_clippy_ = []
- }
- if (defined(invoker.is_gtest_unittests)) {
- is_gtest_unittests_ = invoker.is_gtest_unittests
- is_gtest_unittests_ = []
- }
- group(target_name) {}
-}
-set_defaults("rust_static_library") {
- configs = default_compiler_configs
-}
diff --git a/www-client/ungoogled-chromium/metadata.xml b/www-client/ungoogled-chromium/metadata.xml
index 723aa1f30ed5..412d19fa293c 100644
--- a/www-client/ungoogled-chromium/metadata.xml
+++ b/www-client/ungoogled-chromium/metadata.xml
@@ -63,5 +63,5 @@
<flag name="thinlto">Build with ThinLTO support. LTO (Link Time Optimization) achieves better runtime performance through whole-program analysis and cross-module optimization (highly recommended).</flag>
<flag name="widevine">Unsupported closed-source DRM capability (required by Netflix VOD)</flag>
</use>
- <origin>pf4public-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/ungoogled-chromium/ungoogled-chromium-147.0.7727.55_p1.ebuild b/www-client/ungoogled-chromium/ungoogled-chromium-147.0.7727.55_p1.ebuild
deleted file mode 100644
index 5cba68281ccb..000000000000
--- a/www-client/ungoogled-chromium/ungoogled-chromium-147.0.7727.55_p1.ebuild
+++ /dev/null
@@ -1,2145 +0,0 @@
-# Copyright 2009-2026 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-PYTHON_COMPAT=( python3_{10..14} )
-PYTHON_REQ_USE="xml(+)"
-
-CHROMIUM_LANGS="af am ar as az be bg bn bs ca cs cy da de el en-GB es es-419 et eu fa fi fil
- fr fr-CA gl gu he hi hr hu hy id is it ja ka kk km kn ko ky lo lt lv mk ml mn mr ms my
- nb ne nl or pa pl pt-BR pt-PT ro ru si sk sl sq sr sr-Latn sv sw ta te th tr uk ur uz
- vi zh-CN zh-HK zh-TW zu"
-
-inherit check-reqs chromium-2 desktop flag-o-matic llvm ninja-utils pax-utils
-inherit python-any-r1 qmake-utils readme.gentoo-r1 toolchain-funcs xdg-utils
-
-# Use following environment variables to customise the build
-# EXTRA_GN — pass extra options to gn
-# NINJAOPTS="-k0 -j8" useful to populate ccache even if ebuild is still failing
-# UGC_SKIP_PATCHES — space-separated list of patches to skip
-# UGC_KEEP_BINARIES — space-separated list of binaries to keep
-# UGC_SKIP_SUBSTITUTION — space-separated list of files to skip domain substitution
-
-DESCRIPTION="Modifications to Chromium for removing Google integration and enhancing privacy"
-HOMEPAGE="https://github.com/ungoogled-software/ungoogled-chromium"
-LITE_TARBALL=1
-PPC64_HASH="a85b64f07b489b8c6fdb13ecf79c16c56c560fc6"
-PATCH_V="${PV%%\.*}"
-SRC_URI="https://commondatastorage.googleapis.com/chromium-browser-official/chromium-${PV/_*}${LITE_TARBALL:+-lite}.tar.xz
- ppc64? (
- https://gitlab.raptorengineering.com/raptor-engineering-public/chromium/openpower-patches/-/archive/${PPC64_HASH}/openpower-patches-${PPC64_HASH}.tar.bz2 -> chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
- )
-"
-# https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
-# Gentoo tarball:
-# https://chromium-tarballs.distfiles.gentoo.org/chromium-${PV/_*}.tar.xz -> chromium-${PV/_*}-gentoo.tar.xz
-
-LICENSE="BSD cromite? ( GPL-3 )"
-SLOT="0"
-# KEYWORDS="~amd64 ~arm64 ~ppc64 ~x86"
-IUSE_SYSTEM_LIBS="abseil-cpp av1 brotli crc32c double-conversion ffmpeg +harfbuzz +icu jsoncpp +libusb libvpx +openh264 openjpeg re2 snappy woff2 +zstd"
-IUSE="+X bluetooth cfi +clang convert-dict cups cpu_flags_arm_neon custom-cflags debug enable-driver gtk4 hangouts headless kerberos libcxx nvidia +official optimize-thinlto optimize-webui override-data-dir pax-kernel pgo +proprietary-codecs pulseaudio qt6 screencast selinux thinlto cromite vaapi wayland widevine cpu_flags_ppc_vsx3"
-RESTRICT="
- !system-ffmpeg? ( proprietary-codecs? ( bindist ) )
- !system-openh264? ( bindist )
- cromite? ( bindist )
-"
-REQUIRED_USE="
- thinlto? ( clang )
- optimize-thinlto? ( thinlto )
- cfi? ( thinlto )
- pgo? ( clang )
- x86? ( !thinlto !widevine )
- debug? ( !official )
- screencast? ( wayland )
- !headless? ( || ( X wayland ) )
- vaapi? ( !system-av1 !system-libvpx )
-"
-
-#UGC_COMMIT_ID="f20303e7b1172c441a5b2371edee8fefb4dba2c7"
-# UGC_PR_COMMITS=(
-# c917e096342e5b90eeea91ab1f8516447c8756cf
-# 5794e9d12bf82620d5f24505798fecb45ca5a22d
-# )
-
-CROMITE_COMMIT_ID="15d48b061426a1f4a8ae8596622f0599ca626056"
-
-declare -A CHROMIUM_COMMITS=(
- ["fcfb1a42813f1e9d8babedc7bb2e0f06101a3151"]="." #148+
- ["-acb47d9a6b56c4889a2ed4216e9968cfc740086c"]="."
- # ["-37c28a19804e47a68eabf3cf882a310689fc325b"]="." #disable style check for cromite
- # ["cd5a0df905a28faa89ff2a4ab44f893f84dc4487"]="net/third_party/quiche/src"
-)
-
-UGC_PV="${PV/_p/-}"
-UGC_PF="${PN}-${UGC_PV}"
-UGC_URL="https://github.com/ungoogled-software/${PN}/archive/"
-
-if [ -z "$UGC_COMMIT_ID" ]; then
- UGC_URL="${UGC_URL}${UGC_PV}.tar.gz -> ${UGC_PF}.tar.gz"
- UGC_WD="${WORKDIR}/${UGC_PF}"
-else
- UGC_URL="${UGC_URL}${UGC_COMMIT_ID}.tar.gz -> ${PN}-${UGC_COMMIT_ID}.tar.gz"
- UGC_WD="${WORKDIR}/ungoogled-chromium-${UGC_COMMIT_ID}"
-fi
-
-SRC_URI+="${UGC_URL}
-"
-
-if [ ! -z "${UGC_PR_COMMITS[*]}" ]; then
- for i in "${UGC_PR_COMMITS[@]}"; do
- SRC_URI+="https://github.com/ungoogled-software/${PN}/commit/$i.patch?full_index=true -> ${PN}-$i.patch
- "
- done
-fi
-
-if [ ! -z "${CHROMIUM_COMMITS[*]}" ]; then
- # for i in "${CHROMIUM_COMMITS[@]}"; do
- for i in "${!CHROMIUM_COMMITS[@]}"; do
- if [[ ${CHROMIUM_COMMITS[$i]} =~ webrtc ]]; then
- #TODO: is it safe to use this mirror?
- SRC_URI+="https://github.com/webrtc-mirror/webrtc/commit/${i/-}.patch?full_index=true -> webrtc-${i/-}.patch
- "
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ angle ]]; then
- SRC_URI+="https://github.com/google/angle/commit/${i/-}.patch?full_index=true -> angle-${i/-}.patch
- "
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ quiche ]]; then
- SRC_URI+="https://github.com/google/quiche/commit/${i/-}.patch?full_index=true -> quiche-${i/-}.patch
- "
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ dawn ]]; then
- SRC_URI+="https://github.com/google/dawn/commit/${i/-}.patch?full_index=true -> dawn-${i/-}.patch
- "
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ perfetto ]]; then
- SRC_URI+="https://github.com/google/perfetto/commit/${i/-}.patch?full_index=true -> perfetto-${i/-}.patch
- "
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ ink ]]; then
- SRC_URI+="https://github.com/google/ink/commit/${i/-}.patch?full_index=true -> ink-${i/-}.patch
- "
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ vulkan-utility-libraries ]]; then
- SRC_URI+="https://github.com/KhronosGroup/Vulkan-Utility-Libraries/commit/${i/-}.patch?full_index=true -> vulkan-utility-libraries-${i/-}.patch
- "
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ ruy ]]; then
- SRC_URI+="https://github.com/google/ruy/commit/${i/-}.patch?full_index=true -> ruy-${i/-}.patch
- "
- else
- SRC_URI+="https://github.com/chromium/chromium/commit/${i/-}.patch?full_index=true -> chromium-${i/-}.patch
- "
- fi
- done
-fi
-
-SRC_URI+="cromite? ( https://github.com/uazo/cromite/archive/${CROMITE_COMMIT_ID}.tar.gz -> cromite-${CROMITE_COMMIT_ID}.tar.gz )
-"
-
-for i in ${IUSE_SYSTEM_LIBS}; do
- [[ $i =~ ^(\+)?(.*)$ ]]
- IUSE+=" ${BASH_REMATCH[1]}system-${BASH_REMATCH[2]}"
-done
-
-COMMON_X_DEPEND="
- x11-libs/libXcomposite:=
- x11-libs/libXcursor:=
- x11-libs/libXdamage:=
- x11-libs/libXfixes:=
- >=x11-libs/libXi-1.6.0:=
- x11-libs/libXrandr:=
- x11-libs/libXrender:=
- x11-libs/libXtst:=
- x11-libs/libxshmfence:=
-"
-
-COMMON_SNAPSHOT_DEPEND="
- system-icu? ( >=dev-libs/icu-78:= )
- system-abseil-cpp? ( >=dev-cpp/abseil-cpp-20260107.0 )
- system-brotli? ( >=app-arch/brotli-9999 )
- system-crc32c? ( dev-libs/crc32c )
- system-double-conversion? ( dev-libs/double-conversion )
- system-woff2? ( media-libs/woff2 )
- system-snappy? ( app-arch/snappy )
- system-jsoncpp? ( dev-libs/jsoncpp )
- system-openjpeg? ( media-libs/openjpeg:2= )
- system-re2? ( >=dev-libs/re2-0.2019.08.01:= )
- system-libvpx? ( >=media-libs/libvpx-1.13.0:=[postproc] )
- system-libusb? ( virtual/libusb:1 )
- cromite? ( dev-util/patchutils )
- >=dev-libs/libxml2-2.12.4:=[icu]
- dev-libs/nspr:=
- >=dev-libs/nss-3.26:=
- dev-libs/libxslt:=
- media-libs/fontconfig:=
- >=media-libs/freetype-2.11.0-r1:=
- system-harfbuzz? ( >=media-libs/harfbuzz-3:0=[icu(-)] )
- media-libs/libjpeg-turbo:=
- media-libs/libpng:=
- system-zstd? ( >=app-arch/zstd-1.5.5:= )
- >=media-libs/libwebp-0.4.0:=
- media-libs/mesa:=[gbm(+)]
- >=media-libs/openh264-1.6.0:=
- system-av1? (
- >=media-libs/dav1d-1.0.0:=
- >=media-libs/libaom-3.7.0:=
- )
- sys-libs/zlib:=
- >=media-libs/libavif-1.2.0:=
- !headless? (
- dev-libs/glib:2
- >=media-libs/alsa-lib-1.0.19:=
- pulseaudio? (
- || (
- media-libs/libpulse
- >=media-sound/apulse-0.1.9
- )
- )
- sys-apps/pciutils:=
- kerberos? ( virtual/krb5 )
- vaapi? ( >=media-libs/libva-2.7:=[X?,wayland?] )
- X? (
- x11-base/xorg-proto:=
- x11-libs/libX11:=
- x11-libs/libxcb:=
- x11-libs/libXext:=
- )
- x11-libs/libxkbcommon:=
- wayland? (
- dev-libs/libffi:=
- dev-libs/wayland:=
- screencast? (
- media-video/pipewire:=
- || (
- sys-apps/xdg-desktop-portal-gnome
- sys-apps/xdg-desktop-portal-gtk
- kde-plasma/xdg-desktop-portal-kde
- gui-libs/xdg-desktop-portal-lxqt
- gui-libs/xdg-desktop-portal-wlr
- )
- )
- )
- )
-"
-
-COMMON_DEPEND="
- ${COMMON_SNAPSHOT_DEPEND}
- app-arch/bzip2:=
- dev-libs/expat:=
- system-ffmpeg? (
- >=media-video/ffmpeg-6.1:=
- || (
- media-video/ffmpeg[-samba]
- >=net-fs/samba-4.5.10-r1[-debug(-)]
- )
- >=media-libs/opus-1.3.1:=
- )
- net-misc/curl[ssl]
- sys-apps/dbus:=
- media-libs/flac:=
- sys-libs/zlib:=[minizip]
- !headless? (
- >=app-accessibility/at-spi2-core-2.46.0:2
- media-libs/mesa:=[X?,wayland?]
- virtual/udev
- x11-libs/cairo:=
- x11-libs/gdk-pixbuf:2
- x11-libs/pango:=
- cups? ( >=net-print/cups-1.3.11:= )
- qt6? ( dev-qt/qtbase:6[gui,widgets] )
- X? ( ${COMMON_X_DEPEND} )
- )
-"
-
-RDEPEND="${COMMON_DEPEND}
- !headless? (
- || (
- x11-libs/gtk+:3[X?,wayland?]
- gui-libs/gtk:4[X?,wayland?]
- )
- qt6? ( dev-qt/qtbase:6[X?,wayland?] )
- )
- virtual/ttf-fonts
- selinux? ( sec-policy/selinux-chromium )
- !override-data-dir? (
- !www-client/chromium
- !www-client/chromium-bin
- !www-client/cromite[-override-data-dir]
- )
-"
-
-DEPEND="${COMMON_DEPEND}
- !headless? (
- gtk4? ( gui-libs/gtk:4[X?,wayland?] )
- !gtk4? ( x11-libs/gtk+:3[X?,wayland?] )
- )
-"
-
-BDEPEND="
- ${COMMON_SNAPSHOT_DEPEND}
- ${PYTHON_DEPS}
- $(python_gen_any_dep '
- dev-python/setuptools[${PYTHON_USEDEP}]
- ')
- >=app-arch/gzip-1.7
- !headless? (
- qt6? ( dev-qt/qtbase:6 )
- )
- >=dev-build/gn-0.2289
- app-alternatives/ninja
- dev-lang/perl
- >=dev-util/gperf-3.2
- dev-vcs/git
- >=net-libs/nodejs-24[inspector]
- sys-apps/hwdata
- >=sys-devel/bison-2.4.3
- sys-devel/flex
- virtual/pkgconfig
- clang? (
- pgo? ( >=llvm-core/clang-22.0.0_pre20260106 >=llvm-core/lld-22.0.0_pre20260106 )
- !pgo? ( llvm-core/clang llvm-core/lld )
- )
- cfi? ( llvm-runtimes/clang-runtime[sanitize] )
-"
-
-if ! has chromium_pkg_die ${EBUILD_DEATH_HOOKS}; then
- EBUILD_DEATH_HOOKS+=" chromium_pkg_die";
-fi
-
-DISABLE_AUTOFORMATTING="yes"
-DOC_CONTENTS="
-Some web pages may require additional fonts to display properly.
-Try installing some of the following packages if some characters
-are not displayed properly:
-- media-fonts/arphicfonts
-- media-fonts/droid
-- media-fonts/ipamonafont
-- media-fonts/noto
-- media-fonts/ja-ipafonts
-- media-fonts/takao-fonts
-- media-fonts/wqy-microhei
-- media-fonts/wqy-zenhei
-
-To fix broken icons on the Downloads page, you should install an icon
-theme that covers the appropriate MIME types, and configure this as your
-GTK+ icon theme.
-
-For native file dialogs in KDE, install kde-apps/kdialog.
-
-To make password storage work with your desktop environment you may
-have install one of the supported credentials management applications:
-- app-crypt/libsecret (GNOME)
-- kde-frameworks/kwallet (KDE)
-If you have one of above packages installed, but don't want to use
-them in Chromium, then add --password-store=basic to CHROMIUM_FLAGS
-in /etc/chromium/default.
-"
-
-S="${WORKDIR}/chromium-${PV/_*}"
-
-python_check_deps() {
- python_has_version "dev-python/setuptools[${PYTHON_USEDEP}]"
-}
-
-pre_build_checks() {
- # Check build requirements: bugs #471810, #541816, #914220
- # We're going to start doing maths here on the size of an unpacked source tarball,
- # this should make updates easier as chromium continues to balloon in size.
- local BASE_DISK=18
- local EXTRA_DISK=1
- local CHECKREQS_MEMORY="4G"
- tc-is-cross-compiler && EXTRA_DISK=2
- if use thinlto || use pgo; then
- CHECKREQS_MEMORY="9G"
- tc-is-cross-compiler && EXTRA_DISK=4
- use pgo && EXTRA_DISK=8
- fi
- if is-flagq '-g?(gdb)?([1-9])'; then
- if use custom-cflags; then
- EXTRA_DISK=13
- fi
- CHECKREQS_MEMORY="16G"
- fi
- CHECKREQS_DISK_BUILD="$((BASE_DISK + EXTRA_DISK))G"
- check-reqs_${EBUILD_PHASE_FUNC}
-}
-
-pkg_pretend() {
- if use libcxx; then
- ewarn
- ewarn "Building with libcxx, please be aware that system-*"
- ewarn "and some other c++ dependencies need to be compiled"
- ewarn "with the same c++ library as ungoogled-chromium itself"
- ewarn "dev-libs/jsoncpp is most problematic, see #58 #49 #119 for details"
- ewarn "Simplest solution would be to disable corresponding system-* flags"
- ewarn
- fi
- if use cfi; then
- ewarn
- ewarn "Building with cfi is only possible if building with -stdlib=libc++"
- ewarn "Make sure all dependencies are also built this way, see #40"
- ewarn
- fi
- if use cromite; then
- ewarn
- ewarn "Cromite patches are very experimental and unstable"
- ewarn "Please consider testing them and giving feedback upstream:"
- ewarn "https://github.com/uazo/cromite/issues"
- ewarn "Not all patches are applied, let me know if others should be considered too"
- ewarn
- fi
- pre_build_checks
-
- if use headless; then
- local headless_unused_flags=("cups" "kerberos" "pulseaudio" "qt6" "vaapi" "wayland")
- for myiuse in ${headless_unused_flags[@]}; do
- use ${myiuse} && ewarn "Ignoring USE=${myiuse}, USE=headless is set."
- done
- fi
-}
-
-pkg_setup() {
- pre_build_checks
-
- chromium_suid_sandbox_check_kernel_config
-}
-
-src_unpack() {
- # Here be dragons!
- local XCLD="--exclude=chromium-${PV/_*}/third_party/instrumented_libs \
- --exclude=chromium-${PV/_*}/third_party/llvm \
- --exclude=chromium-${PV/_*}/third_party/llvm-build \
- --exclude=chromium-${PV/_*}/third_party/node/linux \
- --exclude=chromium-${PV/_*}/third_party/rust-src \
- --exclude=chromium-${PV/_*}/third_party/rust-toolchain \
- --exclude=chromium-${PV/_*}/build/linux/debian_bullseye_i386-sysroot \
- --exclude=chromium-${PV/_*}/build/linux/debian_bullseye_amd64-sysroot \
- --exclude=chromium-${PV/_*}/third_party/angle/third_party/VK-GL-CTS \
- "
-
- if ! use libcxx ; then
- XCLD+=" --exclude=chromium-${PV/_*}/third_party/libc++"
- fi
-
- if ! use pgo ; then
- XCLD+=" --exclude=chromium-${PV/_*}/chrome/build/pgo_profiles"
- fi
-
- einfo "Unpacking chromium-${PV/_*}.tar.xz to ${WORKDIR}"
- # Gentoo tarball:
- # tar ${XCLD} -xf "${DISTDIR}/chromium-${PV/_*}-gentoo.tar.xz" -C "${WORKDIR}" || die
- tar ${XCLD} -xf "${DISTDIR}/chromium-${PV/_*}${LITE_TARBALL:+-lite}.tar.xz" -C "${WORKDIR}" || die
-
- unpack ${UGC_URL#*->}
- # unpack chromium-patches-${PATCH_V}.tar.bz2
- # Warned you!
-
- if use cromite; then
- unpack cromite-${CROMITE_COMMIT_ID}.tar.gz
- fi
-
- if use ppc64; then
- unpack chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
- fi
-}
-
-remove_compiler_builtins() {
- # We can't use the bundled compiler builtins with the system toolchain
- # We used to `grep` then `sed`, but it was indirect. Combining the two into a single
- # `awk` command is more efficient and lets us document the logic more clearly.
-
- local pattern=' configs += [ "//build/config/clang:compiler_builtins" ]'
- local target='build/config/compiler/BUILD.gn'
-
- # Create a secure temporary file to store the output.
- local tmpfile
- tmpfile=$(mktemp) || die "Failed to create temporary file."
-
- if awk -v pat="${pattern}" '
- BEGIN {
- match_found = 0
- }
-
- # If the delete countdown is active, decrement it and skip to the next line.
- d > 0 { d--; next }
-
- # If the current line matches the pattern...
- $0 == pat {
- match_found = 1 # ...set our flag to true.
- d = 2 # Set delete counter for this line and the next two.
- prev = "" # Clear the buffered previous line so it is not printed.
- next
- }
-
- # For any other line, print the buffered previous line.
- NR > 1 { print prev }
-
- # Buffer the current line to be printed on the next cycle.
- { prev = $0 }
-
- END {
- # Print the last line if it was not part of a deleted block.
- if (d == 0) { print prev }
-
- # If the pattern was never found, exit with a failure code.
- if (match_found == 0) {
- exit 1
- }
- }
- ' "${target}" > "${tmpfile}"; then
- # AWK SUCCEEDED (exit code 0): The pattern was found and edited.
- # This is to avoid gawk's `-i inplace` option which users complain about.
- mv "${tmpfile}" "${target}"
- else
- # AWK FAILED (exit code 1): The pattern was not found.
- rm -f "${tmpfile}"
- die "Awk patch failed: Pattern not found in ${target}."
- fi
-}
-
-src_prepare() {
- # Calling this here supports resumption via FEATURES=keepwork
- python_setup
-
- # cp -f ${WORKDIR}/chromium-patches-${PATCH_V}/*-compiler.patch "${T}/compiler.patch"
- cp -f ${FILESDIR}/chromium-147-compiler.patch "${T}/compiler.patch"
- if ! use custom-cflags; then #See #25 #92
- sed -i '/default_stack_frames/Q' "${T}/compiler.patch" || die
- fi
-
- local PATCHES=(
- "${T}/compiler.patch"
- "${FILESDIR}/chromium-cross-compile.patch"
- "${FILESDIR}/chromium-109-system-openh264.patch"
- "${FILESDIR}/chromium-109-system-zlib.patch"
- "${FILESDIR}/chromium-145-oauth2-client-switches.patch"
- "${FILESDIR}/chromium-138-nodejs-version-check.patch"
- "${FILESDIR}/chromium-144-revert-libpng-testiness.patch"
- "${FILESDIR}/chromium-125-cloud_authenticator.patch"
- "${FILESDIR}/chromium-144-qrcode.patch"
- "${FILESDIR}/perfetto-system-zlib.patch"
- "${FILESDIR}/chromium-127-cargo_crate.patch"
- "${FILESDIR}/chromium-128-cfi-split-lto-unit.patch"
- "${FILESDIR}/restore-x86-r3.patch"
- "${FILESDIR}/chromium-133-webrtc-fixes.patch"
- "${FILESDIR}/chromium-141-fix-for-kde.patch"
- "${FILESDIR}/chromium-134-stdatomic.patch"
- "${FILESDIR}/font-gc-asan.patch"
- "${FILESDIR}/chromium-145-crabby.patch"
- "${FILESDIR}/chromium-145-fontations.patch"
- "${FILESDIR}/chromium-146-glibc-2.43.patch"
- "${FILESDIR}/chromium-147-gcc.patch"
- "${FILESDIR}/chromium-147-no-rust.patch"
- )
-
- # https://issues.chromium.org/issues/442698344
- # Unreleased fontconfig changed magic numbers and google have rolled to this version
- if has_version "<=media-libs/fontconfig-2.17.1"; then
- PATCHES+=( "${FILESDIR}/chromium-142-work-with-old-fontconfig.patch" )
- fi
-
- #shopt -s globstar nullglob
- ## 130: moved the PPC64 patches into the chromium-patches repo
- #local patch
- #for patch in "${WORKDIR}/chromium-patches-${PATCH_V}"/**/*.patch; do
- # if [[ ${patch} == *"ppc64le"* ]]; then
- # use ppc64 && PATCHES+=( "${patch}" )
- # else
- # PATCHES+=( "${patch}" )
- # fi
- #done
- #shopt -u globstar nullglob
-
- remove_compiler_builtins
-
- # Strictly speaking this doesn't need to be gated (no bundled toolchain for ppc64); it keeps the logic together
- if use ppc64; then
- local patchset_dir="${WORKDIR}/openpower-patches-${PPC64_HASH}/patches"
- # patch causes build errors on 4K page systems (https://bugs.gentoo.org/show_bug.cgi?id=940304)
- local page_size_patch="ppc64le/third_party/use-sysconf-page-size-on-ppc64.patch"
- local isa_3_patch="ppc64le/core/baseline-isa-3-0.patch"
- # Apply the OpenPOWER patches (check for page size and isa 3.0)
- openpower_patches=( $(grep -E "^ppc64le|^upstream" "${patchset_dir}/series" | grep -v "${page_size_patch}" |
- grep -v "${isa_3_patch}" || die) )
- for patch in "${openpower_patches[@]}"; do
- PATCHES+=( "${patchset_dir}/${patch}" )
- done
- if [[ $(getconf PAGESIZE) == 65536 ]]; then
- PATCHES+=( "${patchset_dir}/${page_size_patch}" )
- fi
- # We use vsx3 as a proxy for 'want isa3.0' (POWER9)
- if use cpu_flags_ppc_vsx3 ; then
- PATCHES+=( "${patchset_dir}/${isa_3_patch}" )
- fi
- fi
-
- ewarn
- ewarn "Fontations Rust font stack is disabled"
- ewarn "Using media-libs/libavif instead of CrabbyAvif"
- ewarn
-
- if [ ! -z "${CHROMIUM_COMMITS[*]}" ]; then
- # for i in "${CHROMIUM_COMMITS[@]}"; do
- for i in "${!CHROMIUM_COMMITS[@]}"; do
- if [[ ${CHROMIUM_COMMITS[$i]} =~ webrtc ]]; then
- patch_prefix="webrtc"
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ angle ]]; then
- patch_prefix="angle"
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ quiche ]]; then
- patch_prefix="quiche"
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ dawn ]]; then
- patch_prefix="dawn"
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ perfetto ]]; then
- patch_prefix="perfetto"
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ ink ]]; then
- patch_prefix="ink"
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ vulkan-utility-libraries ]]; then
- patch_prefix="vulkan-utility-libraries"
- elif [[ ${CHROMIUM_COMMITS[$i]} =~ ruy ]]; then
- patch_prefix="ruy"
- else
- patch_prefix="chromium"
- fi
- pushd "${CHROMIUM_COMMITS[$i]}" > /dev/null || die
- if [[ $i = -* ]]; then
- einfo "Reverting ${patch_prefix}-${i/-}.patch"
- git_wrapper apply -R --exclude="*unittest.cc" --exclude="DEPS" \
- -p1 < "${DISTDIR}/${patch_prefix}-${i/-}.patch"
- else
- einfo "Applying ${patch_prefix}-${i/-}.patch"
- git_wrapper apply --exclude="*unittest.cc" --exclude="DEPS" \
- -p1 < "${DISTDIR}/${patch_prefix}-${i/-}.patch"
- fi
- popd > /dev/null || die
- done
- fi
-
- if ! use bluetooth ; then
- PATCHES+=(
- "${FILESDIR}/disable-bluez-r7.patch"
- )
- fi
-
- if use convert-dict ; then
- PATCHES+=(
- "${FILESDIR}/chromium-ucf-dict-utility-r3.patch"
- )
- fi
-
- if ! use libcxx ; then
- PATCHES+=(
- "${FILESDIR}/fix-wayland-oncecallback-copy.patch"
- )
- fi
-
- if use system-ffmpeg; then
- PATCHES+=(
- "${FILESDIR}/chromium-141-opus-mp3.patch"
- "${FILESDIR}/chromium-135-hevc.patch"
- )
- sed -i "\!AVFMT_FLAG_NOH264PARSE!d" media/filters/ffmpeg_glue.cc || die
- ewarn "You need to expose \"av_stream_get_first_dts\" in ffmpeg via user patch"
- fi
-
- if use system-av1; then
- PATCHES+=(
- "${FILESDIR}/chromium-system-av1.patch"
- )
- fi
-
- if use system-libvpx; then
- PATCHES+=(
- "${FILESDIR}/chromium-system-libvpx.patch"
- )
- fi
-
- if use system-openjpeg ; then
- PATCHES+=(
- "${FILESDIR}/chromium-system-openjpeg-r4.patch"
- )
- fi
-
- if use x86 ; then
- #* Fixes a segfault in transport_security_state_generator
- PATCHES+=(
- "${FILESDIR}/fix-segfault-x86.patch"
- )
- fi
-
- # Testing all patches when NODIE is defined
- if [ ! -z "${NODIE}" ]; then
- for i in "${PATCHES[@]}"; do
- eapply_wrapper "$i"
- done
- nonfatal eapply_user
- else
- default
- fi
-
- if use cromite ; then
- BR_PA_PATH="${WORKDIR}/cromite-${CROMITE_COMMIT_ID}/build/patches"
-
- sed -i '/b\/components\/components_strings\.grd/,+10d' "${BR_PA_PATH}/Add-cromite-flags-support.patch" || die
- sed -i '/b\/chrome\/android\/java\/res\/xml\/privacy_preferences\.xml/,+13d' "${BR_PA_PATH}/Add-cromite-flags-support.patch" || die
- sed -i '/b\/android_webview\/support_library\/java\/src\/org\/chromium\/support_lib_glue/,+11d' "${BR_PA_PATH}/Client-hints-overrides.patch" || die
- sed -i '/webapps_strings.grdp" \/>/{s++webapps_strings.grdp" /><part file="cromite_components_strings_grd/placeholder.txt"/>+;h};${x;/./{x;q0};x;q1}' \
- components/components_strings.grd || die
-
- sed -i 's/absl::/std::/' "${BR_PA_PATH}/Add-a-proxy-configuration-page.patch" || die
-
- BROMITE_PATCHES=(
- "${BR_PA_PATH}/bromite-build-utils.patch"
- "${BR_PA_PATH}/Battery-API-return-nothing.patch"
- "${BR_PA_PATH}/Multiple-fingerprinting-mitigations.patch"
- "${BR_PA_PATH}/Add-flag-to-configure-maximum-connections-per-host.patch"
- "${BR_PA_PATH}/Add-a-proxy-configuration-page.patch"
- "${BR_PA_PATH}/Enable-StrictOriginIsolation-and-SitePerProcess.patch"
- "${BR_PA_PATH}/Disable-requests-for-single-word-Omnibar-searches.patch"
- "${BR_PA_PATH}/Reduce-HTTP-headers-in-DoH-requests-to-bare-minimum.patch"
- "${BR_PA_PATH}/Client-hints-overrides.patch"
- "${BR_PA_PATH}/Disable-idle-detection.patch"
- "${BR_PA_PATH}/Disable-TLS-resumption.patch"
- "${BR_PA_PATH}/Remove-navigator.connection-info.patch"
-
- "${BR_PA_PATH}/AudioBuffer-AnalyserNode-fp-mitigations.patch"
- "${BR_PA_PATH}/Fonts-fingerprinting-mitigation.patch"
- "${BR_PA_PATH}/Content-settings-infrastructure.patch"
- "${BR_PA_PATH}/Add-autoplay-site-setting.patch"
- "${BR_PA_PATH}/Site-setting-for-images.patch"
- "${BR_PA_PATH}/JIT-site-settings.patch"
- "${BR_PA_PATH}/Add-webGL-site-setting.patch"
- "${BR_PA_PATH}/Add-webRTC-site-settings.patch"
- "${BR_PA_PATH}/Show-site-settings-for-cookies-javascript-and-ads.patch"
- "${BR_PA_PATH}/Viewport-Protection-flag.patch"
- "${BR_PA_PATH}/Revert-remove-allowscript-content-setting-secondary-url.patch"
- "${BR_PA_PATH}/Timezone-customization.patch"
- "${BR_PA_PATH}/Disable-speechSynthesis-getVoices-API.patch"
- "${BR_PA_PATH}/Remove-support-for-device-memory-and-cpu-recovery.patch"
- "${BR_PA_PATH}/Disable-Feeback-Collector.patch"
- "${BR_PA_PATH}/Disable-remote-altsvc-for-h3-connections.patch"
- "${BR_PA_PATH}/Add-cromite-flags-support.patch"
- "${BR_PA_PATH}/Enables-deactivation-of-the-js-debugger-statement.patch"
- )
- for i in "${BROMITE_PATCHES[@]}"; do
- if [[ "$i" =~ "Add-autoplay-site-setting.patch" ]] ||
- [[ "$i" =~ "JIT-site-settings.patch" ]] ||
- [[ "$i" =~ "Site-setting-for-images.patch" ]]; then
- einfo "Git binary patch: ${i##*/}"
- git_wrapper apply -p1 < "$i"
- else
- filter_wrapper "$i" --exclude="chrome/android/*"
- fi
- done
-
- #! conflicting patches
- sed -i '/browser_features.cc/,+17d' \
- "${UGC_WD}/patches/extra/ungoogled-chromium/add-flag-to-clear-data-on-exit.patch" || die
- sed -i 's$} // namespace features$BASE_FEATURE(kClearDataOnExit, "ClearDataOnExit", base::FEATURE_DISABLED_BY_DEFAULT);}$' \
- chrome/browser/browser_features.cc || die
- sed -i 's$} // namespace features$BASE_DECLARE_FEATURE(kClearDataOnExit);}$' \
- chrome/browser/browser_features.h || die
- sed -i 's$kChromeUIAboutHost,$kChromeUIAboutHost,"ungoogled-first-run",$' \
- chrome/common/webui_url_constants.cc || die
- sed -i '/chrome\/common\/webui_url_constants.cc/Q' \
- "${UGC_WD}/patches/extra/ungoogled-chromium/first-run-page.patch" || die
-
- #! normalise paths in py
- sed -i 's$os.path.dirname(include_file)$os.path.abspath(os.path.dirname(include_file))$' \
- build/bromite/gyp/cpp_bromite_include.py || die
- fi
-
- # if [[ ${LLVM_SLOT} == "19" ]]; then
- # # Upstream now hard depend on a feature that was added in LLVM 20.1, but we don't want to stabilise that yet.
- # # Do the temp file shuffle in case someone is using something other than `gawk`
- # {
- # awk '/config\("clang_warning_suppression"\) \{/ { print $0 " }"; sub(/clang/, "xclang"); print; next }
- # { print }' build/config/compiler/BUILD.gn > "${T}/build.gn" && \
- # mv "${T}/build.gn" build/config/compiler/BUILD.gn
- # } || die "Unable to disable warning suppression"
- # fi
-
- # Not included in -lite tarballs, but we should check for it anyway.
- if [[ -f third_party/node/linux/node-linux-x64/bin/node ]]; then
- rm third_party/node/linux/node-linux-x64/bin/node || die
- else
- mkdir -p third_party/node/linux/node-linux-x64/bin || die
- fi
- ln -s "${EPREFIX}"/usr/bin/node third_party/node/linux/node-linux-x64/bin/node || die
-
- # adjust python interpreter version
- sed -i -e "s|\(^script_executable = \).*|\1\"${EPYTHON}\"|g" .gn || die
-
- cp "${FILESDIR}/libusb.gn" build/linux/unbundle || die
- sed -i '/^REPLACEMENTS.*$/{s++REPLACEMENTS = {"libusb":"third_party/libusb/BUILD.gn",+;h};${x;/./{x;q0};x;q1}' \
- build/linux/unbundle/replace_gn_files.py || die
- sed -i '/^.*deps.*third_party\/jsoncpp.*$/{s++public_deps \+= [ "//third_party/jsoncpp" ]+;h};${x;/./{x;q0};x;q1}' \
- third_party/webrtc/rtc_base/BUILD.gn || die
-
- cp -f "${FILESDIR}/rust_static_library.gni" build/rust || die
- cp -f "${FILESDIR}/json_parser_r2.cc" base/json/json_parser.cc || die
- cp -f "${FILESDIR}/json_parser.h" base/json || die
- cp -f "${FILESDIR}/avif_image_decoder.cc" third_party/blink/renderer/platform/image-decoders/avif || die
- cp -f "${FILESDIR}/avif_image_decoder.h" third_party/blink/renderer/platform/image-decoders/avif || die
- cp -f "${FILESDIR}/png_image_decoder.cc" third_party/blink/renderer/platform/image-decoders/png || die
- cp -f "${FILESDIR}/png_image_decoder.h" third_party/blink/renderer/platform/image-decoders/png || die
- cp -f "${FILESDIR}/font_format_check.cc" third_party/blink/renderer/platform/fonts/opentype || die
- cp -f "${FILESDIR}/font_format_check.h" third_party/blink/renderer/platform/fonts/opentype || die
-
- if use override-data-dir; then
- sed -i '/"chromium";/{s++"ungoogled-chromium";+;h};${x;/./{x;q0};x;q1}' \
- chrome/common/chrome_paths_linux.cc || die
- fi
-
- if use system-abseil-cpp; then
- eapply_wrapper "${FILESDIR}/chromium-147-system-abseil.patch"
-
- #! SFINAE mangling incompatibility between clang and gcc:
- #! https://github.com/llvm/llvm-project/issues/85656
- #! gcc: _ZN4absl12lts_202601074CordC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELi0EEEOT_
- #! clang: _ZN4absl12lts_202601074CordC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEETnNSt9enable_ifIXsr3std7is_sameIT_S8_EE5valueEiE4typeELi0EEEOSA_
- #! So, either this:
- eapply_wrapper "${FILESDIR}/chromium-141-system-abseil-cord.patch"
- #! or build with -fclang-abi-compat=17
-
- # cp -f /usr/include/absl/base/options.h third_party/abseil-cpp/absl/base/options.h
- # sed -i '/^#define ABSL_OPTION_USE_STD_ORDERING.*$/{s++#define ABSL_OPTION_USE_STD_ORDERING 1+;h};${x;/./{x;q0};x;q1}' \
- # third_party/abseil-cpp/absl/base/options.h || die
- fi
-
- #* Applying UGC PRs here
- if [ ! -z "${UGC_PR_COMMITS[*]}" ]; then
- pushd "${UGC_WD}" >/dev/null
- for i in "${UGC_PR_COMMITS[@]}"; do
- eapply_wrapper "${DISTDIR}/${PN}-$i.patch"
- done
- popd >/dev/null
- fi
-
- # From here we adapt ungoogled-chromium's patches to our needs
- local ugc_pruning_list="${UGC_WD}/pruning.list"
- local ugc_patch_series="${UGC_WD}/patches/series"
- local ugc_substitution_list="${UGC_WD}/domain_substitution.list"
-
- local ugc_unneeded=(
- # GN bootstrap
- extra/debian/gn/parallel
- )
-
- if use cromite ; then
- einfo "Using fingerprinting patches from Cromite instead"
- ugc_unneeded+=(
- extra/bromite/fingerprinting-flags-client-rects-and-measuretext
- extra/bromite/flag-max-connections-per-host
- extra/bromite/flag-fingerprinting-canvas-image-data-noise
- extra/ungoogled-chromium/add-components-ungoogled
- extra/ungoogled-chromium/remove-pac-size-limit
- )
- fi
-
- #* Temporary fix
- sed -i "\!ios/!d" "${ugc_pruning_list}" || die
- sed -i "\!third_party/icu/!d" "${ugc_pruning_list}" || die
- sed -i "\!third_party/libjpeg_turbo/!d" "${ugc_pruning_list}" || die
- sed -i "\!third_party/snappy/!d" "${ugc_pruning_list}" || die
- sed -i "\!third_party/closure_compiler/!d" "${ugc_pruning_list}" || die
-
- #* Didn't unpack them at the first place
- sed -i "\!build/linux/debian_bullseye_i386-sysroot!d" "${ugc_pruning_list}" || die
- sed -i "\!build/linux/debian_bullseye_amd64-sysroot!d" "${ugc_pruning_list}" || die
- sed -i "\!third_party/llvm-build!d" "${ugc_pruning_list}" || die
- sed -i "\!third_party/node/linux!d" "${ugc_pruning_list}" || die
- sed -i "\!third_party/rust-src!d" "${ugc_pruning_list}" || die
- sed -i "\!third_party/rust-toolchain!d" "${ugc_pruning_list}" || die
- if ! use libcxx ; then
- sed -i "\!third_party/libc!d" "${ugc_pruning_list}" || die
- fi
- sed -i "s|debug('files|error('files|" \
- "${UGC_WD}/utils/prune_binaries.py" || die
- sed -i "\!third_party/node/linux!d" \
- "${UGC_WD}/utils/prune_binaries.py" || die
-
- local ugc_p ugc_dir
- for p in "${ugc_unneeded[@]}"; do
- einfo "Removing ${p}.patch"
- sed -i "\!${p}.patch!d" "${ugc_patch_series}" || die
- done
-
- if [ ! -z "${UGC_SKIP_PATCHES}" ]; then
- for p in ${UGC_SKIP_PATCHES}; do
- ewarn "Removing ${p}"
- sed -i "\!${p}!d" "${ugc_patch_series}" || die
- done
- fi
-
- if [ ! -z "${UGC_KEEP_BINARIES}" ]; then
- for p in ${UGC_KEEP_BINARIES}; do
- ewarn "Keeping binary ${p}"
- sed -i "\!${p}!d" "${ugc_pruning_list}" || die
- done
- fi
-
- if [ ! -z "${UGC_SKIP_SUBSTITUTION}" ]; then
- for p in ${UGC_SKIP_SUBSTITUTION}; do
- ewarn "No substitutions in ${p}"
- sed -i "\!${p}!d" "${ugc_substitution_list}" || die
- done
- fi
-
- ebegin "Pruning binaries"
- "${UGC_WD}/utils/prune_binaries.py" -q . "${UGC_WD}/pruning.list"
- eend $? || die
-
- ebegin "Applying ungoogled-chromium patches"
- "${UGC_WD}/utils/patches.py" -q apply . "${UGC_WD}/patches"
- eend $? || die
-
- ebegin "Applying domain substitution"
- "${UGC_WD}/utils/domain_substitution.py" -q apply -r "${UGC_WD}/domain_regex.list" -f "${UGC_WD}/domain_substitution.list" .
- eend $? || die
-
- # Use the system copy of hwdata's usb.ids; upstream is woefully out of date (2015!)
- sed 's|//third_party/usb_ids/usb.ids|/usr/share/hwdata/usb.ids|g' \
- -i services/device/public/cpp/usb/BUILD.gn || die "Failed to set system usb.ids path"
-
- # remove_bundled_libraries.py walks the source tree and looks for paths containing the substring 'third_party'
- # whitelist matches use the right-most matching path component, so we need to whitelist from that point down.
- local keeplibs=(
- base/third_party/cityhash
- )
- use system-double-conversion || keeplibs+=(
- base/third_party/double_conversion
- )
- keeplibs+=(
- base/third_party/icu
- base/third_party/nspr
- base/third_party/superfasthash
- base/third_party/symbolize
- base/third_party/xdg_user_dirs
- buildtools/third_party/libc++
- buildtools/third_party/libc++abi
- )
- use cromite && keeplibs+=(
- cromite_flags/third_party
- )
- keeplibs+=(
- net/third_party/mozilla_security_manager
- net/third_party/quic
- net/third_party/uri_template
- )
- use system-abseil-cpp || keeplibs+=(
- third_party/abseil-cpp
- )
- keeplibs+=(
- third_party/angle
- third_party/angle/src/common/third_party/xxhash
- third_party/angle/src/third_party/ceval
- )
- use nvidia || keeplibs+=(
- third_party/angle/src/third_party/libXNVCtrl
- )
- keeplibs+=(
- third_party/angle/src/third_party/volk
- third_party/anonymous_tokens
- third_party/apple_apsl
- third_party/axe-core
- third_party/bidimapper
- third_party/blink
- third_party/boringssl
- third_party/boringssl/src/third_party/fiat
- third_party/breakpad
- third_party/breakpad/breakpad/src/third_party/curl
- )
- use system-brotli || keeplibs+=(
- third_party/brotli
- )
- keeplibs+=(
- third_party/catapult
- third_party/catapult/common/py_vulcanize/third_party/rcssmin
- third_party/catapult/common/py_vulcanize/third_party/rjsmin
- third_party/catapult/third_party/beautifulsoup4-4.9.3
- third_party/catapult/third_party/html5lib-1.1
- third_party/catapult/third_party/polymer
- third_party/catapult/third_party/six
- third_party/catapult/third_party/typ
- third_party/catapult/tracing/third_party/d3
- third_party/catapult/tracing/third_party/gl-matrix
- third_party/catapult/tracing/third_party/jpeg-js
- third_party/catapult/tracing/third_party/jszip
- third_party/catapult/tracing/third_party/mannwhitneyu
- third_party/catapult/tracing/third_party/oboe
- third_party/catapult/tracing/third_party/pako
- third_party/ced
- third_party/cld_3
- third_party/closure_compiler
- )
- use libcxx && keeplibs+=(
- third_party/compiler-rt
- )
- keeplibs+=(
- third_party/content_analysis_sdk
- third_party/cpuinfo
- third_party/crabbyavif
- third_party/crashpad
- third_party/crashpad/crashpad/third_party/lss
- third_party/crashpad/crashpad/third_party/zlib
- )
- use system-crc32c || keeplibs+=(
- third_party/crc32c
- )
- keeplibs+=(
- third_party/cros_system_api
- third_party/d3
- third_party/dawn
- third_party/dawn/third_party/gn/webgpu-cts
- third_party/dawn/third_party/khronos
- third_party/dawn/third_party/renderdoc
- third_party/dawn/third_party/webgpu-headers
- third_party/depot_tools
- third_party/devscripts
- third_party/devtools-frontend
- third_party/devtools-frontend/src/front_end/third_party/acorn
- third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
- third_party/devtools-frontend/src/front_end/third_party/axe-core
- third_party/devtools-frontend/src/front_end/third_party/chromium
- third_party/devtools-frontend/src/front_end/third_party/codemirror
- third_party/devtools-frontend/src/front_end/third_party/csp_evaluator
- third_party/devtools-frontend/src/front_end/third_party/diff
- third_party/devtools-frontend/src/front_end/third_party/i18n
- third_party/devtools-frontend/src/front_end/third_party/intl-messageformat
- third_party/devtools-frontend/src/front_end/third_party/json5
- third_party/devtools-frontend/src/front_end/third_party/legacy-javascript
- third_party/devtools-frontend/src/front_end/third_party/lighthouse
- third_party/devtools-frontend/src/front_end/third_party/lit
- third_party/devtools-frontend/src/front_end/third_party/marked
- third_party/devtools-frontend/src/front_end/third_party/puppeteer
- third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/mitt
- third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/parsel-js
- third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/rxjs
- third_party/devtools-frontend/src/front_end/third_party/source-map-scopes-codec
- third_party/devtools-frontend/src/front_end/third_party/third-party-web
- third_party/devtools-frontend/src/front_end/third_party/vscode.web-custom-data
- third_party/devtools-frontend/src/front_end/third_party/wasmparser
- third_party/devtools-frontend/src/front_end/third_party/web-vitals
- third_party/devtools-frontend/src/third_party
- third_party/dom_distiller_js
- third_party/dragonbox
- third_party/eigen3
- third_party/emoji-segmenter
- third_party/farmhash
- third_party/fast_float
- third_party/fdlibm
- third_party/federated_compute/chromium/fcp/confidentialcompute
- third_party/federated_compute/src/fcp/base
- third_party/federated_compute/src/fcp/confidentialcompute
- third_party/federated_compute/src/fcp/protos/confidentialcompute
- third_party/federated_compute/src/fcp/protos/federatedcompute
- third_party/fft2d
- third_party/flatbuffers
- third_party/fp16
- third_party/freetype
- third_party/fusejs
- third_party/fxdiv
- third_party/gemmlowp
- third_party/google_input_tools
- third_party/google_input_tools/third_party/closure_library
- third_party/google_input_tools/third_party/closure_library/third_party/closure
- third_party/googletest
- third_party/highway
- third_party/hunspell
- third_party/hyphenation-patterns
- third_party/ink_stroke_modeler/src/ink_stroke_modeler
- third_party/ink_stroke_modeler/src/ink_stroke_modeler/internal
- third_party/ink/src/ink/brush
- third_party/ink/src/ink/color
- third_party/ink/src/ink/geometry
- third_party/ink/src/ink/rendering
- third_party/ink/src/ink/rendering/skia/common_internal
- third_party/ink/src/ink/rendering/skia/native
- third_party/ink/src/ink/rendering/skia/native/internal
- third_party/ink/src/ink/strokes
- third_party/ink/src/ink/types
- third_party/inspector_protocol
- third_party/ipcz
- third_party/jinja2
- )
- use system-jsoncpp || keeplibs+=(
- third_party/jsoncpp
- )
- keeplibs+=(
- third_party/khronos
- third_party/lens_server_proto
- third_party/leveldatabase
- third_party/libaddressinput
- third_party/libdrm
- third_party/libgav1
- third_party/libjingle
- third_party/libpfm4
- third_party/libphonenumber
- third_party/libsecret
- third_party/libsrtp
- third_party/libsync
- third_party/libtess2/libtess2
- third_party/libtess2/src/Include
- third_party/libtess2/src/Source
- third_party/liburlpattern
- )
- use system-libusb || keeplibs+=(
- third_party/libusb
- )
- keeplibs+=(
- third_party/libva_protected_content
- )
- use system-libvpx || keeplibs+=(
- third_party/libvpx
- third_party/libvpx/source/libvpx/third_party/x86inc
- )
- keeplibs+=(
- third_party/libwebm
- third_party/libx11
- third_party/libxcb-keysyms
- third_party/libxml/chromium
- third_party/libyuv
- third_party/libzip
- third_party/lit
- third_party/lottie
- third_party/lss
- third_party/lzma_sdk
- third_party/mako
- third_party/markupsafe
- third_party/material_color_utilities
- third_party/metrics_proto
- third_party/minigbm
- third_party/ml_dtypes
- third_party/modp_b64
- third_party/nasm
- third_party/nearby
- third_party/neon_2_sse
- third_party/node
- third_party/oak/chromium/proto
- third_party/oak/chromium/proto/attestation
- third_party/omnibox_proto
- third_party/one_euro_filter
- third_party/openscreen
- third_party/openscreen/src/third_party/
- third_party/openscreen/src/third_party/tinycbor/src/src
- third_party/ots
- third_party/pdfium
- third_party/pdfium/third_party/agg23
- third_party/pdfium/third_party/bigint
- third_party/pdfium/third_party/freetype
- third_party/pdfium/third_party/lcms
- )
- use system-openjpeg || keeplibs+=(
- third_party/pdfium/third_party/libopenjpeg
- )
- keeplibs+=(
- third_party/pdfium/third_party/libtiff
- third_party/perfetto
- third_party/perfetto/protos/third_party/chromium
- third_party/perfetto/protos/third_party/pprof
- third_party/perfetto/protos/third_party/primes
- third_party/perfetto/protos/third_party/simpleperf
- third_party/pffft
- third_party/ply
- third_party/polymer
- third_party/private_membership
- third_party/private-join-and-compute
- third_party/protobuf
- third_party/protobuf/third_party/utf8_range
- third_party/pthreadpool
- third_party/puffin
- third_party/pyjson5
- third_party/pyyaml
- third_party/rapidhash
- third_party/readability
- third_party/rnnoise
- third_party/ruy
- third_party/s2cellid
- third_party/search_engines_data
- third_party/securemessage
- third_party/selenium-atoms
- third_party/sentencepiece
- third_party/sentencepiece/src/third_party/darts_clone
- third_party/shell-encryption
- third_party/simdutf
- third_party/simplejson
- third_party/six
- third_party/skia
- third_party/skia/include/third_party/vulkan
- third_party/smhasher
- )
- use system-snappy || keeplibs+=(
- third_party/snappy
- )
- keeplibs+=(
- third_party/spirv-headers
- third_party/spirv-tools
- third_party/sqlite
- third_party/swiftshader
- third_party/swiftshader/third_party/astc-encoder
- third_party/swiftshader/third_party/llvm-subzero
- third_party/swiftshader/third_party/marl
- third_party/swiftshader/third_party/SPIRV-Headers/include/spirv
- third_party/swiftshader/third_party/SPIRV-Tools
- third_party/swiftshader/third_party/subzero
- third_party/tensorflow_models
- third_party/tensorflow-text
- third_party/tflite
- third_party/tflite/src/third_party/fft2d
- third_party/tflite/src/third_party/xla/third_party/tsl
- third_party/tflite/src/third_party/xla/xla/tsl/framework
- third_party/tflite/src/third_party/xla/xla/tsl/lib/random
- third_party/tflite/src/third_party/xla/xla/tsl/platform
- third_party/tflite/src/third_party/xla/xla/tsl/protobuf
- third_party/tflite/src/third_party/xla/xla/tsl/util
- third_party/ukey2
- third_party/utf
- third_party/vulkan
- third_party/wayland
- third_party/webdriver
- third_party/webgpu-cts
- third_party/webrtc
- third_party/webrtc/common_audio/third_party/ooura
- third_party/webrtc/common_audio/third_party/spl_sqrt_floor
- third_party/webrtc/modules/third_party/fft
- third_party/webrtc/modules/third_party/g711
- third_party/webrtc/modules/third_party/g722
- third_party/widevine
- )
- use system-woff2 || keeplibs+=(
- third_party/woff2
- )
- keeplibs+=(
- third_party/wuffs
- third_party/x11proto
- third_party/xcbproto
- third_party/xnnpack
- third_party/zlib/google
- third_party/zxcvbn-cpp
- url/third_party/mozilla
- v8/third_party/glibc
- v8/third_party/inspector_protocol
- v8/third_party/rapidhash-v8
- v8/third_party/siphash
- v8/third_party/utf8-decoder
- v8/third_party/v8
- v8/third_party/valgrind
-
- # gyp -> gn leftovers
- third_party/speech-dispatcher
- third_party/usb_ids
- third_party/xdg-utils
- )
- if ! use system-harfbuzz; then
- keeplibs+=( third_party/harfbuzz-ng )
- fi
-
- if ! use system-ffmpeg; then
- keeplibs+=( third_party/ffmpeg third_party/opus )
- fi
-
- if ! use system-icu; then
- keeplibs+=( third_party/icu )
- fi
-
- if ! use system-zstd; then
- keeplibs+=( third_party/zstd )
- fi
-
- if ! use system-av1; then
- keeplibs+=(
- third_party/dav1d
- third_party/libaom
- third_party/libaom/source/libaom/third_party/fastfeat
- third_party/libaom/source/libaom/third_party/SVT-AV1
- third_party/libaom/source/libaom/third_party/vector
- third_party/libaom/source/libaom/third_party/x86inc
- )
- fi
-
- if use libcxx; then
- keeplibs+=(
- third_party/libc++
- third_party/llvm-libc
- )
- fi
-
- if ! use system-openh264; then
- keeplibs+=( third_party/openh264 )
- fi
-
- if ! use system-re2; then
- keeplibs+=( third_party/re2 )
- fi
-
- # Arch-specific
- if use arm64 || use ppc64 ; then
- keeplibs+=( third_party/swiftshader/third_party/llvm-10.0 )
- fi
- # we need to generate ppc64 stuff because upstream does not ship it yet
- # it has to be done before unbundling.
- if use ppc64; then
- pushd third_party/libvpx >/dev/null || die
- mkdir -p source/config/linux/ppc64 || die
- # requires git and clang, bug #832803
- # Revert https://chromium.googlesource.com/chromium/src/+/b463d0f40b08b4e896e7f458d89ae58ce2a27165%5E%21/third_party/libvpx/generate_gni.sh
- # and https://chromium.googlesource.com/chromium/src/+/71ebcbce867dd31da5f8b405a28fcb0de0657d91%5E%21/third_party/libvpx/generate_gni.sh
- # since we're not in a git repo
- sed -i -e "s|^update_readme||g; s|clang-format|${EPREFIX}/bin/true|g; /^git -C/d; /git cl/d; /cd \$BASE_DIR\/\$LIBVPX_SRC_DIR/ign format --in-place \$BASE_DIR\/BUILD.gn\ngn format --in-place \$BASE_DIR\/libvpx_srcs.gni" \
- generate_gni.sh || die
- ./generate_gni.sh || die
- popd >/dev/null || die
-
- pushd third_party/ffmpeg >/dev/null || die
- cp libavcodec/ppc/h264dsp.c libavcodec/ppc/h264dsp_ppc.c || die
- cp libavcodec/ppc/h264qpel.c libavcodec/ppc/h264qpel_ppc.c || die
- popd >/dev/null || die
- fi
-
- # Sanity check keeplibs, on major version bumps it is often necessary to update this list
- # and this enables us to hit them all at once.
- # There are some entries that need to be whitelisted (TODO: Why? The file is understandable, the rest seem odd)
- whitelist_libs=(
- net/third_party/quic
- third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
- third_party/libjingle
- third_party/mesa
- third_party/skia/third_party/vulkan
- third_party/vulkan
- )
- local not_found_libs=()
- for lib in "${keeplibs[@]}"; do
- if [[ ! -d "${lib}" ]] && ! has "${lib}" "${whitelist_libs[@]}"; then
- not_found_libs+=( "${lib}" )
- fi
- done
-
- if [[ ${#not_found_libs[@]} -gt 0 ]]; then
- ewarn "The following \`keeplibs\` directories were not found in the source tree:"
- for lib in "${not_found_libs[@]}"; do
- ewarn " ${lib}"
- done
- fi
-
- keeplibs+=( third_party/ungoogled )
-
- # Remove most bundled libraries. Some are still needed.
- einfo "Unbundling third-party libraries ..."
- build/linux/unbundle/remove_bundled_libraries.py "${keeplibs[@]}" --do-remove || die
-
- # bundled eu-strip is for amd64 only and we don't want to pre-stripped binaries
- mkdir -p buildtools/third_party/eu-strip/bin || die
- ln -s "${EPREFIX}"/bin/true buildtools/third_party/eu-strip/bin/eu-strip || die
-}
-
-src_configure() {
- # Calling this here supports resumption via FEATURES=keepwork
- python_setup
-
- local myconf_gn=""
-
- # Make sure the build system will use the right tools, bug #340795.
- tc-export AR CC CXX NM
-
- if use clang && ! tc-is-clang ; then
- einfo "Enforcing the use of clang due to USE=clang ..."
- if tc-is-cross-compiler; then
- CC="${CBUILD}-clang -target ${CHOST} --sysroot ${ESYSROOT}"
- CXX="${CBUILD}-clang++ -target ${CHOST} --sysroot ${ESYSROOT}"
- BUILD_CC=${CBUILD}-clang
- BUILD_CXX=${CBUILD}-clang++
- else
- CC=${CHOST}-clang
- CXX=${CHOST}-clang++
- fi
- strip-unsupported-flags
- elif ! use clang && ! tc-is-gcc ; then
- einfo "Enforcing the use of gcc due to USE=-clang ..."
- CC=${CHOST}-gcc
- CXX=${CHOST}-g++
- strip-unsupported-flags
- fi
-
- if tc-is-clang; then
- myconf_gn+=" is_clang=true clang_use_chrome_plugins=false use_clang_modules=false"
- else
- myconf_gn+=" is_clang=false"
- fi
-
- # Force lld for lto or pgo builds only, otherwise disable, bug 641556
- if use thinlto || use pgo || use clang || use nvidia; then
- myconf_gn+=" use_lld=true"
- else
- myconf_gn+=" use_lld=false"
- fi
-
- if use thinlto || use pgo; then
- AR=llvm-ar
- NM=llvm-nm
- if tc-is-cross-compiler; then
- BUILD_AR=llvm-ar
- BUILD_NM=llvm-nm
- fi
- fi
-
- # Define a custom toolchain for GN
- myconf_gn+=" custom_toolchain=\"//build/toolchain/linux/unbundle:default\""
-
- if tc-is-cross-compiler; then
- tc-export BUILD_{AR,CC,CXX,NM}
- myconf_gn+=" host_toolchain=\"//build/toolchain/linux/unbundle:host\""
- myconf_gn+=" v8_snapshot_toolchain=\"//build/toolchain/linux/unbundle:host\""
- myconf_gn+=" pkg_config=\"$(tc-getPKG_CONFIG)\""
- myconf_gn+=" host_pkg_config=\"$(tc-getBUILD_PKG_CONFIG)\""
-
- # setup cups-config, build system only uses --libs option
- if use cups; then
- mkdir "${T}/cups-config" || die
- cp "${ESYSROOT}/usr/bin/${CHOST}-cups-config" "${T}/cups-config/cups-config" || die
- export PATH="${PATH}:${T}/cups-config"
- fi
-
- # Don't inherit PKG_CONFIG_PATH from environment
- local -x PKG_CONFIG_PATH=
- else
- myconf_gn+=" host_toolchain=\"//build/toolchain/linux/unbundle:default\""
- fi
-
- # Disable rust for now; it's only used for testing and we don't need the additional bdep
- myconf_gn+=" enable_rust=false"
-
- # GN needs explicit config for Debug/Release as opposed to inferring it from build directory.
- myconf_gn+=" is_debug=$(usex debug true false)"
-
- # enable DCHECK with USE=debug only, increases chrome binary size by 30%, bug #811138.
- # DCHECK is fatal by default, make it configurable at runtime, #bug 807881.
- myconf_gn+=" dcheck_always_on=$(usex debug true false)"
- myconf_gn+=" dcheck_is_configurable=$(usex debug true false)"
-
- myconf_gn+=" enable_iterator_debugging=$(usex debug true false)"
-
- if use debug; then
- myconf_gn+=" symbol_level=2"
- myconf_gn+=" blink_symbol_level=2"
- myconf_gn+=" v8_symbol_level=2"
- else
- myconf_gn+=" symbol_level=0"
- myconf_gn+=" blink_symbol_level=0"
- myconf_gn+=" v8_symbol_level=0"
- fi
-
- # Component build isn't generally intended for use by end users. It's mostly useful
- # for development and debugging.
- myconf_gn+=" is_component_build=false"
-
- local gn_system_libraries=(
- flac
- fontconfig
- freetype
- libjpeg
- libwebp
- libxml
- libxslt
- zlib
- )
- if use system-abseil-cpp; then
- gn_system_libraries+=(
- absl_algorithm
- absl_base
- absl_cleanup
- absl_container
- absl_crc
- absl_debugging
- absl_flags
- absl_functional
- absl_hash
- absl_log
- absl_log_internal
- absl_memory
- absl_meta
- absl_numeric
- absl_random
- absl_status
- absl_strings
- absl_synchronization
- absl_time
- absl_types
- absl_utility
- )
- fi
- if use system-brotli; then
- gn_system_libraries+=( brotli )
- fi
- if use system-crc32c; then
- gn_system_libraries+=( crc32c )
- fi
- if use system-double-conversion; then
- gn_system_libraries+=( double-conversion )
- fi
- if use system-woff2; then
- gn_system_libraries+=( woff2 )
- fi
- if use nvidia; then
- gn_system_libraries+=( libXNVCtrl )
- fi
- if use system-ffmpeg; then
- gn_system_libraries+=( ffmpeg opus )
- fi
- if use system-jsoncpp; then
- gn_system_libraries+=( jsoncpp )
- fi
- if use system-icu; then
- gn_system_libraries+=( icu )
- fi
-
- gn_system_libraries+=( libpng )
- myconf_gn+=" use_system_libpng=true"
-
- if use system-zstd; then
- gn_system_libraries+=( zstd )
- fi
- if use system-av1; then
- gn_system_libraries+=( dav1d libaom )
- fi
- if use system-libusb; then
- gn_system_libraries+=( libusb )
- fi
- if use system-libvpx; then
- gn_system_libraries+=( libvpx )
- fi
- use system-openh264 && gn_system_libraries+=(
- openh264
- )
- use system-re2 && gn_system_libraries+=(
- re2
- )
- use system-snappy && gn_system_libraries+=(
- snappy
- )
-
- build/linux/unbundle/replace_gn_files.py --system-libraries "${gn_system_libraries[@]}" ||
- die "Failed to replace GN files for system libraries"
-
- # TODO 131: The above call clobbers `enable_freetype = true` in the freetype gni file
- # drop the last line, then append the freetype line and a new curly brace to end the block
- local freetype_gni="build/config/freetype/freetype.gni"
- sed -i -e '$d' ${freetype_gni} || die
- echo " enable_freetype = true" >> ${freetype_gni} || die
- echo "}" >> ${freetype_gni} || die
-
- # See dependency logic in third_party/BUILD.gn
- myconf_gn+=" use_system_harfbuzz=$(usex system-harfbuzz true false)"
-
- # Optional dependencies.
- myconf_gn+=" enable_hangout_services_extension=$(usex hangouts true false)"
- myconf_gn+=" enable_widevine=$(usex widevine true false)"
-
- if use headless; then
- myconf_gn+=" use_cups=false"
- myconf_gn+=" use_kerberos=false"
- myconf_gn+=" use_pulseaudio=false"
- myconf_gn+=" use_vaapi=false"
- myconf_gn+=" rtc_use_pipewire=false"
- else
- myconf_gn+=" use_cups=$(usex cups true false)"
- myconf_gn+=" use_kerberos=$(usex kerberos true false)"
- myconf_gn+=" use_pulseaudio=$(usex pulseaudio true false)"
- myconf_gn+=" use_vaapi=$(usex vaapi true false)"
- myconf_gn+=" rtc_use_pipewire=$(usex screencast true false)"
- myconf_gn+=" gtk_version=$(usex gtk4 4 3)"
- fi
-
- # Allows distributions to link pulseaudio directly (DT_NEEDED) instead of
- # using dlopen. This helps with automated detection of ABI mismatches and
- # prevents silent errors.
- if use pulseaudio; then
- myconf_gn+=" link_pulseaudio=true"
- fi
-
- # Non-developer builds of Chromium (for example, non-Chrome browsers, or
- # Chromium builds provided by Linux distros) should disable the testing config
- myconf_gn+=" disable_fieldtrial_testing_config=true"
-
- # The sysroot is the oldest debian image that chromium supports, we don't need it
- myconf_gn+=" use_sysroot=false"
-
- # This determines whether or not GN uses the bundled libcxx
- if use libcxx; then
- myconf_gn+=" use_custom_libcxx=true"
- else
- myconf_gn+=" use_custom_libcxx=false"
- myconf_gn+=" use_llvm_libatomic=false"
- append-cppflags -U_GLIBCXX_ASSERTIONS #See #318
- fi
-
- myconf_gn+=" use_bluez=$(usex bluetooth true false)"
-
- myconf_gn+=" is_cfi=$(usex cfi true false)"
-
- if use cfi; then
- myconf_gn+=" use_cfi_icall=true"
- myconf_gn+=" use_cfi_cast=true"
- fi
-
- if use pgo; then
- myconf_gn+=" chrome_pgo_phase=2"
- myconf_gn+=" v8_enable_builtins_optimization=true"
- else
- myconf_gn+=" chrome_pgo_phase=0"
- fi
-
- myconf_gn+=" optimize_webui=$(usex optimize-webui true false)"
- myconf_gn+=" use_system_freetype=$(usex system-harfbuzz true false)"
- myconf_gn+=" use_system_libopenjpeg2=$(usex system-openjpeg true false)"
- myconf_gn+=" enable_pdf=true"
- myconf_gn+=" use_system_lcms2=true"
- myconf_gn+=" enable_print_preview=true"
-
- # Ungoogled flags
- myconf_gn+=" build_with_tflite_lib=false"
- myconf_gn+=" enable_mdns=false"
- myconf_gn+=" enable_mse_mpeg2ts_stream_parser=$(usex proprietary-codecs true false)"
- myconf_gn+=" enable_remoting=false"
- myconf_gn+=" enable_reporting=false"
- myconf_gn+=" enable_service_discovery=false"
- myconf_gn+=" exclude_unwind_tables=true"
- myconf_gn+=" google_api_key=\"\""
- myconf_gn+=" google_default_client_id=\"\""
- myconf_gn+=" google_default_client_secret=\"\""
- myconf_gn+=" safe_browsing_mode=0"
- myconf_gn+=" use_official_google_api_keys=false"
- myconf_gn+=" use_unofficial_version_number=false"
-
- # myconf_gn+=" enable_swiftshader=false"
-
- # Additional flags
- myconf_gn+=" perfetto_use_system_zlib=true"
- myconf_gn+=" use_system_zlib=true"
- myconf_gn+=" use_system_libjpeg=true"
- myconf_gn+=" rtc_build_examples=false"
- myconf_gn+=" enable_chromium_prelude=false"
- myconf_gn+=" enable_updater=false"
- myconf_gn+=" enable_update_notifications=false"
- myconf_gn+=" enable_constraints=false"
- myconf_gn+=" rtc_rusty_base64=false"
- myconf_gn+=" v8_enable_temporal_support=false"
- myconf_gn+=" media_use_symphonia=false"
- myconf_gn+=" pdf_enable_rust_png=false"
- myconf_gn+=" skia_use_libpng_encode=true"
- myconf_gn+=" skia_use_libpng_decode=true"
- myconf_gn+=" skia_use_rust_png_decode=false"
- myconf_gn+=" skia_use_rust_png_encode=false"
- myconf_gn+=" enable_jxl_decoder=false"
-
- # Disable pseudolocales, only used for testing
- myconf_gn+=" enable_pseudolocales=false"
-
- # Disable code formating of generated files
- myconf_gn+=" blink_enable_generated_code_formatting=false"
-
- ffmpeg_branding="$(usex proprietary-codecs Chrome Chromium)"
- myconf_gn+=" proprietary_codecs=$(usex proprietary-codecs true false)"
- myconf_gn+=" ffmpeg_branding=\"${ffmpeg_branding}\""
-
- local myarch="$(tc-arch)"
-
- # Avoid CFLAGS problems
- if ! use custom-cflags; then
- filter-flags "-O*" "-Wl,-O*" #See #25
- strip-flags
-
- # Prevent linker from running out of address space, bug #471810 .
- if use x86; then
- filter-flags "-g*"
- fi
-
- # Prevent libvpx/xnnpack build failures. Bug 530248, 544702, 546984, 853646.
- if [[ ${myarch} == amd64 || ${myarch} == x86 ]]; then
- filter-flags -mno-mmx -mno-sse2 -mno-ssse3 -mno-sse4.1 -mno-avx -mno-avx2 -mno-fma -mno-fma4 -mno-xop -mno-sse4a
- fi
-
- if tc-is-gcc; then
- # https://bugs.gentoo.org/904455
- local -x CPP="$(tc-getCXX) -E"
- # https://bugs.gentoo.org/912381
- filter-lto
- fi
- fi
-
- local dest_cpu=""
-
- if [[ $myarch = amd64 ]] ; then
- dest_cpu=x64
- myconf_gn+=" target_cpu=\"x64\""
- ffmpeg_target_arch=x64
- dest_cpu="x64"
- elif [[ $myarch = x86 ]] ; then
- myconf_gn+=" target_cpu=\"x86\""
- ffmpeg_target_arch=ia32
- dest_cpu="x86"
-
- # This is normally defined by compiler_cpu_abi in
- # build/config/compiler/BUILD.gn, but we patch that part out.
- append-flags -msse2 -mfpmath=sse -mmmx
- elif [[ $myarch = arm64 ]] ; then
- myconf_gn+=" target_cpu=\"arm64\""
- ffmpeg_target_arch=arm64
- dest_cpu="arm64"
- elif [[ $myarch = arm ]] ; then
- myconf_gn+=" target_cpu=\"arm\""
- ffmpeg_target_arch=$(usex cpu_flags_arm_neon arm-neon arm)
- dest_cpu="arm"
- elif [[ $myarch = ppc64 ]] ; then
- myconf_gn+=" target_cpu=\"ppc64\""
- ffmpeg_target_arch=ppc64
- dest_cpu="ppc64"
- else
- die "Failed to determine target arch, got '$myarch'."
- fi
-
- if use thinlto; then
- # We need to change the default value of import-instr-limit in
- # LLVM to limit the text size increase. The default value is
- # 100, and we change it to 30 to reduce the text size increase
- # from 25% to 10%. The performance number of page_cycler is the
- # same on two of the thinLTO configurations, we got 1% slowdown
- # on speedometer when changing import-instr-limit from 100 to 30.
- # append-ldflags "-Wl,-plugin-opt,-import-instr-limit=30"
- sed -i '/import_instr_limit = 5/{s++import_instr_limit = 30+;h};${x;/./{x;q0};x;q1}' \
- build/config/compiler/BUILD.gn || die
-
- append-ldflags "-Wl,--thinlto-jobs=$(makeopts_jobs)"
- fi
-
- myconf_gn+=" treat_warnings_as_errors=false"
- # Disable fatal linker warnings, bug 506268.
- myconf_gn+=" fatal_linker_warnings=false"
-
- # Disable external code space for V8 for ppc64. It is disabled for ppc64
- # by default, but cross-compiling on amd64 enables it again.
- if tc-is-cross-compiler; then
- if ! use amd64 && ! use arm64; then
- myconf_gn+=" v8_enable_external_code_space=false"
- fi
- fi
-
- # Only enabled for clang, but gcc has endian macros too
- myconf_gn+=" v8_use_libm_trig_functions=true"
-
- # Bug 491582.
- export TMPDIR="${WORKDIR}/temp"
- mkdir -p -m 755 "${TMPDIR}" || die
-
- # https://bugs.gentoo.org/654216
- addpredict /dev/dri/ #nowarn
-
- # Disable unknown warning message from clang.
- if tc-is-clang; then
- append-flags -Wno-unknown-warning-option
- if tc-is-cross-compiler; then
- export BUILD_CXXFLAGS+=" -Wno-unknown-warning-option"
- export BUILD_CFLAGS+=" -Wno-unknown-warning-option"
- fi
- fi
-
- # Explicitly disable ICU data file support for system-icu/headless builds.
- if use system-icu || use headless; then
- myconf_gn+=" icu_use_data_file=false"
- fi
-
- # Don't need nocompile checks and GN crashes with our config
- myconf_gn+=" enable_nocompile_tests=false"
-
- # 131 began laying the groundwork for replacing freetype with
- # "Rust-based Fontations set of libraries plus Skia path rendering"
- # We now need to opt-in
- myconf_gn+=" enable_freetype=true"
-
- # Enable ozone wayland and/or headless support
- myconf_gn+=" use_ozone=true ozone_auto_platforms=false"
- myconf_gn+=" ozone_platform_headless=true"
- if use headless; then
- myconf_gn+=" ozone_platform=\"headless\""
- myconf_gn+=" use_xkbcommon=false use_gtk=false use_qt=false"
- myconf_gn+=" use_glib=false use_gio=false"
- myconf_gn+=" use_pangocairo=false use_alsa=false"
- myconf_gn+=" use_libpci=false use_udev=false"
- myconf_gn+=" enable_print_preview=false"
- myconf_gn+=" enable_remoting=false"
- else
- myconf_gn+=" use_system_minigbm=true"
- myconf_gn+=" use_xkbcommon=true"
- if use qt6; then
- local cbuild_libdir=$(get_libdir)
- if tc-is-cross-compiler; then
- # Hack to workaround get_libdir not being able to handle CBUILD, bug #794181
- local cbuild_libdir=$($(tc-getBUILD_PKG_CONFIG) --keep-system-libs --libs-only-L libxslt)
- cbuild_libdir=${cbuild_libdir:2}
- cbuild_libdir=${cbuild_libdir/% }
- fi
- myconf_gn+=" use_qt6=true"
- myconf_gn+=" moc_qt6_path=\"${EPREFIX}/usr/${cbuild_libdir}/qt6/libexec\""
- else
- myconf_gn+=" use_qt6=false"
- fi
- myconf_gn+=" ozone_platform_x11=$(usex X true false)"
- myconf_gn+=" ozone_platform_wayland=$(usex wayland true false)"
- myconf_gn+=" ozone_platform=$(usex wayland \"wayland\" \"x11\")"
- use wayland && myconf_gn+=" use_system_libffi=true"
- fi
-
- # Results in undefined references in chrome linking, may require CFI to work
- if use arm64; then
- myconf_gn+=" arm_control_flow_integrity=\"none\""
- fi
-
- # Enable official builds
- myconf_gn+=" is_official_build=$(usex official true false)"
- myconf_gn+=" use_thin_lto=$(usex thinlto true false)"
- myconf_gn+=" thin_lto_enable_optimizations=$(usex optimize-thinlto true false)"
- if use official; then
- # Allow building against system libraries in official builds
- sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \
- tools/generate_shim_headers/generate_shim_headers.py || die
- else
- myconf_gn+=" devtools_skip_typecheck=false"
- fi
-
- # user CXXFLAGS might overwrite -march=armv8-a+crc+crypto, bug #851639
- if use arm64 && tc-is-gcc; then
- sed -i '/^#if HAVE_ARM64_CRC32C/a #pragma GCC target ("+crc+crypto")' \
- third_party/crc32c/src/src/crc32c_arm64.cc || die
- fi
-
- # skipping typecheck is only supported on amd64, bug #876157
- if ! use amd64; then
- myconf_gn+=" devtools_skip_typecheck=false"
- fi
-
- # Facilitate deterministic builds (taken from build/config/compiler/BUILD.gn)
- append-cflags -Wno-builtin-macro-redefined
- append-cxxflags -Wno-builtin-macro-redefined
- append-cppflags "-D__DATE__= -D__TIME__= -D__TIMESTAMP__="
-
- local flags
- einfo "Building with the following compiler settings:"
- for flags in C{C,XX} AR NM RANLIB {C,CXX,CPP,LD}FLAGS \
- EXTRA_GN UGC_{SKIP_{PATCHES,SUBSTITUTION},KEEP_BINARIES} ; do
- einfo " ${flags} = \"${!flags}\""
- done
-
- einfo "Configuring Chromium ..."
- set -- gn gen --args="${myconf_gn} ${EXTRA_GN}" out/Release
- echo "$@"
- "$@" || die "Failed to configure Chromium"
-
- # The "if" below should not be executed unless testing
- if [ ! -z "${NODIE}" ]; then
- # List all args
- # gn args --list out/Release
-
- # Quick compiler check
- eninja -C out/Release protoc torque
- fi
-}
-
-src_compile() {
- # Final link uses lots of file descriptors.
- ulimit -n 2048
-
- # Calling this here supports resumption via FEATURES=keepwork
- python_setup
-
- # Don't inherit PYTHONPATH from environment, bug #789021, #812689
- local -x PYTHONPATH=
-
- # Build mksnapshot and pax-mark it.
- if use pax-kernel; then
- local x
- for x in mksnapshot v8_context_snapshot_generator; do
- if tc-is-cross-compiler; then
- eninja -C out/Release "host/${x}"
- pax-mark m "out/Release/host/${x}"
- else
- eninja -C out/Release "${x}"
- pax-mark m "out/Release/${x}"
- fi
- done
- fi
-
- # Even though ninja autodetects number of CPUs, we respect
- # user's options, for debugging with -j 1 or any other reason.
- eninja -C out/Release chrome
-
- use convert-dict && eninja -C out/Release convert_dict
-
- use enable-driver && eninja -C out/Release chromedriver
- #use suid && eninja -C out/Release chrome_sandbox
-
- pax-mark m out/Release/chrome
-
- use enable-driver && mv out/Release/chromedriver
-
- rm -f out/Release/locales/*.pak.info || die
-
- # Generate support files: #684550 #706786 #968958
- # Use upstream's python installer script to generate support files
- # This replaces fragile sed commands and handles @@include@@ directives.
- # It'll also verify that all substitution markers have been resolved, meaning that
- # future changes to templates that add new variables will be caught during the build.
- cat > "${T}/generate_support_files.py" <<-EOF || die
- import sys
- from pathlib import Path
-
- # Add upstream installer script to search path
- sys.path.insert(0, str(Path.cwd() / "chrome/installer/linux/common"))
- import installer
-
- # Configure contexts strictly for file generation
- # Common variables used across templates
- context = {
- "BUGTRACKERURL": "https://github.com/ungoogled-software/ungoogled-chromium/issues",
- "DEVELOPER_NAME": "The ungoogled-chromium Authors",
- "extra_desktop_entries": "",
- "FULLDESC": "Google Chromium, sans integration with Google",
- "HELPURL": "https://ungoogled-software.github.io/ungoogled-chromium-wiki/faq",
- "INSTALLDIR": "/usr/$(get_libdir)/chromium-browser",
- "MAINTMAIL": "@PF4Public",
- "MENUNAME": "ungoogled-chromium",
- "PACKAGE": "chromium-browser",
- "PRODUCTURL": "https://github.com/ungoogled-software/ungoogled-chromium",
- "PROGNAME": "chrome",
- "PROJECT_LICENSE": "BSD, LGPL-2, LGPL-2.1, MPL-1.1, MPL-2.0, Apache-2.0, and others",
- "SHORTDESC": "Open-source foundation of many web browsers including Google Chrome",
- "uri_scheme": "x-scheme-handler/chromium",
- "usr_bin_symlink_name": "chromium-browser",
- }
-
- # Generate Desktop file
- installer.process_template(
- Path("chrome/installer/linux/common/desktop.template"),
- Path("out/Release/chromium-browser-chromium.desktop"),
- context
- )
-
- # Generate Manpage
- installer.process_template(
- Path("chrome/app/resources/manpage.1.in"),
- Path("out/Release/chromium-browser.1"),
- context
- )
-
- # Generate AppData (AppStream)
- installer.process_template(
- Path("chrome/installer/linux/common/appdata.xml.template"),
- Path("out/Release/chromium-browser.appdata.xml"),
- context
- )
-
- # Generate GNOME Default Apps entry
- installer.process_template(
- Path("chrome/installer/linux/common/default-app.template"),
- Path("out/Release/chromium-browser.xml"),
- context
- )
- EOF
-
- "${EPYTHON}" "${T}/generate_support_files.py" || die "Failed to generate support files"
-
- # Build vk_swiftshader_icd.json; bug #827861
- sed -e 's|${ICD_LIBRARY_PATH}|./libvk_swiftshader.so|g' \
- third_party/swiftshader/src/Vulkan/vk_swiftshader_icd.json.tmpl > \
- out/Release/vk_swiftshader_icd.json || die
-}
-
-src_install() {
- local CHROMIUM_HOME="/usr/$(get_libdir)/chromium-browser"
- exeinto "${CHROMIUM_HOME}"
- doexe out/Release/chrome
-
- if use convert-dict; then
- newexe "${FILESDIR}/update-dicts.sh" update-dicts.sh
- doexe out/Release/convert_dict
- fi
-
- #newexe out/Release/chrome_sandbox chrome-sandbox
- #fperms 4755 "${CHROMIUM_HOME}/chrome-sandbox"
-
- use enable-driver && doexe out/Release/chromedriver
-
- #* https://github.com/ungoogled-software/ungoogled-chromium/pull/3563
- doexe out/Release/chrome_crashpad_handler
-
- ozone_auto_session () {
- use X && use wayland && ! use headless && echo true || echo false
- }
- local sedargs=( -e
- "s:/usr/lib/:/usr/$(get_libdir)/:g;
- s:@@OZONE_AUTO_SESSION@@:$(ozone_auto_session):g"
- )
- sed "${sedargs[@]}" "${FILESDIR}/chromium-launcher-r7.sh" > chromium-launcher.sh || die
- doexe chromium-launcher.sh
-
- # It is important that we name the target "chromium-browser",
- # xdg-utils expect it; bug #355517.
- dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-browser
- # keep the old symlink around for consistency
- dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium
-
- use enable-driver && dosym "${CHROMIUM_HOME}/chromedriver" /usr/bin/chromedriver
-
- # Allow users to override command-line options, bug #357629.
- insinto /etc/chromium
- newins "${FILESDIR}/chromium.default" "default"
-
- pushd out/Release/locales > /dev/null || die
- chromium_remove_language_paks
- popd > /dev/null || die
-
- insinto "${CHROMIUM_HOME}"
- doins out/Release/*.bin
- doins out/Release/*.pak
- doins -r out/Release/hyphen-data
- (
- shopt -s nullglob
- local files=(out/Release/*.so out/Release/*.so.[0-9])
- [[ ${#files[@]} -gt 0 ]] && doins "${files[@]}"
- )
-
- # Install bundled xdg-utils, avoids installing X11 libraries with USE="-X wayland"
- doins out/Release/xdg-{settings,mime}
-
- if ! use system-icu && ! use headless; then
- doins out/Release/icudtl.dat
- fi
-
- doins -r out/Release/locales
- #doins -r out/Release/MEIPreload
-
- # Install vk_swiftshader_icd.json; bug #827861
- doins out/Release/vk_swiftshader_icd.json
-
- if [[ -d out/Release/swiftshader ]]; then
- insinto "${CHROMIUM_HOME}/swiftshader"
- doins out/Release/swiftshader/*.so
- fi
-
- use widevine && dosym WidevineCdm/_platform_specific/linux_x64/libwidevinecdm.so /usr/$(get_libdir)/chromium-browser/libwidevinecdm.so
-
- # Install icons
- local branding size
- for size in 16 24 32 48 64 128 256 ; do
- case ${size} in
- 16|32) branding="chrome/app/theme/default_100_percent/chromium" ;;
- *) branding="chrome/app/theme/chromium" ;;
- esac
- newicon -s ${size} "${branding}/product_logo_${size}.png" \
- chromium-browser.png
- done
-
- # Install desktop entry
- domenu out/Release/chromium-browser-chromium.desktop
-
- # Install GNOME default application entry (bug #303100).
- insinto /usr/share/gnome-control-center/default-apps
- doins out/Release/chromium-browser.xml
-
- # Install AppStream metadata
- insinto /usr/share/appdata
- doins out/Release/chromium-browser.appdata.xml
-
- # Install manpage; bug #684550
- doman out/Release/chromium-browser.1
- dosym chromium-browser.1 /usr/share/man/man1/chromium.1
-
- readme.gentoo_create_doc
-}
-
-pkg_postrm() {
- xdg_icon_cache_update
- xdg_desktop_database_update
-}
-
-pkg_postinst() {
- xdg_icon_cache_update
- xdg_desktop_database_update
- readme.gentoo_print_elog
-
- if ! use headless; then
- if use vaapi; then
- elog "Hardware-accelerated video decoding configuration:"
- elog
- elog "Chromium supports multiple backends for hardware acceleration. To enable one,"
- elog " Add to CHROMIUM_FLAGS in /etc/chromium/default:"
- elog
- elog "1. VA-API with OpenGL (recommended for most users):"
- elog " --enable-features=AcceleratedVideoDecodeLinuxGL"
- elog " VaapiVideoDecoder may need to be added as well, but try without first."
- elog
- if use wayland; then
- elog "2. Enhanced Wayland/EGL performance:"
- elog " --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL"
- elog
- fi
- if use X; then
- elog "$(usex wayland "3" "2"). VA-API with Vulkan:"
- elog " --enable-features=VaapiVideoDecoder,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE"
- elog
- if use wayland; then
- elog " NOTE: Vulkan acceleration requires X11 and will not work under Wayland sessions."
- elog " Use OpenGL-based acceleration instead when running under Wayland."
- elog
- fi
- fi
- elog "Additional options:"
- elog " To enable hardware-accelerated encoding (if supported)"
- elog " add 'AcceleratedVideoEncoder' to your feature list"
- elog " VaapiIgnoreDriverChecks bypasses driver compatibility checks"
- elog " (may be needed for newer/unsupported hardware)"
- elog
- else
- elog "This Chromium build was compiled without VA-API support, which provides"
- elog "hardware-accelerated video decoding."
- fi
- if use screencast; then
- elog "Screencast is disabled by default at runtime. Either enable it"
- elog "by navigating to chrome://flags/#enable-webrtc-pipewire-capturer"
- elog "inside Chromium or add --enable-features=WebRTCPipeWireCapturer"
- elog "to CHROMIUM_FLAGS in /etc/chromium/default."
- elog
- elog "Additional setup may be required for screencasting to work."
- elog "See issue: https://github.com/PF4Public/gentoo-overlay/issues/314"
- fi
- if use gtk4; then
- elog "Chromium prefers GTK3 over GTK4 at runtime. To override this"
- elog "behaviour you need to pass --gtk-version=4, e.g. by adding it"
- elog "to CHROMIUM_FLAGS in /etc/chromium/default."
- fi
- if use widevine; then
- elog "widevine requires binary plugins, which are distributed separately"
- elog "Make sure you have www-plugins/chrome-binary-plugins installed"
- fi
- fi
-}
-
-eapply_wrapper () {
- if [ ! -z "${NODIE}" ]; then
- nonfatal eapply "$@"
- else
- eapply "$@"
- fi
-}
-
-git_wrapper () {
- if [ ! -z "${NODIE}" ]; then
- git "$@"
- else
- git "$@" || die
- fi
-}
-
-filter_wrapper () {
- einfo "Applying ${i##*/}"
- #? fuzz factor of 3 is OK?
- if [ ! -z "${NODIE}" ]; then
- filterdiff -p1 "${@:2}" < "$1" | patch -F 3 -p1
- else
- filterdiff -p1 "${@:2}" < "$1" | patch -F 3 -p1 || die
- fi
-}
diff --git a/www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.96_p1.ebuild b/www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.178_p1.ebuild
index be75d2058770..53a0d24ca964 100644
--- a/www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.96_p1.ebuild
+++ b/www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.178_p1.ebuild
@@ -35,13 +35,13 @@ ESBUILD_VER="0.25.1"
ROLLUP_VER="4.57.1" # currently manual.
VIRTUALX_REQUIRED="pgo"
-#UGC_COMMIT_ID="94267d333da299337c545c1723db169e7f9a6e24"
+#UGC_COMMIT_ID="7c07c452ea3374a68e3a0b3f059e93464d7fc4a2"
# UGC_PR_COMMITS=(
# c917e096342e5b90eeea91ab1f8516447c8756cf
# 5794e9d12bf82620d5f24505798fecb45ca5a22d
# )
-CROMITE_COMMIT_ID="2afc7b19a4f8a398f715287f6b4ac6a45bc69cd9"
+CROMITE_COMMIT_ID="cb3baf14f52eb4365d017f640f85310735c19b79"
#declare -A CHROMIUM_COMMITS=(
# ["fcfb1a42813f1e9d8babedc7bb2e0f06101a3151"]="." #148+
@@ -56,7 +56,7 @@ CHROMIUM_LANGS="af am ar as az be bg bn bs ca cs cy da de el en-GB es es-419 et
vi zh-CN zh-HK zh-TW zu"
LLVM_COMPAT=( 21 22 23 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..13} )
PYTHON_REQ_USE="xml(+)"
RUST_MIN_VER=1.91.0
RUST_NEEDS_LLVM="yes please"
@@ -92,9 +92,12 @@ SRC_URI="https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/d
)
"
-# https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
# Gentoo tarball:
# https://chromium-tarballs.distfiles.gentoo.org/chromium-${PV/_*}.tar.xz -> chromium-${PV/_*}-gentoo.tar.xz
+
+# chromium-linux-tarballs
+# https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/download/${PV/_*}/chromium-${PV/_*}-linux.tar.xz
+
# Official tarball:
# https://commondatastorage.googleapis.com/chromium-browser-official/chromium-${PV/_*}${LITE_TARBALL:+-lite}.tar.xz
@@ -925,6 +928,10 @@ src_prepare() {
sed -i 's/absl::/std::/' "${BR_PA_PATH}/Add-a-proxy-configuration-page.patch" || die
+ filterdiff -p1 "${BR_PA_PATH}/JIT-site-settings.patch" --exclude="content/browser/renderer_host/render_process_host_impl.cc" \
+ > "${BR_PA_PATH}/JIT-site-settings.patch1"
+ mv -f "${BR_PA_PATH}/JIT-site-settings.patch1" "${BR_PA_PATH}/JIT-site-settings.patch"
+
BROMITE_PATCHES=(
"${BR_PA_PATH}/bromite-build-utils.patch"
"${BR_PA_PATH}/Battery-API-return-nothing.patch"
@@ -2097,6 +2104,12 @@ src_configure() {
# "enable_jxl_decoder=false"
)
+ if use amd64 || use arm64; then
+ myconf_gn+=(
+ "v8_drumbrake_bounds_checks=true"
+ "v8_enable_drumbrake=true"
+ )
+ fi
if use thinlto; then
# We need to change the default value of import-instr-limit in
diff --git a/www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.167_p1.ebuild b/www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.215_p1.ebuild
index 0abdbeffec2e..53a0d24ca964 100644
--- a/www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.167_p1.ebuild
+++ b/www-client/ungoogled-chromium/ungoogled-chromium-148.0.7778.215_p1.ebuild
@@ -35,13 +35,13 @@ ESBUILD_VER="0.25.1"
ROLLUP_VER="4.57.1" # currently manual.
VIRTUALX_REQUIRED="pgo"
-#UGC_COMMIT_ID="94267d333da299337c545c1723db169e7f9a6e24"
+#UGC_COMMIT_ID="7c07c452ea3374a68e3a0b3f059e93464d7fc4a2"
# UGC_PR_COMMITS=(
# c917e096342e5b90eeea91ab1f8516447c8756cf
# 5794e9d12bf82620d5f24505798fecb45ca5a22d
# )
-CROMITE_COMMIT_ID="2afc7b19a4f8a398f715287f6b4ac6a45bc69cd9"
+CROMITE_COMMIT_ID="cb3baf14f52eb4365d017f640f85310735c19b79"
#declare -A CHROMIUM_COMMITS=(
# ["fcfb1a42813f1e9d8babedc7bb2e0f06101a3151"]="." #148+
@@ -56,7 +56,7 @@ CHROMIUM_LANGS="af am ar as az be bg bn bs ca cs cy da de el en-GB es es-419 et
vi zh-CN zh-HK zh-TW zu"
LLVM_COMPAT=( 21 22 23 )
-PYTHON_COMPAT=( python3_{10..14} )
+PYTHON_COMPAT=( python3_{11..13} )
PYTHON_REQ_USE="xml(+)"
RUST_MIN_VER=1.91.0
RUST_NEEDS_LLVM="yes please"
@@ -92,9 +92,12 @@ SRC_URI="https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/d
)
"
-# https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
# Gentoo tarball:
# https://chromium-tarballs.distfiles.gentoo.org/chromium-${PV/_*}.tar.xz -> chromium-${PV/_*}-gentoo.tar.xz
+
+# chromium-linux-tarballs
+# https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/download/${PV/_*}/chromium-${PV/_*}-linux.tar.xz
+
# Official tarball:
# https://commondatastorage.googleapis.com/chromium-browser-official/chromium-${PV/_*}${LITE_TARBALL:+-lite}.tar.xz
@@ -104,8 +107,8 @@ LICENSE+=" IJG ISC LGPL-2 LGPL-2.1 MIT MPL-1.1 MPL-2.0 Ms-PL PSF-2 SGI-B-2.0 SSL
LICENSE+=" Unicode-DFS-2015 Unlicense UoI-NCSA ZLIB libtiff openssl"
LICENSE+=" cromite? ( GPL-3 )"
-SLOT="beta"
-KEYWORDS="~amd64 ~arm64 ~ppc64 ~x86"
+SLOT="stable"
+KEYWORDS="amd64 ~arm64 ~ppc64 ~x86"
IUSE_SYSTEM_LIBS="abseil-cpp av1 brotli crc32c double-conversion ffmpeg +harfbuzz icu jsoncpp +libusb libvpx +openh264 openjpeg re2 snappy woff2 +zstd"
IUSE="+X bindist bluetooth bundled-toolchain cfi convert-dict cups custom-cflags debug ffmpeg-chromium enable-driver gtk4 hangouts headless kerberos +libcxx nvidia +official optimize-thinlto optimize-webui override-data-dir pax-kernel pgo"
@@ -925,6 +928,10 @@ src_prepare() {
sed -i 's/absl::/std::/' "${BR_PA_PATH}/Add-a-proxy-configuration-page.patch" || die
+ filterdiff -p1 "${BR_PA_PATH}/JIT-site-settings.patch" --exclude="content/browser/renderer_host/render_process_host_impl.cc" \
+ > "${BR_PA_PATH}/JIT-site-settings.patch1"
+ mv -f "${BR_PA_PATH}/JIT-site-settings.patch1" "${BR_PA_PATH}/JIT-site-settings.patch"
+
BROMITE_PATCHES=(
"${BR_PA_PATH}/bromite-build-utils.patch"
"${BR_PA_PATH}/Battery-API-return-nothing.patch"
@@ -2097,6 +2104,12 @@ src_configure() {
# "enable_jxl_decoder=false"
)
+ if use amd64 || use arm64; then
+ myconf_gn+=(
+ "v8_drumbrake_bounds_checks=true"
+ "v8_enable_drumbrake=true"
+ )
+ fi
if use thinlto; then
# We need to change the default value of import-instr-limit in
diff --git a/www-client/vimb/metadata.xml b/www-client/vimb/metadata.xml
index 146f12cdb09d..97b512ec89bd 100644
--- a/www-client/vimb/metadata.xml
+++ b/www-client/vimb/metadata.xml
@@ -6,5 +6,5 @@
<name>Efe İzbudak</name>
</maintainer>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/vivaldi-snapshot/Manifest b/www-client/vivaldi-snapshot/Manifest
index dd11fbe92834..b340637563cc 100644
--- a/www-client/vivaldi-snapshot/Manifest
+++ b/www-client/vivaldi-snapshot/Manifest
@@ -1,4 +1,4 @@
-DIST vivaldi-snapshot_7.10.4031.3-1_amd64.deb 131488180 BLAKE2B 1c5f454962e948dbec646d21428299ad6a27570df8cb42436809f53a21c3d4630399b55aa39ff18f266a6816da2fe769c34123e7280e8e403d81c98620836f7d SHA512 303cfb4793f5df79a7210dab91494d63b5af5c5d556441c1e197a0433d3cbaec6a972eb407d59a6c71d1b8354a4a04525c1b4500bd66b7163c473ac21a2b68c7
-DIST vivaldi-snapshot_7.10.4031.3-1_arm64.deb 124294608 BLAKE2B 5babf6c6792dc9e50456088818f48308e788d1a4e75300ffbfaec9d4e83ade890291edb1de7610bcfcf1224137f4ab2ad6d105d8e02015f9538facd542308352 SHA512 2fdfd61f4ae739e1699f09cc5abae1268740c473dd97a89fb22ae648b9d66b7891312f23a26f5e6b8192c4f793950a327c595893c581389677d23a6aab387c0b
-DIST vivaldi-snapshot_8.0.4033.7-1_amd64.deb 131468280 BLAKE2B 8801517d6c22c678eb2e926bab3207b8172584266cd27078f52960a6253ad3e13e103a8925c178794cc794fd2802c782eabbaa232617eaeb3c35da5fd0c02c20 SHA512 af078b02dce448001ab10e0eeae3f48ce1c76d6320ca01043cd78e7c17d7257dd2f8edc8a1141431070c23782dcdd71ea8ea9bac0079e9c02ee36ff5cb0d8193
-DIST vivaldi-snapshot_8.0.4033.7-1_arm64.deb 124289052 BLAKE2B 29b04d4ab994aa6eca508f34933f0236b53cfdc5141618dae9df8ac537daa70a8eb421c766e0ec78b214b74942063a25011724e536579c165718b153961caa7d SHA512 0bf75bbb0f0031d6e0c90a6c4c7d2af8320556b0f98cb437b715fd73e981aa43b0c84578c47a40035b4f1daeb186184885fb55b82215786b7611e790b37e5ddb
+DIST vivaldi-snapshot_8.0.4033.32-1_amd64.deb 130937496 BLAKE2B 0c5b9a354bb84a72924bbe2545060a8157ea62ee9ae8a44ff33f5110187b078baec6b402805911a8ed6324856b87f0fd5b5b3bc66a31b55d89b0d6d89b4ff40f SHA512 ace8f6ef41949ed3af2452f7e2aae3fa6a6a48fc4eae3537f2ae3955b82707ff962866c3479ff8f96f6587efbd1f5a2875d4f89240419259f3a93ebd7ab11120
+DIST vivaldi-snapshot_8.0.4033.32-1_arm64.deb 124285208 BLAKE2B 1480037796296daca8efabaac78388a79bfe58f740ee8bdc4393d0ac5154049520ea44fc1ab12f6220518ce5e51e14fedab47fb722114515178d1ed689c6c2ca SHA512 764b987d62a6e085f51cca64d467726d62367ca88a766612265fa2e713ee206bb1566473ff24216e8a299dd1d029c5346bb6c7d01ba12c942a34d4b81752effc
+DIST vivaldi-snapshot_8.1.4057.3-1_amd64.deb 129124744 BLAKE2B 03c9058315d62ac46782ca6c4ebd2e535fbe6db92314735eae5646eaf7113cbac727ffebfdfa106d307417a1d889a476eac0b7038d49a8b7205f80c34305e00e SHA512 590a0c2834791a534dbafd849772c26a65c2e194bacfc8d52b65606ed4d9eaad371984fe68a81c925669ce275c951c8912ee9c40dfaf01b5eb2af74b129461ad
+DIST vivaldi-snapshot_8.1.4057.3-1_arm64.deb 122660768 BLAKE2B 8615393d7343beeef203e215575fef92dcac4c998a1f026573abc8ef810910f2f2f8953bbd1ec75166fcf5c38a569644d2a7135fa03fe13d1985ccbd84e28e07 SHA512 09b853db85726c14a7331f641701b084ecedf26f7fc890d885ee5579c36629904061e51fee4a099f017a7b06b5485b36e3e53656216f724588db60c5728a42fe
diff --git a/www-client/vivaldi-snapshot/metadata.xml b/www-client/vivaldi-snapshot/metadata.xml
index 005b988b8b57..655f883d35a3 100644
--- a/www-client/vivaldi-snapshot/metadata.xml
+++ b/www-client/vivaldi-snapshot/metadata.xml
@@ -15,5 +15,5 @@
<flag name="proprietary-codecs">Use system FFmpeg library to support patent-encumbered media codecs</flag>
<flag name="widevine">Unsupported closed-source DRM capability (required by Netflix VOD)</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/vivaldi-snapshot/vivaldi-snapshot-7.10.4031.3.ebuild b/www-client/vivaldi-snapshot/vivaldi-snapshot-8.0.4033.32.ebuild
index 5c9ee67ee401..5c9ee67ee401 100644
--- a/www-client/vivaldi-snapshot/vivaldi-snapshot-7.10.4031.3.ebuild
+++ b/www-client/vivaldi-snapshot/vivaldi-snapshot-8.0.4033.32.ebuild
diff --git a/www-client/vivaldi-snapshot/vivaldi-snapshot-8.0.4033.7.ebuild b/www-client/vivaldi-snapshot/vivaldi-snapshot-8.1.4057.3.ebuild
index 5c9ee67ee401..5c9ee67ee401 100644
--- a/www-client/vivaldi-snapshot/vivaldi-snapshot-8.0.4033.7.ebuild
+++ b/www-client/vivaldi-snapshot/vivaldi-snapshot-8.1.4057.3.ebuild
diff --git a/www-client/vivaldi/Manifest b/www-client/vivaldi/Manifest
index 829a0ab09a12..b24f3304fc9b 100644
--- a/www-client/vivaldi/Manifest
+++ b/www-client/vivaldi/Manifest
@@ -1,4 +1,4 @@
-DIST vivaldi-stable_7.9.3970.60-1_amd64.deb 128091362 BLAKE2B 49164cc12fd4e8fef0eb537fcae7c774270e6f44e819b44217fbb182bfd35329e9281006144178eff3f60f8701d9ed566ba918808d1cf70f7dbe0e2819268b9f SHA512 74bc6b7887babc3d41ceb0ae4ede9d82e5bf58fa5e86f3b9eb62767251c7355bf9d04002c51aff293ec2d71bb25a8a0a5501e1700b5166e21a2149d9c26bd29c
-DIST vivaldi-stable_7.9.3970.60-1_arm64.deb 121373690 BLAKE2B 559564a7aa2dcb2792ceb6820d3f5ec3b2c0345447a89907f18522cf22303216bd22578987be9c0a01d131674fe00f76af0c577c241a4d3fcbdd5f4848b3252d SHA512 0b9da68145d70ab26f5648246f8ac32040c6bedd3f2cf73d4a797491096b51623bf5cd5b1be4b558cf74b1c84d91c08a4188c6f06d1190b187a7101354a6b868
-DIST vivaldi-stable_7.9.3970.64-1_amd64.deb 128070142 BLAKE2B bae8da4c4e6a1e93ec850863ee799b2b43ee69d833381a69c3afeecc212412c6d4b7b2236a266e210e25cdd4a4770ace63695340fcc082a76afed8ccd9608446 SHA512 87beff1280704346accb85362d39a466baa3426320194a386ff5bb3144770783fdc1f0b854bab10ac4c77c1e5b97f4fa3d219504e131da4d265c7a604dba54f6
-DIST vivaldi-stable_7.9.3970.64-1_arm64.deb 121304702 BLAKE2B 8c37649eb822d87c575722b825ed772da88d16f372c90e3b91bfc757e7c65641934870e53b2cb7e28ee7dfb84742cc5b6062a101b850ae41b3348e2a5232851b SHA512 c6f8ddb3621da6a8f198650cc2aa95b2a677e1184043d1e05340af61c0d130e94eb9a0cb525e24a2960a32afad4346e9cc3e901c291d0212370946b856575d9d
+DIST vivaldi-stable_8.0.4033.34-1_amd64.deb 131015800 BLAKE2B 455ba74c917421afa7f96f5376bdd96480c474d53e4cd1224f1c731c9f091b5363f40cd2b1370fb6a36876bf3977e6290a0eb4ce2d96ec189667380e57591194 SHA512 a05165d255cdc5176335b161485ef5423f1b2a96abf5ffb49df1b32ca6597754191a7941dacce7f1ad27dcdc64afdbc9fa1958ce04997a0b354b267781ad357a
+DIST vivaldi-stable_8.0.4033.34-1_arm64.deb 124338296 BLAKE2B 017ab0366b5c43e3987640a6d60ac522c6d9585833c0ee1764db822742a125cd78ef630ab2ecc3f4c617fe3ae0caabd1c68801a0ee54bdf4496a9d640b801e2e SHA512 6ef243b36cf085edf33e7c21900a97ddfb33e082cd83aed5dbf188a264088e93a68d1b431e75a660e6ac0cd95395ecded4d6ca87fb87c6edf8b4d5fe22c63408
+DIST vivaldi-stable_8.0.4033.35-1_amd64.deb 130869064 BLAKE2B 8d6406eb3034503bdabdc5138ee08550bb6e2122264c6f94f055703075e99809f1f93e15c7f326594e12636ff90df3cdaa702109856f4050fb36a509fb3e5955 SHA512 30ff7d88bce69e80f9076d1d4e8dfc21f0f6cf42773ca3f9eaf3f124ff1cb376eb6afac012bd3711f1ea43b7ede4ee9cb4f2923321c5c80d8757d333433d179a
+DIST vivaldi-stable_8.0.4033.35-1_arm64.deb 124292356 BLAKE2B 146cf447977928a0818fa3e00cdbf11c85c1c4b9d7f5a905917f9d4853259ab539fcd54326b2bfd3012bac9a1b3a0813e138602c59eab75243de27aa54456049 SHA512 201f0782927b86e1dc32da6a65349496a8ae5c67dad9396169e40186e1d2bf2ce7c0df3692200306694e7c46fbfcb0fef496fb2c609623e7d6d879b36f2e191e
diff --git a/www-client/vivaldi/metadata.xml b/www-client/vivaldi/metadata.xml
index 005b988b8b57..655f883d35a3 100644
--- a/www-client/vivaldi/metadata.xml
+++ b/www-client/vivaldi/metadata.xml
@@ -15,5 +15,5 @@
<flag name="proprietary-codecs">Use system FFmpeg library to support patent-encumbered media codecs</flag>
<flag name="widevine">Unsupported closed-source DRM capability (required by Netflix VOD)</flag>
</use>
- <origin>gentoo-staging</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/vivaldi/vivaldi-7.9.3970.60.ebuild b/www-client/vivaldi/vivaldi-8.0.4033.34.ebuild
index f14356935913..bc23a49381c2 100644
--- a/www-client/vivaldi/vivaldi-7.9.3970.60.ebuild
+++ b/www-client/vivaldi/vivaldi-8.0.4033.34.ebuild
@@ -3,7 +3,7 @@
EAPI=8
-CHROMIUM_VERSION="146"
+CHROMIUM_VERSION="148"
CHROMIUM_LANGS="
af
am
diff --git a/www-client/vivaldi/vivaldi-7.9.3970.64.ebuild b/www-client/vivaldi/vivaldi-8.0.4033.35.ebuild
index f14356935913..bc23a49381c2 100644
--- a/www-client/vivaldi/vivaldi-7.9.3970.64.ebuild
+++ b/www-client/vivaldi/vivaldi-8.0.4033.35.ebuild
@@ -3,7 +3,7 @@
EAPI=8
-CHROMIUM_VERSION="146"
+CHROMIUM_VERSION="148"
CHROMIUM_LANGS="
af
am
diff --git a/www-client/w3m/metadata.xml b/www-client/w3m/metadata.xml
index bf02f18e5511..2ffa5b795894 100644
--- a/www-client/w3m/metadata.xml
+++ b/www-client/w3m/metadata.xml
@@ -16,5 +16,5 @@
<flag name="gdk-pixbuf">Enable support for <pkg>x11-libs/gdk-pixbuf</pkg></flag>
<flag name="lynxkeymap">If you prefer Lynx-like key binding</flag>
</use>
- <origin>ports</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/waterfox-bin/Manifest b/www-client/waterfox-bin/Manifest
index 703079f8fb0e..c1fa10abc9d0 100644
--- a/www-client/waterfox-bin/Manifest
+++ b/www-client/waterfox-bin/Manifest
@@ -1 +1 @@
-DIST waterfox-bin-6.6.12.tar.bz2 100473640 BLAKE2B 8e7d2b2a4788b376eec90fc766343d50a0b8066dfa5411ae044f38bef5ab3e26f31206782013511b5e10a4b12c8b6aefb7ba6b15301f839fd6572d16072e1462 SHA512 f7aae05bf262fa560608a5bed1ac884e3b57a249cbac63a4726ed54da52695fe8231b7bd1b318aa41c21158ba13cc42364a23f0f0d923e550e8ac4ef5cb81f4f
+DIST waterfox-bin-6.6.13.tar.bz2 100660202 BLAKE2B 482a4b4724b3029f70fab79d6903fc89b792d9fe530a45c60fd032cad09c3fff029d00d2e73cb3aa5c2d6b8d13800f4c4973736331e09d2bc4114a221a5954ea SHA512 fe4ca8c4525b8c244a33b8ea70087af7d3b41bf27c823483151d802d881431877e6a4c12745475ff2d2487c77485e0c891e09d1d2a183f26cd41a51df1450f29
diff --git a/www-client/waterfox-bin/metadata.xml b/www-client/waterfox-bin/metadata.xml
index b381b2c4313d..d0eb6cd8366a 100644
--- a/www-client/waterfox-bin/metadata.xml
+++ b/www-client/waterfox-bin/metadata.xml
@@ -9,5 +9,5 @@
A privacy focused browser built for power users who value customization and control over their online experience
</longdescription>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/waterfox-bin/waterfox-bin-6.6.12.ebuild b/www-client/waterfox-bin/waterfox-bin-6.6.13.ebuild
index 2c7b765e72c9..2c7b765e72c9 100644
--- a/www-client/waterfox-bin/waterfox-bin-6.6.12.ebuild
+++ b/www-client/waterfox-bin/waterfox-bin-6.6.13.ebuild
diff --git a/www-client/yandex-browser/metadata.xml b/www-client/yandex-browser/metadata.xml
index 0415bc227ab2..9de36440624a 100644
--- a/www-client/yandex-browser/metadata.xml
+++ b/www-client/yandex-browser/metadata.xml
@@ -16,5 +16,5 @@
<use>
<flag name="ffmpeg-codecs">Use <pkg>media-video/ffmpeg-chromium</pkg> for multi-threaded ffmpeg codecs for the HTML5 &lt;audio&gt; and &lt;video&gt; tags</flag>
</use>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/zen-bin/Manifest b/www-client/zen-bin/Manifest
index 27a211104d46..51d4ec7e411c 100644
--- a/www-client/zen-bin/Manifest
+++ b/www-client/zen-bin/Manifest
@@ -1,4 +1,4 @@
-DIST zen-bin-1.18.10b-amd64.tar.xz 86222180 BLAKE2B 49ef1111568b7810430b3c28ff337dc457b380110375c957f3eb7312aaf838acb4e766c3bbae30b875df6b566a2c1770d68dd1d6948a1478a24ab959d4a5d72b SHA512 347b228e20393c88cf98a53c61dfb8c0a28b3775ded17498dc4098bbea4cccd7cbd651d166fb8b40a108ef4f5732e568d570f14091e50e361d021b42441dffb4
-DIST zen-bin-1.18.10b-arm64.tar.xz 74157712 BLAKE2B 0b858c843f83a3c482dbbc3cfd08abab7876f6e05804471aeb4cbb32fbdd3969ac4f53546fe1acd3d9c6db68eaa007b28944ee14163ffc76d3293e66d5069c51 SHA512 d00e12475debadd922ac9e66fbd681613612b153c15a6d64460d27d1e8d21ac32f72f224ddb4375d21ce1560a0424b98a991be272c9cc0c2d0312d10d37170e2
-DIST zen-bin-1.19.12b-amd64.tar.xz 89916828 BLAKE2B e3fdfce66669699ec7c8e13c132fe73fdaf914961e1a742bec7a53653437d336b03b9e2c3e962ca76d97b8d2470e0d09e80ad734b3a14a1597504b81f63a527f SHA512 858bfadbba0b4e9f96e6619c4fdf1b4dfc476bf37f404ce85248d5bffb418d5668f8a89698d489ee068653fd7327e304cc23469cc461b976e900b77b00e49c15
-DIST zen-bin-1.19.12b-arm64.tar.xz 76831612 BLAKE2B 1ceffc1e4bdc31f1dc720c040aa3a6cc77dbb7b1994c59913b8745febe3144cd571fc06ba5a632ce3bf1be4611b7b41209c357f7ed35380c81e320618ea6dd8d SHA512 3e341af5e82272f4063721667b014cf4224de005d14c7162c318f6bc9e0548fc86b3dabb7c9c38369e53e2cbde738f48ffe236e4e83944e79432e4043caad62f
+DIST zen-bin-1.19.13b-amd64.tar.xz 90004576 BLAKE2B 9556fe6848293f6836c769ba86ea92a57802152a5801f537f9a7d40a93a8f955bf4beb9e1acd57cfe508a9785b50061f2be55ccbbc41bf5f415607dd370e3b26 SHA512 8f54290679efbf9e3c17a09df267474959cbebcb5f55d864e48023a86753fd32774f5577ffafbdcad7f465b5ee4eb7ffcebddff783721f356c27bfe75ef58cfe
+DIST zen-bin-1.19.13b-arm64.tar.xz 76901072 BLAKE2B 48e709b258620b6af32968a43118b55087fde557b60c4adbfbc5ef8eab69320114258841553f1cae2501be6b090858251863800c1eb0865c25381725c723d66b SHA512 80962604c1236bdc79987ea97edfe9c4bcdc2349bde3c3843b81ef740f5d11cd0b14607f5f2d03754fac62b3c6b8f3ea68116775c2c85b29705c37e6a2bc8431
+DIST zen-bin-1.20.1b-amd64.tar.xz 90408340 BLAKE2B fc7b43338483b9bfd57c81b83d8130ec155c10de6617e521950156e254bf7347b1b0db17c142f8184b706f3f7d6a6821b1e9623dd8bbe4accab99ba0274f8157 SHA512 8ec169d96877ea13ca0d3c425ca863103f9d82b984a0bab546a40daa9f63ed9c0ee767581e7e835d24b4ab0528205ee1ad80273554cf54e69dad83a4495c632d
+DIST zen-bin-1.20.1b-arm64.tar.xz 77665368 BLAKE2B a6fb2c03df67b419c3a08fa705d6310570af620742b80b189a3d62bb2475f077eb614f7d9024580ff054356ec7b3a29746155e542edb982978fe30ea4655e743 SHA512 14583684bacb2c3b933ae0e3a2adec29aa0ed37d6ca6296d88e59ce42bf9ed01b6226231368a46d28fcd310332c05b8d603a0101f749bef306b8a8ce6d1954bc
diff --git a/www-client/zen-bin/metadata.xml b/www-client/zen-bin/metadata.xml
index 61a5ef4318e1..edfc707221e1 100644
--- a/www-client/zen-bin/metadata.xml
+++ b/www-client/zen-bin/metadata.xml
@@ -17,5 +17,5 @@
Firefox-based privacy oriented browser. Zen offers a wide variety of customizations and is Firefox sync compatible.
</longdescription>
- <origin>gentoo-guru-overlay</origin>
+ <origin>liguros-repo</origin>
</pkgmetadata> \ No newline at end of file
diff --git a/www-client/zen-bin/zen-bin-1.19.12b.ebuild b/www-client/zen-bin/zen-bin-1.19.13b.ebuild
index 2943d041fec5..2943d041fec5 100644
--- a/www-client/zen-bin/zen-bin-1.19.12b.ebuild
+++ b/www-client/zen-bin/zen-bin-1.19.13b.ebuild
diff --git a/www-client/zen-bin/zen-bin-1.18.10b.ebuild b/www-client/zen-bin/zen-bin-1.20.1b.ebuild
index 96e49efd5b8f..2943d041fec5 100644
--- a/www-client/zen-bin/zen-bin-1.18.10b.ebuild
+++ b/www-client/zen-bin/zen-bin-1.20.1b.ebuild
@@ -16,7 +16,7 @@ S="${WORKDIR}/zen"
LICENSE="MPL-2.0"
SLOT="0"
KEYWORDS="-* ~amd64 ~arm64"
-RESTRICT="strip"
+RESTRICT="mirror strip"
QA_PREBUILT="*"
DEPEND="