diff options
| author | root <root@alpha.trunkmasters.com> | 2026-05-31 17:23:40 -0500 |
|---|---|---|
| committer | root <root@alpha.trunkmasters.com> | 2026-05-31 17:23:40 -0500 |
| commit | f953dc70343485250b836ad157649aaad47ac5bc (patch) | |
| tree | e3634b454cf48f10ce9f8d12f10e60ad0a749239 /www-client | |
| parent | 5e07081cf4f5afaef79409b430a018b1daec073e (diff) | |
| download | baldeagleos-repo-f953dc70343485250b836ad157649aaad47ac5bc.tar.gz baldeagleos-repo-f953dc70343485250b836ad157649aaad47ac5bc.tar.xz baldeagleos-repo-f953dc70343485250b836ad157649aaad47ac5bc.zip | |
Adding metadata
Diffstat (limited to 'www-client')
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 <audio> and <video> 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=" |
