From 2c60f118d17cf6dabf759f0026e25767caa9c734 Mon Sep 17 00:00:00 2001 From: Tomas Popela Date: Mon, 24 Jun 2024 10:45:39 +0200 Subject: [PATCH] Revert "firefox package is retired on branch c10s for BAKERY-412" This reverts commit 8d1501a7707c8a398d169de9bbe5b4a60cb7539e. We will need this for RHEL 10 Flatpaks Related: RHEL-24328 --- .gitignore | 619 ++++++++ 0001-GLIBCXX-fix-for-GCC-12.patch | 44 + ...integration-to-Firefox-toolkit-parts.patch | 1343 +++++++++++++++++ 0026-Add-KDE-integration-to-Firefox.patch | 279 ++++ D167159.diff | 132 ++ D168799.diff | 93 ++ D192061.1699444912.diff | 113 ++ D192208.1699444906.diff | 201 +++ bmo-1559213-Support-system-av1.patch | 91 ++ bmo-1559213-fix-system-av1-libs.patch | 22 + build-aarch64-skia.patch | 25 + build-arm-libopus.patch | 12 + build-cacheFlush-missing.patch | 13 + build-ppc-jit.patch | 51 + build-rust-ppc64le.patch | 25 + dead.package | 1 - disable-openh264-download.patch | 36 + distribution.ini | 9 + fedora-customization.patch | 31 + fedora-shebang-build.patch | 9 + firefox-112.0-commasplit.patch | 76 + 21 files changed, 3224 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 0001-GLIBCXX-fix-for-GCC-12.patch create mode 100644 0025-Add-KDE-integration-to-Firefox-toolkit-parts.patch create mode 100644 0026-Add-KDE-integration-to-Firefox.patch create mode 100644 D167159.diff create mode 100644 D168799.diff create mode 100644 D192061.1699444912.diff create mode 100644 D192208.1699444906.diff create mode 100644 bmo-1559213-Support-system-av1.patch create mode 100644 bmo-1559213-fix-system-av1-libs.patch create mode 100644 build-aarch64-skia.patch create mode 100644 build-arm-libopus.patch create mode 100644 build-cacheFlush-missing.patch create mode 100644 build-ppc-jit.patch create mode 100644 build-rust-ppc64le.patch delete mode 100644 dead.package create mode 100644 disable-openh264-download.patch create mode 100644 distribution.ini create mode 100644 fedora-customization.patch create mode 100644 fedora-shebang-build.patch create mode 100644 firefox-112.0-commasplit.patch diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d411f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,619 @@ +firefox-langpacks-3.6.4-20100622.tar.bz2 +firefox-3.6.4.source.tar.bz2 +/firefox-3.6.9.source.tar.bz2 +/firefox-langpacks-3.6.9-20100906.tar.bz2 +/firefox-3.6.11.source.tar.bz2 +/firefox-langpacks-3.6.11-20101019.tar.bz2 +/firefox-3.6.12.source.tar.bz2 +/firefox-langpacks-3.6.12-20101027.tar.bz2 +/firefox-3.6.13.source.tar.bz2 +/firefox-langpacks-3.6.13-20101210.tar.bz2 +/firefox-3.6.14.source.tar.bz2 +/firefox-langpacks-3.6.14-20110301.tar.bz2 +/firefox-3.6.15.source.tar.bz2 +/firefox-langpacks-3.6.15-20110307.tar.bz2 +/firefox-3.6.16.source.tar.bz2 +/firefox-langpacks-3.6.16-20110322.tar.xz +/firefox-langpacks-3.6.17-20110428.tar.xz +/firefox-3.6.17.source.tar.bz2 +/firefox-3.6.18.source.tar.bz2 +/firefox-langpacks-3.6.18-20110621.tar.xz +/firefox-3.6.22.source.tar.bz2 +/firefox-langpacks-3.6.22-20110906.tar.xz +/firefox-langpacks-3.6.20-20110816.tar.xz +/firefox-3.6.20.source.tar.bz2 +/firefox-7.0.source.tar.bz2 +/firefox-langpacks-7.0-20110927.tar.xz +/firefox-7.0.1.source.tar.bz2 +/firefox-langpacks-7.0.1-20110930.tar.xz +/firefox-8.0.source.tar.bz2 +/firefox-langpacks-8.0-20111108.tar.xz +/firefox-9.0b5.source.tar.bz2 +/firefox-langpacks-9.0b5-20111215.tar.xz +/firefox-9.0.source.tar.bz2 +/firefox-langpacks-9.0-20111220.tar.xz +/firefox-9.0.1.source.tar.bz2 +/firefox-langpacks-9.0.1-20111223.tar.xz +/firefox-10.0.source.tar.bz2 +/firefox-langpacks-10.0-20120131.tar.xz +/firefox-10.0.1.source.tar.bz2 +/firefox-langpacks-10.0.1-20120209.tar.xz +/firefox-11.0.source.tar.bz2 +/firefox-langpacks-11.0-20120313.tar.xz +/firefox-12.0.source.tar.bz2 +/firefox-langpacks-12.0-20120424.tar.xz +/firefox-13.0.source.tar.bz2 +/firefox-langpacks-13.0-20120604.tar.xz +/firefox-13.0.1.source.tar.bz2 +/firefox-langpacks-13.0.1-20120616.tar.xz +/firefox-14.0.1.source.tar.bz2 +/firefox-langpacks-14.0.1-20120716.tar.xz +/firefox-15.0.source.tar.bz2 +/firefox-langpacks-15.0-20120827.tar.xz +/firefox-15.0.1.source.tar.bz2 +/firefox-langpacks-15.0.1-20120911.tar.xz +/firefox-16.0.source.tar.bz2 +/firefox-langpacks-16.0-20121008.tar.xz +/firefox-16.0.1.source.tar.bz2 +/firefox-langpacks-16.0.1-20121011.tar.xz +/firefox-16.0.2.source.tar.bz2 +/firefox-langpacks-16.0.2-20121026.tar.xz +/firefox-langpacks-17.0-20121119.tar.xz +/firefox-17.0.source.tar.bz2 +/firefox-17.0.1.source.tar.bz2 +/firefox-langpacks-17.0.1-20121129.tar.xz +/firefox-langpacks-18.0-20130109.tar.xz +/firefox-18.0.source.tar.bz2 +/firefox-18.0.1.source.tar.bz2 +/firefox-langpacks-18.0.1-20130125.tar.xz +/firefox-18.0.2.source.tar.bz2 +/firefox-langpacks-18.0.2-20130206.tar.xz +/firefox-19.0.source.tar.bz2 +/firefox-langpacks-19.0-20130219.tar.xz +/firefox-19.0.2.source.tar.bz2 +/firefox-langpacks-19.0.2-20130311.tar.xz +/firefox-langpacks-20.0-20130401.tar.xz +/firefox-20.0.source.tar.bz2 +/firefox-21.0.source.tar.bz2 +/firefox-langpacks-21.0-20130514.tar.xz +/firefox-22.0.source.tar.bz2 +/firefox-langpacks-22.0-20130621.tar.xz +/firefox-23.0.source.tar.bz2 +/firefox-langpacks-23.0-20130731.tar.xz +/firefox-langpacks-23.0-20130805.tar.xz +/firefox-23.0.1.source.tar.bz2 +/firefox-langpacks-23.0.1-20130819.tar.xz +/firefox-langpacks-24.0-20130913.tar.xz +/firefox-24.0.source.tar.bz2 +/firefox-25.0.source.tar.bz2 +/firefox-langpacks-25.0-20131024.tar.xz +/firefox-langpacks-25.0-20131030.tar.xz +/firefox-26.0.source.tar.bz2 +/firefox-langpacks-26.0-20131209.tar.xz +/firefox-27.0.source.tar.bz2 +/firefox-langpacks-27.0-20140203.tar.xz +/firefox-27.0.1.source.tar.bz2 +/firefox-langpacks-27.0.1-20140224.tar.xz +/firefox-28.0.source.tar.bz2 +/firefox-langpacks-28.0-20140318.tar.xz +/firefox-29.0.source.tar.bz2 +/firefox-langpacks-29.0-20140422.tar.xz +/firefox-29.0.1.source.tar.bz2 +/firefox-langpacks-29.0.1-20140514.tar.xz +/firefox-30.0.source.tar.bz2 +/firefox-langpacks-30.0-20140604.tar.xz +/firefox-31.0.source.tar.bz2 +/firefox-langpacks-31.0-20140717.tar.xz +/firefox-32.0.source.tar.bz2 +/firefox-langpacks-32.0-20140826.tar.xz +/firefox-32.0.1.source.tar.bz2 +/firefox-langpacks-32.0.1-20140915.tar.xz +/firefox-32.0.2.source.tar.bz2 +/firefox-langpacks-32.0.2-20140918.tar.xz +/firefox-langpacks-33.0-20141014.tar.xz +/firefox-33.0.source.tar.bz2 +/firefox-33.1.source.tar.bz2 +/firefox-langpacks-33.1-20141111.tar.xz +/firefox-34.0.source.tar.bz2 +/firefox-langpacks-34.0-20141201.tar.xz +/firefox-35.0.source.tar.bz2 +/firefox-langpacks-35.0-20150106.tar.xz +/firefox-langpacks-35.0-20150109.tar.xz +/firefox-35.0.1.source.tar.bz2 +/firefox-langpacks-35.0.1-20150123.tar.xz +/firefox-36.0.source.tar.bz2 +/firefox-langpacks-36.0-20150220.tar.xz +/firefox-36.0.1.source.tar.bz2 +/firefox-langpacks-36.0.1-20150309.tar.xz +/firefox-36.0.3.source.tar.bz2 +/firefox-langpacks-36.0.3-20150320.tar.xz +/firefox-36.0.4.source.tar.bz2 +/firefox-langpacks-36.0.4-20150321.tar.xz +/firefox-langpacks-37.0-20150327.tar.xz +/firefox-37.0.source.tar.bz2 +/firefox-langpacks-37.0.1-20150407.tar.xz +/firefox-37.0.1.source.tar.bz2 +/firefox-37.0.2.source.tar.bz2 +/firefox-langpacks-37.0.2-20150416.tar.xz +/firefox-38.0.source.tar.bz2 +/firefox-langpacks-38.0-20150505.tar.bz2 +/firefox-langpacks-38.0-20150505.tar.xz +/firefox-langpacks-38.0-20150511.tar.xz +/firefox-38.0.1.source.tar.bz2 +/firefox-langpacks-38.0.1-20150518.tar.xz +/firefox-38.0.5.source.tar.bz2 +/firefox-langpacks-38.0.5-20150603.tar.xz +/firefox-39.0.source.tar.bz2 +/firefox-langpacks-39.0-20150623.tar.xz +/firefox-langpacks-39.0-20150625.tar.xz +/firefox-langpacks-39.0-20150630.tar.xz +/firefox-langpacks-39.0-20150702.tar.xz +/firefox-39.0.3.source.tar.bz2 +/firefox-langpacks-39.0.3-20150806.tar.xz +/firefox-40.0.source.tar.bz2 +/firefox-langpacks-40.0-20150807.tar.xz +/firefox-langpacks-40.0-20150811.tar.xz +/firefox-40.0.3.source.tar.bz2 +/firefox-langpacks-40.0.3-20150827.tar.xz +/firefox-41.0.source.tar.xz +/firefox-langpacks-41.0-20150915.tar.xz +/firefox-langpacks-41.0-20150917.tar.xz +/firefox-langpacks-41.0-20150918.tar.xz +/firefox-langpacks-41.0.1-20150929.tar.xz +/firefox-41.0.1.source.tar.xz +/firefox-langpacks-41.0.1-20150930.tar.xz +/firefox-41.0.2.source.tar.xz +/firefox-langpacks-41.0.2-20151015.tar.xz +/firefox-42.0.source.tar.xz +/firefox-langpacks-42.0-20151029.tar.xz +/firefox-langpacks-42.0-20151030.tar.xz +/firefox-43.0.source.tar.xz +/firefox-langpacks-43.0-20151210.tar.xz +/firefox-43.0.3.source.tar.xz +/firefox-langpacks-43.0.3-20151229.tar.xz +/firefox-43.0.4.source.tar.xz +/firefox-langpacks-43.0.4-20160114.tar.xz +/firefox-44.0.source.tar.xz +/firefox-langpacks-44.0-20160121.tar.xz +/firefox-langpacks-44.0-20160125.tar.xz +/firefox-44.0.1.source.tar.xz +/firefox-langpacks-44.0.1-20160205.tar.xz +/firefox-langpacks-44.0.1-20160208.tar.xz +/firefox-44.0.2.source.tar.xz +/firefox-langpacks-44.0.2-20160210.tar.xz +/firefox-langpacks-44.0.2-20160211.tar.xz +/firefox-45.0.source.tar.xz +/firefox-langpacks-45.0-20160302.tar.xz +/firefox-langpacks-45.0-20160304.tar.xz +/firefox-langpacks-45.0.1-20160316.tar.xz +/firefox-45.0.1.source.tar.xz +/firefox-45.0.2.source.tar.xz +/firefox-langpacks-45.0.2-20160411.tar.xz +/firefox-46.0.source.tar.xz +/firefox-langpacks-46.0-20160425.tar.xz +/firefox-46.0.1.source.tar.xz +/firefox-langpacks-46.0.1-20160503.tar.xz +/firefox-47.0.source.tar.xz +/firefox-langpacks-47.0-20160601.tar.xz +/firefox-langpacks-47.0-20160603.tar.xz +/firefox-langpacks-47.0-20160606.tar.xz +/firefox-47.0.1.source.tar.xz +/firefox-langpacks-47.0.1-20160711.tar.xz +/firefox-langpacks-48.0-20160726.tar.xz +/firefox-48.0.source.tar.xz +/firefox-langpacks-48.0-20160727.tar.xz +/firefox-langpacks-48.0.1-20160819.tar.xz +/firefox-48.0.1.source.tar.xz +/firefox-49.0.source.tar.xz +/firefox-langpacks-49.0-20160906.tar.xz +/firefox-langpacks-49.0-20160908.tar.xz +/firefox-langpacks-49.0-20160919.tar.xz +/firefox-49.0.2.source.tar.xz +/firefox-langpacks-49.0.2-20161031.tar.xz +/firefox-50.0.source.tar.xz +/firefox-langpacks-50.0-20161110.tar.xz +/firefox-50.0.1.source.tar.xz +/firefox-langpacks-50.0.1-20161128.tar.xz +/firefox-50.0.2.source.tar.xz +/firefox-langpacks-50.0.2-20161130.tar.xz +/firefox-50.1.0.source.tar.xz +/firefox-langpacks-50.1.0-20161213.tar.xz +/firefox-51.0.source.tar.xz +/firefox-langpacks-51.0-20170118.tar.xz +/firefox-langpacks-51.0-20170119.tar.xz +/firefox-51.0.1.source.tar.xz +/firefox-langpacks-51.0.1-20170125.tar.xz +/firefox-langpacks-51.0.1-20170126.tar.xz +/firefox-52.0.source.tar.xz +/firefox-langpacks-52.0-20170303.tar.xz +/firefox-52.0.2.source.tar.xz +/firefox-langpacks-52.0.2-20170329.tar.xz +/firefox-53.0.2.source.tar.xz +/firefox-langpacks-53.0.2-20170505.tar.xz +/firefox-53.0.3.source.tar.xz +/firefox-langpacks-53.0.3-20170526.tar.xz +/firefox-54.0.source.tar.xz +/firefox-langpacks-54.0-20170608.tar.xz +/firefox-langpacks-54.0-20170613.tar.xz +/firefox-54.0.1.source.tar.xz +/firefox-langpacks-54.0.1-20170725.tar.xz +/firefox-55.0.source.tar.xz +/firefox-langpacks-55.0-20170802.tar.xz +/firefox-langpacks-55.0-20170807.tar.xz +/firefox-55.0.1.source.tar.xz +/firefox-langpacks-55.0.1-20170814.tar.xz +/firefox-55.0.2.source.tar.xz +/firefox-langpacks-55.0.2-20170818.tar.xz +/firefox-55.0.3.source.tar.xz +/firefox-langpacks-55.0.3-20170901.tar.xz +/firefox-56.0.source.tar.xz +/firefox-langpacks-56.0-20170925.tar.xz +/firefox-langpacks-56.0-20170927.tar.xz +/firefox-57.0b5.source.tar.xz +/firefox-langpacks-57.0b5-20171005.tar.xz +/firefox-57.0b6.source.tar.xz +/firefox-langpacks-57.0b6-20171009.tar.xz +/firefox-57.0b7.source.tar.xz +/firefox-langpacks-57.0b7-20171011.tar.xz +/firefox-57.0b8.source.tar.xz +/firefox-langpacks-57.0b8-20171016.tar.xz +/firefox-57.0b9.source.tar.xz +/firefox-langpacks-57.0b9-20171019.tar.xz +/firefox-57.0b11.source.tar.xz +/firefox-langpacks-57.0b11-20171024.tar.xz +/firefox-57.0b12.source.tar.xz +/firefox-langpacks-57.0b12-20171030.tar.xz +/firefox-57.0b14.source.tar.xz +/firefox-langpacks-57.0b14-20171106.tar.xz +/firefox-57.0.source.tar.xz +/firefox-langpacks-57.0-20171109.tar.xz +/firefox-langpacks-57.0-20171113.tar.xz +/firefox-57.0.1.source.tar.xz +/firefox-langpacks-57.0.1-20171130.tar.xz +/firefox-57.0.3.source.tar.xz +/firefox-langpacks-57.0.3-20180102.tar.xz +/firefox-57.0.4.source.tar.xz +/firefox-langpacks-57.0.4-20180104.tar.xz +/firefox-58.0.source.tar.xz +/firefox-langpacks-58.0-20180123.tar.xz +/firefox-58.0.1.source.tar.xz +/firefox-langpacks-58.0.1-20180130.tar.xz +/2f6a4d2cf42c9d59626061d45c043817cb220814.tar.bz2 +/firefox-langpacks-59.0-20180306.tar.xz +/c61f5f5ead48c78a80c80db5c489bdc7cfaf8175.tar.bz2 +/firefox-langpacks-59.0-20180312.tar.xz +/firefox-langpacks-59.0.1-20180317.tar.xz +/3db9e3d52b17563efca181ccbb50deb8660c59ae.tar.bz2 +/239e434d6d2b8e1e2b697c3416d1e96d48fe98e5.tar.bz2 +/firefox-langpacks-59.0.2-20180327.tar.xz +/firefox-60.0b13.source.tar.xz +/firefox-langpacks-60.0b13-20180418.tar.xz +/firefox-60.0b15.source.tar.xz +/firefox-langpacks-60.0b15-20180426.tar.xz +/firefox-60.0b16.source.tar.xz +/firefox-langpacks-60.0b16-20180427.tar.xz +/firefox-60.0.source.tar.xz +/firefox-langpacks-60.0-20180502.tar.xz +/firefox-langpacks-60.0-20180507.tar.xz +/firefox-60.0.1.source.tar.xz +/firefox-langpacks-60.0.1-20180523.tar.xz +/firefox-60.0.2.source.tar.xz +/firefox-langpacks-60.0.2-20180611.tar.xz +/firefox-61.0.source.tar.xz +/firefox-langpacks-61.0-20180619.tar.xz +/firefox-langpacks-61.0-20180622.tar.xz +/firefox-61.0.1.source.tar.xz +/firefox-langpacks-61.0.1-20180710.tar.xz +/firefox-langpacks-61.0.2-20180809.tar.xz +/firefox-61.0.2.source.tar.xz +/firefox-langpacks-62.0-20180828.tar.xz +/firefox-62.0.source.tar.xz +/firefox-62.0.2.source.tar.xz +/firefox-langpacks-62.0.2-20180924.tar.xz +/firefox-62.0.3.source.tar.xz +/firefox-langpacks-62.0.3-20181002.tar.xz +/firefox-63.0.source.tar.xz +/firefox-langpacks-63.0-20181018.tar.xz +/cbindgen-vendor.tar.xz +/firefox-langpacks-63.0.1-20181101.tar.xz +/firefox-63.0.1.source.tar.xz +/firefox-63.0.3.source.tar.xz +/firefox-langpacks-63.0.3-20181115.tar.xz +/firefox-64.0.source.tar.xz +/firefox-langpacks-64.0-20181204.tar.xz +/firefox-64.0.2.source.tar.xz +/firefox-langpacks-64.0.2-20190110.tar.xz +/firefox-65.0.source.tar.xz +/firefox-langpacks-65.0-20190128.tar.xz +/firefox-65.0.1.source.tar.xz +/firefox-langpacks-65.0.1-20190215.tar.xz +/firefox-65.0.2.source.tar.xz +/firefox-langpacks-65.0.2-20190301.tar.xz +/firefox-66.0.source.tar.xz +/firefox-langpacks-66.0-20190312.tar.xz +/firefox-langpacks-66.0-20190315.tar.xz +/firefox-66.0.1.source.tar.xz +/firefox-langpacks-66.0.1-20190322.tar.xz +/firefox-66.0.2.source.tar.xz +/firefox-langpacks-66.0.2-20190401.tar.xz +/firefox-langpacks-66.0.3-20190410.tar.xz +/firefox-66.0.3.source.tar.xz +/firefox-langpacks-66.0.4-20190505.tar.xz +/firefox-66.0.4.source.tar.xz +/firefox-66.0.5.source.tar.xz +/firefox-langpacks-66.0.5-20190508.tar.xz +/firefox-67.0.source.tar.xz +/firefox-langpacks-67.0-20190515.tar.xz +/firefox-langpacks-67.0-20190517.tar.xz +/firefox-67.0.2.source.tar.xz +/firefox-langpacks-67.0.2-20190611.tar.xz +/firefox-langpacks-67.0.3-20190618.tar.xz +/firefox-67.0.3.source.tar.xz +/firefox-67.0.4.source.tar.xz +/firefox-langpacks-67.0.4-20190620.tar.xz +/firefox-68.0.source.tar.xz +/firefox-langpacks-68.0-20190702.tar.xz +/firefox-langpacks-68.0-20190708.tar.xz +/firefox-68.0.1.source.tar.xz +/firefox-langpacks-68.0.1-20190722.tar.xz +/firefox-68.0.2.source.tar.xz +/firefox-langpacks-68.0.2-20190814.tar.xz +/firefox-69.0.source.tar.xz +/firefox-langpacks-69.0-20190829.tar.xz +/firefox-69.0.1.source.tar.xz +/firefox-langpacks-69.0.1-20190918.tar.xz +/firefox-langpacks-69.0.2-20191003.tar.xz +/firefox-69.0.2.source.tar.xz +/firefox-69.0.3.source.tar.xz +/firefox-langpacks-69.0.3-20191010.tar.xz +/firefox-70.0.source.tar.xz +/firefox-langpacks-70.0-20191018.tar.xz +/firefox-70.0.1.source.tar.xz +/firefox-langpacks-70.0.1-20191101.tar.xz +/firefox-71.0b12.source.tar.xz +/firefox-71.0.source.tar.xz +/firefox-langpacks-71.0-20191126.tar.xz +/firefox-langpacks-71.0-20191202.tar.xz +/firefox-72.0.source.tar.xz +/firefox-langpacks-72.0-20200103.tar.xz +/firefox-langpacks-72.0-20200106.tar.xz +/firefox-72.0.1.source.tar.xz +/firefox-langpacks-72.0.1-20200108.tar.xz +/firefox-72.0.2.source.tar.xz +/firefox-langpacks-72.0.2-20200120.tar.xz +/firefox-73.0.source.tar.xz +/firefox-langpacks-73.0-20200211.tar.xz +/firefox-73.0.1.source.tar.xz +/firefox-langpacks-73.0.1-20200220.tar.xz +/firefox-74.0.source.tar.xz +/firefox-langpacks-74.0-20200303.tar.xz +/firefox-langpacks-74.0-20200309.tar.xz +/firefox-langpacks-74.0-20200310.tar.xz +/firefox-74.0.1.source.tar.xz +/firefox-langpacks-74.0.1-20200404.tar.xz +/firefox-75.0.source.tar.xz +/firefox-langpacks-75.0-20200406.tar.xz +/firefox-76.0.source.tar.xz +/firefox-langpacks-76.0-20200502.tar.xz +/firefox-76.0.1.source.tar.xz +/firefox-langpacks-76.0.1-20200508.tar.xz +/firefox-77.0.source.tar.xz +/firefox-langpacks-77.0-20200529.tar.xz +/firefox-langpacks-77.0-20200602.tar.xz +/firefox-77.0.1.source.tar.xz +/firefox-langpacks-77.0.1-20200603.tar.xz +/firefox-78.0.source.tar.xz +/firefox-langpacks-78.0-20200629.tar.xz +/firefox-78.0.1.source.tar.xz +/firefox-langpacks-78.0.1-20200701.tar.xz +/firefox-78.0.2.source.tar.xz +/firefox-langpacks-78.0.2-20200709.tar.xz +/firefox-79.0.source.tar.xz +/firefox-langpacks-79.0-20200727.tar.xz +/firefox-80.0.source.tar.xz +/firefox-langpacks-80.0-20200818.tar.xz +/firefox-langpacks-80.0-20200820.tar.xz +/firefox-80.0.1.source.tar.xz +/firefox-langpacks-80.0.1-20200901.tar.xz +/firefox-81.0.source.tar.xz +/firefox-langpacks-81.0-20200915.tar.xz +/firefox-langpacks-81.0-20200921.tar.xz +/firefox-81.0.1.source.tar.xz +/firefox-langpacks-81.0.1-20200930.tar.xz +/firefox-81.0.2.source.tar.xz +/firefox-langpacks-81.0.2-20201012.tar.xz +/firefox-82.0.source.tar.xz +/firefox-langpacks-82.0-20201015.tar.xz +/firefox-82.0.1.source.tar.xz +/firefox-langpacks-82.0.1-20201028.tar.xz +/firefox-82.0.2.source.tar.xz +/firefox-langpacks-82.0.2-20201029.tar.xz +/firefox-82.0.3.source.tar.xz +/firefox-langpacks-82.0.3-20201109.tar.xz +/firefox-83.0.source.tar.xz +/firefox-langpacks-83.0-20201112.tar.xz +/firefox-langpacks-83.0-20201116.tar.xz +/firefox-testing.tar.gz +/site-packages.tar.gz +/mochitest-python.tar.gz +/firefox-84.0.source.tar.xz +/firefox-langpacks-84.0-20201210.tar.xz +/firefox-langpacks-84.0-20201214.tar.xz +/firefox-84.0.1.source.tar.xz +/firefox-langpacks-84.0.1-20201222.tar.xz +/firefox-84.0.2.source.tar.xz +/firefox-langpacks-84.0.2-20210106.tar.xz +/firefox-85.0.source.tar.xz +/firefox-langpacks-85.0-20210120.tar.xz +/firefox-85.0.1.source.tar.xz +/firefox-langpacks-85.0.1-20210208.tar.xz +/firefox-86.0.source.tar.xz +/firefox-langpacks-86.0-20210222.tar.xz +/firefox-86.0.1.source.tar.xz +/firefox-langpacks-86.0.1-20210312.tar.xz +/firefox-87.0.source.tar.xz +/firefox-langpacks-87.0-20210322.tar.xz +/firefox-langpacks-88.0-20210419.tar.xz +/firefox-88.0.source.tar.xz +/firefox-88.0.1.source.tar.xz +/firefox-langpacks-88.0.1-20210510.tar.xz +/firefox-langpacks-89.0-20210601.tar.xz +/firefox-89.0.source.tar.xz +/firefox-89.0.2.source.tar.xz +/firefox-langpacks-89.0.2-20210624.tar.xz +/firefox-90.0.source.tar.xz +/firefox-langpacks-90.0-20210712.tar.xz +/firefox-90.0.1.source.tar.xz +/firefox-langpacks-90.0.1-20210721.tar.xz +/firefox-90.0.2.source.tar.xz +/firefox-langpacks-90.0.2-20210722.tar.xz +/firefox-91.0.source.tar.xz +/firefox-langpacks-91.0-20210810.tar.xz +/firefox-91.0.2.source.tar.xz +/firefox-langpacks-91.0.2-20210826.tar.xz +/firefox-langpacks-92.0-20210903.tar.xz +/firefox-92.0.source.tar.xz +/firefox-92.0.1.source.tar.xz +/firefox-langpacks-92.0.1-20210927.tar.xz +/firefox-93.0.source.tar.xz +/firefox-langpacks-93.0-20210929.tar.xz +/firefox-94.0.source.tar.xz +/firefox-langpacks-94.0-20211031.tar.xz +/firefox-94.0.2.source.tar.xz +/firefox-langpacks-94.0.2-20211125.tar.xz +/firefox-95.0.source.tar.xz +/firefox-langpacks-95.0-20211203.tar.xz +/firefox-95.0.2.source.tar.xz +/firefox-langpacks-95.0.2-20211220.tar.xz +/firefox-96.0.source.tar.xz +/firefox-langpacks-96.0-20220111.tar.xz +/firefox-langpacks-96.0.1-20220118.tar.xz +/firefox-96.0.1.source.tar.xz +/firefox-96.0.3.source.tar.xz +/firefox-langpacks-96.0.3-20220131.tar.xz +/firefox-97.0.source.tar.xz +/firefox-langpacks-97.0-20220208.tar.xz +/firefox-97.0.1.source.tar.xz +/firefox-langpacks-97.0.1-20220218.tar.xz +/firefox-98.0.source.tar.xz +/firefox-langpacks-98.0-20220301.tar.xz +/firefox-langpacks-98.0-20220304.tar.xz +/firefox-langpacks-98.0-20220305.tar.xz +/firefox-98.0.2.source.tar.xz +/firefox-langpacks-98.0.2-20220331.tar.xz +/firefox-99.0.source.tar.xz +/firefox-langpacks-99.0-20220331.tar.xz +/firefox-langpacks-99.0.1-20220413.tar.xz +/firefox-99.0.1.source.tar.xz +/firefox-100.0.source.tar.xz +/firefox-langpacks-100.0-20220502.tar.xz +/firefox-100.0.1.source.tar.xz +/firefox-langpacks-100.0.1-20220518.tar.xz +/firefox-100.0.2.source.tar.xz +/firefox-langpacks-100.0.2-20220520.tar.xz +/firefox-101.0.source.tar.xz +/firefox-langpacks-101.0-20220530.tar.xz +/firefox-101.0.1.source.tar.xz +/firefox-langpacks-101.0.1-20220609.tar.xz +/firefox-102.0.source.tar.xz +/firefox-langpacks-102.0-20220628.tar.xz +/firefox-103.0.source.tar.xz +/firefox-langpacks-103.0-20220721.tar.xz +/firefox-103.0.1.source.tar.xz +/firefox-langpacks-103.0.1-20220802.tar.xz +/firefox-103.0.2.source.tar.xz +/firefox-langpacks-103.0.2-20220812.tar.xz +/firefox-104.0.source.tar.xz +/firefox-langpacks-104.0-20220816.tar.xz +/firefox-langpacks-104.0-20220822.tar.xz +/firefox-langpacks-104.0.1-20220830.tar.xz +/firefox-104.0.1.source.tar.xz +/firefox-104.0.2.source.tar.xz +/firefox-langpacks-104.0.2-20220906.tar.xz +/firefox-langpacks-105.0-20220920.tar.xz +/firefox-105.0.source.tar.xz +/firefox-105.0.1.source.tar.xz +/firefox-langpacks-105.0.1-20220922.tar.xz +/firefox-105.0.2.source.tar.xz +/firefox-langpacks-105.0.2-20221005.tar.xz +/firefox-langpacks-106.0-20221014.tar.xz +/firefox-106.0.source.tar.xz +/firefox-106.0.1.source.tar.xz +/firefox-langpacks-106.0.1-20221023.tar.xz +/firefox-106.0.3.source.tar.xz +/firefox-langpacks-106.0.3-20221031.tar.xz +/firefox-langpacks-107.0-20221114.tar.xz +/firefox-107.0.source.tar.xz +/firefox-107.0.1.source.tar.xz +/firefox-langpacks-107.0.1-20221206.tar.xz +/firefox-108.0.source.tar.xz +/firefox-langpacks-108.0-20221206.tar.xz +/firefox-langpacks-108.0-20221214.tar.xz +/firefox-108.0.1.source.tar.xz +/firefox-langpacks-108.0.1-20221218.tar.xz +/firefox-108.0.2.source.tar.xz +/firefox-langpacks-108.0.2-20230112.tar.xz +/firefox-109.0.source.tar.xz +/firefox-langpacks-109.0-20230111.tar.xz +/firefox-109.0.1.source.tar.xz +/firefox-langpacks-109.0.1-20230201.tar.xz +/firefox-110.0.source.tar.xz +/firefox-langpacks-110.0-20230210.tar.xz +/firefox-langpacks-110.0-20230214.tar.xz +/firefox-111.0.source.tar.xz +/firefox-langpacks-111.0-20230320.tar.xz +/firefox-langpacks-111.0.1-20230322.tar.xz +/firefox-111.0.1.source.tar.xz +/firefox-112.0.source.tar.xz +/firefox-langpacks-112.0-20230405.tar.xz +/firefox-langpacks-112.0-20230406.tar.xz +/firefox-langpacks-112.0.1-20230417.tar.xz +/firefox-112.0.1.source.tar.xz +/firefox-langpacks-112.0.2-20230427.tar.xz +/firefox-112.0.2.source.tar.xz +/firefox-langpacks-113.0-20230509.tar.xz +/firefox-113.0.source.tar.xz +/firefox-langpacks-113.0.1-20230515.tar.xz +/firefox-113.0.1.source.tar.xz +/firefox-114.0.source.tar.xz +/firefox-langpacks-114.0-20230605.tar.xz +/firefox-langpacks-114.0.2-20230620.tar.xz +/firefox-114.0.2.source.tar.xz +/firefox-langpacks-115.0-20230629.tar.xz +/firefox-115.0.source.tar.xz +/firefox-langpacks-115.0-20230703.tar.xz +/firefox-115.0.2.source.tar.xz +/firefox-langpacks-115.0.2-20230717.tar.xz +/firefox-116.0.source.tar.xz +/firefox-langpacks-116.0-20230725.tar.xz +/firefox-langpacks-116.0-20230731.tar.xz +/firefox-116.0.1.source.tar.xz +/firefox-langpacks-116.0.1-20230804.tar.xz +/firefox-langpacks-116.0.2-20230807.tar.xz +/firefox-116.0.2.source.tar.xz +/firefox-langpacks-116.0.3-20230817.tar.xz +/firefox-116.0.3.source.tar.xz +/firefox-117.0.source.tar.xz +/firefox-langpacks-117.0-20230828.tar.xz +/firefox-117.0.1.source.tar.xz +/firefox-langpacks-117.0.1-20230913.tar.xz +/firefox-118.0.source.tar.xz +/firefox-langpacks-118.0-20230925.tar.xz +/firefox-langpacks-118.0.1-20230929.tar.xz +/firefox-118.0.1.source.tar.xz +/firefox-118.0.2.source.tar.xz +/firefox-langpacks-118.0.2-20231010.tar.xz +/dump_syms-vendor.tar.xz +/firefox-langpacks-119.0.1-20231110.tar.xz +/firefox-119.0.1.source.tar.xz +/firefox-120.0.source.tar.xz +/firefox-langpacks-120.0-20231114.tar.xz +/firefox-langpacks-120.0-20231120.tar.xz +/firefox-120.0.1.source.tar.xz +/firefox-langpacks-120.0.1-20231201.tar.xz +/firefox-121.0.source.tar.xz +/firefox-langpacks-121.0-20231218.tar.xz +/firefox-121.0.1.source.tar.xz +/firefox-langpacks-121.0.1-20240112.tar.xz +/firefox-122.0.source.tar.xz +/firefox-langpacks-122.0-20240119.tar.xz diff --git a/0001-GLIBCXX-fix-for-GCC-12.patch b/0001-GLIBCXX-fix-for-GCC-12.patch new file mode 100644 index 0000000..37d6f50 --- /dev/null +++ b/0001-GLIBCXX-fix-for-GCC-12.patch @@ -0,0 +1,44 @@ +From efd5bc0715e5477318be95a76811cda0a89e8289 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= +Date: Fri, 4 Mar 2022 12:00:26 +0100 +Subject: [PATCH] GLIBCXX fix for GCC 12? + +--- + build/unix/stdc++compat/stdc++compat.cpp | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/build/unix/stdc++compat/stdc++compat.cpp b/build/unix/stdc++compat/stdc++compat.cpp +index 0180f6bcfa998..8d7a542ff11f0 100644 +--- a/build/unix/stdc++compat/stdc++compat.cpp ++++ b/build/unix/stdc++compat/stdc++compat.cpp +@@ -24,6 +24,7 @@ + GLIBCXX_3.4.27 is from gcc 10 + GLIBCXX_3.4.28 is from gcc 10 + GLIBCXX_3.4.29 is from gcc 11 ++ GLIBCXX_3.4.30 is from gcc 12 + + This file adds the necessary compatibility tricks to avoid symbols with + version GLIBCXX_3.4.20 and bigger, keeping binary compatibility with +@@ -69,6 +70,19 @@ void __attribute__((weak)) __throw_bad_array_new_length() { MOZ_CRASH(); } + } // namespace std + #endif + ++#if _GLIBCXX_RELEASE >= 12 ++namespace std { ++ ++/* This avoids the GLIBCXX_3.4.30 symbol version. */ ++void __attribute__((weak)) ++__glibcxx_assert_fail(const char* __file, int __line, const char* __function, ++ const char* __condition) { ++ MOZ_CRASH(); ++} ++ ++} // namespace std ++#endif ++ + /* While we generally don't build with exceptions, we have some host tools + * that do use them. libstdc++ from GCC 5.0 added exception constructors with + * char const* argument. Older versions only have a constructor with +-- +2.35.1 + diff --git a/0025-Add-KDE-integration-to-Firefox-toolkit-parts.patch b/0025-Add-KDE-integration-to-Firefox-toolkit-parts.patch new file mode 100644 index 0000000..bd543b3 --- /dev/null +++ b/0025-Add-KDE-integration-to-Firefox-toolkit-parts.patch @@ -0,0 +1,1343 @@ +diff -up firefox-119.0/modules/libpref/moz.build.integration firefox-119.0/modules/libpref/moz.build +--- firefox-119.0/modules/libpref/moz.build.integration 2023-10-19 21:54:34.000000000 +0200 ++++ firefox-119.0/modules/libpref/moz.build 2023-10-31 08:59:03.719124766 +0100 +@@ -126,6 +126,10 @@ UNIFIED_SOURCES += [ + "SharedPrefMap.cpp", + ] + ++LOCAL_INCLUDES += [ ++ '/toolkit/xre' ++] ++ + gen_all_tuple = tuple(gen_h + gen_cpp + gen_rs) + + GeneratedFile( +diff -up firefox-119.0/modules/libpref/Preferences.cpp.integration firefox-119.0/modules/libpref/Preferences.cpp +--- firefox-119.0/modules/libpref/Preferences.cpp.integration 2023-10-19 21:54:34.000000000 +0200 ++++ firefox-119.0/modules/libpref/Preferences.cpp 2023-10-31 08:59:03.719124766 +0100 +@@ -95,6 +95,7 @@ + #ifdef MOZ_BACKGROUNDTASKS + # include "mozilla/BackgroundTasks.h" + #endif ++#include "nsKDEUtils.h" + + #ifdef DEBUG + # include +diff -up firefox-119.0/python/mozbuild/mozpack/chrome/flags.py.integration firefox-119.0/python/mozbuild/mozpack/chrome/flags.py +--- firefox-119.0/python/mozbuild/mozpack/chrome/flags.py.integration 2023-10-19 21:54:34.000000000 +0200 ++++ firefox-119.0/python/mozbuild/mozpack/chrome/flags.py 2023-10-31 08:59:03.719124766 +0100 +@@ -234,6 +234,7 @@ class Flags(OrderedDict): + "tablet": Flag, + "process": StringFlag, + "backgroundtask": StringFlag, ++ "desktop": StringFlag, + } + RE = re.compile(r"([!<>=]+)") + +diff -up firefox-119.0/python/mozbuild/mozpack/chrome/manifest.py.integration firefox-119.0/python/mozbuild/mozpack/chrome/manifest.py +--- firefox-119.0/python/mozbuild/mozpack/chrome/manifest.py.integration 2023-10-19 21:54:34.000000000 +0200 ++++ firefox-119.0/python/mozbuild/mozpack/chrome/manifest.py 2023-10-31 08:59:03.719124766 +0100 +@@ -43,6 +43,7 @@ class ManifestEntry(object): + "process", + "contentaccessible", + "backgroundtask", ++ "desktop", + ] + + def __init__(self, base, *flags): +diff -up firefox-119.0/toolkit/components/downloads/moz.build.integration firefox-119.0/toolkit/components/downloads/moz.build +--- firefox-119.0/toolkit/components/downloads/moz.build.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/toolkit/components/downloads/moz.build 2023-10-31 08:59:03.720124801 +0100 +@@ -51,5 +51,9 @@ if CONFIG["MOZ_PLACES"]: + + FINAL_LIBRARY = "xul" + ++LOCAL_INCLUDES += [ ++ '/toolkit/xre' ++] ++ + with Files("**"): + BUG_COMPONENT = ("Toolkit", "Downloads API") +diff -up firefox-119.0/toolkit/mozapps/downloads/HelperAppDlg.sys.mjs.integration firefox-119.0/toolkit/mozapps/downloads/HelperAppDlg.sys.mjs +--- firefox-119.0/toolkit/mozapps/downloads/HelperAppDlg.sys.mjs.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/toolkit/mozapps/downloads/HelperAppDlg.sys.mjs 2023-10-31 08:59:03.720124801 +0100 +@@ -1246,26 +1246,56 @@ nsUnknownContentTypeDialog.prototype = { + this.chosenApp = params.handlerApp; + } + } else if ("@mozilla.org/applicationchooser;1" in Cc) { +- var nsIApplicationChooser = Ci.nsIApplicationChooser; +- var appChooser = Cc["@mozilla.org/applicationchooser;1"].createInstance( +- nsIApplicationChooser +- ); +- appChooser.init( +- this.mDialog, +- this.dialogElement("strings").getString("chooseAppFilePickerTitle") +- ); +- var contentTypeDialogObj = this; +- let appChooserCallback = function appChooserCallback_done(aResult) { +- if (aResult) { +- contentTypeDialogObj.chosenApp = aResult.QueryInterface( +- Ci.nsILocalHandlerApp +- ); +- } +- contentTypeDialogObj.finishChooseApp(); +- }; +- appChooser.open(this.mLauncher.MIMEInfo.MIMEType, appChooserCallback); +- // The finishChooseApp is called from appChooserCallback +- return; ++ // handle the KDE case which is implemented in the filepicker ++ // therefore falling back to Gtk2 like behaviour if KDE is running ++ // FIXME this should be better handled in the nsIApplicationChooser ++ // interface ++ var env = Components.classes["@mozilla.org/process/environment;1"] ++ .getService(Components.interfaces.nsIEnvironment); ++ if (env.get('KDE_FULL_SESSION') == "true") ++ { ++ var nsIFilePicker = Ci.nsIFilePicker; ++ var fp = Cc["@mozilla.org/filepicker;1"] ++ .createInstance(nsIFilePicker); ++ fp.init(this.mDialog, ++ this.dialogElement("strings").getString("chooseAppFilePickerTitle"), ++ nsIFilePicker.modeOpen); ++ ++ fp.appendFilters(nsIFilePicker.filterApps); ++ ++ fp.open(aResult => { ++ if (aResult == nsIFilePicker.returnOK && fp.file) { ++ // Remember the file they chose to run. ++ var localHandlerApp = ++ Cc["@mozilla.org/uriloader/local-handler-app;1"]. ++ createInstance(Ci.nsILocalHandlerApp); ++ localHandlerApp.executable = fp.file; ++ this.chosenApp = localHandlerApp; ++ } ++ this.finishChooseApp(); ++ }); ++ } else { ++ var nsIApplicationChooser = Ci.nsIApplicationChooser; ++ var appChooser = Cc["@mozilla.org/applicationchooser;1"].createInstance( ++ nsIApplicationChooser ++ ); ++ appChooser.init( ++ this.mDialog, ++ this.dialogElement("strings").getString("chooseAppFilePickerTitle") ++ ); ++ var contentTypeDialogObj = this; ++ let appChooserCallback = function appChooserCallback_done(aResult) { ++ if (aResult) { ++ contentTypeDialogObj.chosenApp = aResult.QueryInterface( ++ Ci.nsILocalHandlerApp ++ ); ++ } ++ contentTypeDialogObj.finishChooseApp(); ++ }; ++ appChooser.open(this.mLauncher.MIMEInfo.MIMEType, appChooserCallback); ++ // The finishChooseApp is called from appChooserCallback ++ return; ++ } + } else { + var nsIFilePicker = Ci.nsIFilePicker; + var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); +diff -up firefox-119.0/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp.integration firefox-119.0/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp +--- firefox-119.0/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp 2023-10-31 08:59:03.720124801 +0100 +@@ -16,6 +16,8 @@ + #include "nsISupportsPrimitives.h" + #include "nsIGSettingsService.h" + #include "nsReadableUtils.h" ++#include "nsPrintfCString.h" ++#include "nsKDEUtils.h" + + using namespace mozilla; + +@@ -39,6 +41,8 @@ class nsUnixSystemProxySettings final : + nsACString& aResult); + nsresult SetProxyResultFromGSettings(const char* aKeyBase, const char* aType, + nsACString& aResult); ++ nsresult GetProxyFromKDE(const nsACString& aScheme, const nsACString& aHost, ++ PRInt32 aPort, nsACString& aResult); + }; + + NS_IMPL_ISUPPORTS(nsUnixSystemProxySettings, nsISystemProxySettings) +@@ -393,6 +397,9 @@ nsresult nsUnixSystemProxySettings::GetP + const nsACString& aHost, + const int32_t aPort, + nsACString& aResult) { ++ if (nsKDEUtils::kdeSupport()) ++ return GetProxyFromKDE(aScheme, aHost, aPort, aResult); ++ + if (mProxySettings) { + nsresult rv = GetProxyFromGSettings(aScheme, aHost, aPort, aResult); + if (NS_SUCCEEDED(rv)) return rv; +@@ -401,6 +408,28 @@ nsresult nsUnixSystemProxySettings::GetP + return GetProxyFromEnvironment(aScheme, aHost, aPort, aResult); + } + ++nsresult nsUnixSystemProxySettings::GetProxyFromKDE(const nsACString& aScheme, ++ const nsACString& aHost, ++ PRInt32 aPort, ++ nsACString& aResult) { ++ nsAutoCString url; ++ url = aScheme; ++ url += "://"; ++ url += aHost; ++ if (aPort >= 0) { ++ url += ":"; ++ url += nsPrintfCString("%d", aPort); ++ } ++ nsTArray command; ++ command.AppendElement("GETPROXY"_ns); ++ command.AppendElement(url); ++ nsTArray result; ++ if (!nsKDEUtils::command(command, &result) || result.Length() != 1) ++ return NS_ERROR_FAILURE; ++ aResult = result[0]; ++ return NS_OK; ++} ++ + NS_IMPL_COMPONENT_FACTORY(nsUnixSystemProxySettings) { + auto result = MakeRefPtr(); + result->Init(); +diff -up firefox-119.0/toolkit/xre/moz.build.integration firefox-119.0/toolkit/xre/moz.build +--- firefox-119.0/toolkit/xre/moz.build.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/toolkit/xre/moz.build 2023-10-31 08:59:03.720124801 +0100 +@@ -96,7 +96,9 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "ui + "UIKitDirProvider.mm", + ] + elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": ++ EXPORTS += ['nsKDEUtils.h'] + UNIFIED_SOURCES += [ ++ "nsKDEUtils.cpp", + "nsNativeAppSupportUnix.cpp", + ] + CXXFLAGS += CONFIG["MOZ_X11_SM_CFLAGS"] +diff -up firefox-119.0/toolkit/xre/nsKDEUtils.cpp.integration firefox-119.0/toolkit/xre/nsKDEUtils.cpp +--- firefox-119.0/toolkit/xre/nsKDEUtils.cpp.integration 2023-10-31 08:59:03.721124836 +0100 ++++ firefox-119.0/toolkit/xre/nsKDEUtils.cpp 2023-10-31 08:59:03.721124836 +0100 +@@ -0,0 +1,286 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#include "nsKDEUtils.h" ++#include "nsIWidget.h" ++#include "nsISupportsPrimitives.h" ++#include "nsIMutableArray.h" ++#include "nsComponentManagerUtils.h" ++#include "nsArrayUtils.h" ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++// copied from X11/X.h as a hack since for an unknown ++// reason it's not picked up from X11/X.h ++#ifndef None ++# define None 0L /* universal null resource or null atom */ ++#endif ++ ++// #define DEBUG_KDE ++#ifdef DEBUG_KDE ++# define KMOZILLAHELPER "kmozillahelper" ++#else ++// not need for lib64, it's a binary ++# define KMOZILLAHELPER "/usr/lib/mozilla/kmozillahelper" ++#endif ++ ++#define KMOZILLAHELPER_VERSION 6 ++#define MAKE_STR2(n) #n ++#define MAKE_STR(n) MAKE_STR2(n) ++ ++static bool getKdeSession() { ++ if (PR_GetEnv("KDE_FULL_SESSION")) { ++ return true; ++ } ++ return false; ++} ++ ++static bool getKdeSupport() { ++ nsTArray command; ++ command.AppendElement("CHECK"_ns); ++ command.AppendElement("KMOZILLAHELPER_VERSION"_ns); ++ bool kde = nsKDEUtils::command(command); ++#ifdef DEBUG_KDE ++ fprintf(stderr, "KDE RUNNING %d\n", kde); ++#endif ++ return kde; ++} ++ ++nsKDEUtils::nsKDEUtils() : commandFile(NULL), replyFile(NULL) {} ++ ++nsKDEUtils::~nsKDEUtils() { ++ // closeHelper(); not actually useful, exiting will close the fd too ++} ++ ++nsKDEUtils* nsKDEUtils::self() { ++ static nsKDEUtils s; ++ return &s; ++} ++ ++static bool helperRunning = false; ++static bool helperFailed = false; ++ ++bool nsKDEUtils::kdeSession() { ++ static bool session = getKdeSession(); ++ return session; ++} ++ ++bool nsKDEUtils::kdeSupport() { ++ static bool support = kdeSession() && getKdeSupport(); ++ return support && helperRunning; ++} ++ ++struct nsKDECommandData { ++ FILE* file; ++ nsTArray* output; ++ GMainLoop* loop; ++ bool success; ++}; ++ ++static gboolean kdeReadFunc(GIOChannel*, GIOCondition, gpointer data) { ++ nsKDECommandData* p = static_cast(data); ++ char buf[8192]; // TODO big enough ++ bool command_done = false; ++ bool command_failed = false; ++ while (!command_done && !command_failed && ++ fgets(buf, 8192, p->file) != ++ NULL) { // TODO what if the kernel splits a line into two chunks? ++ // #ifdef DEBUG_KDE ++ // fprintf( stderr, "READ: %s %d\n", buf, feof( p->file )); ++ // #endif ++ if (char* eol = strchr(buf, '\n')) *eol = '\0'; ++ command_done = (strcmp(buf, "\\1") == 0); ++ command_failed = (strcmp(buf, "\\0") == 0); ++ nsAutoCString line(buf); ++ line.ReplaceSubstring("\\n", "\n"); ++ line.ReplaceSubstring( ++ "\\" ++ "\\", ++ "\\"); // \\ -> \ , i.e. unescape ++ if (p->output && !(command_done || command_failed)) ++ p->output->AppendElement(nsCString(buf)); // TODO utf8? ++ } ++ bool quit = false; ++ if (feof(p->file) || command_failed) { ++ quit = true; ++ p->success = false; ++ } ++ if (command_done) { // reading one reply finished ++ quit = true; ++ p->success = true; ++ } ++ if (quit) { ++ if (p->loop) g_main_loop_quit(p->loop); ++ return FALSE; ++ } ++ return TRUE; ++} ++ ++bool nsKDEUtils::command(const nsTArray& command, ++ nsTArray* output) { ++ return self()->internalCommand(command, NULL, false, output); ++} ++ ++bool nsKDEUtils::command(nsIArray* command, nsIArray** output) { ++ nsTArray in; ++ PRUint32 length; ++ command->GetLength(&length); ++ for (PRUint32 i = 0; i < length; i++) { ++ nsCOMPtr str = do_QueryElementAt(command, i); ++ if (str) { ++ nsAutoCString s; ++ str->GetData(s); ++ in.AppendElement(s); ++ } ++ } ++ ++ nsTArray out; ++ bool ret = self()->internalCommand(in, NULL, false, &out); ++ ++ if (!output) return ret; ++ ++ nsCOMPtr result = do_CreateInstance(NS_ARRAY_CONTRACTID); ++ if (!result) return false; ++ ++ for (PRUint32 i = 0; i < out.Length(); i++) { ++ nsCOMPtr rstr = ++ do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID); ++ if (!rstr) return false; ++ ++ rstr->SetData(out[i]); ++ result->AppendElement(rstr); ++ } ++ ++ NS_ADDREF(*output = result); ++ return ret; ++} ++ ++bool nsKDEUtils::commandBlockUi(const nsTArray& command, ++ GtkWindow* parent, ++ nsTArray* output) { ++ return self()->internalCommand(command, parent, true, output); ++} ++ ++bool nsKDEUtils::internalCommand(const nsTArray& command, ++ GtkWindow* parent, bool blockUi, ++ nsTArray* output) { ++ if (!startHelper()) return false; ++ feedCommand(command); ++ // do not store the data in 'this' but in extra structure, just in case there ++ // is reentrancy (can there be? the event loop is re-entered) ++ nsKDECommandData data; ++ data.file = replyFile; ++ data.output = output; ++ data.success = false; ++ if (blockUi) { ++ data.loop = g_main_loop_new(NULL, FALSE); ++ GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); ++ if (parent && gtk_window_get_group(parent)) ++ gtk_window_group_add_window(gtk_window_get_group(parent), ++ GTK_WINDOW(window)); ++ gtk_widget_realize(window); ++ gtk_widget_set_sensitive(window, TRUE); ++ gtk_grab_add(window); ++ GIOChannel* channel = g_io_channel_unix_new(fileno(data.file)); ++ g_io_add_watch(channel, ++ static_cast(G_IO_IN | G_IO_ERR | G_IO_HUP), ++ kdeReadFunc, &data); ++ g_io_channel_unref(channel); ++ g_main_loop_run(data.loop); ++ g_main_loop_unref(data.loop); ++ gtk_grab_remove(window); ++ gtk_widget_destroy(window); ++ } else { ++ data.loop = NULL; ++ while (kdeReadFunc(NULL, static_cast(0), &data)) ++ ; ++ } ++ return data.success; ++} ++ ++bool nsKDEUtils::startHelper() { ++ if (helperRunning) return true; ++ if (helperFailed) return false; ++ helperFailed = true; ++ int fdcommand[2]; ++ int fdreply[2]; ++ if (pipe(fdcommand) < 0) return false; ++ if (pipe(fdreply) < 0) { ++ close(fdcommand[0]); ++ close(fdcommand[1]); ++ return false; ++ } ++ char* args[2] = {const_cast(KMOZILLAHELPER), NULL}; ++ switch (fork()) { ++ case -1: { ++ close(fdcommand[0]); ++ close(fdcommand[1]); ++ close(fdreply[0]); ++ close(fdreply[1]); ++ return false; ++ } ++ case 0: // child ++ { ++ if (dup2(fdcommand[0], STDIN_FILENO) < 0) _exit(1); ++ if (dup2(fdreply[1], STDOUT_FILENO) < 0) _exit(1); ++ int maxfd = 1024; // close all other fds ++ struct rlimit rl; ++ if (getrlimit(RLIMIT_NOFILE, &rl) == 0) maxfd = rl.rlim_max; ++ for (int i = 3; i < maxfd; ++i) close(i); ++#ifdef DEBUG_KDE ++ execvp(KMOZILLAHELPER, args); ++#else ++ execv(KMOZILLAHELPER, args); ++#endif ++ _exit(1); // failed ++ } ++ default: // parent ++ { ++ commandFile = fdopen(fdcommand[1], "w"); ++ replyFile = fdopen(fdreply[0], "r"); ++ close(fdcommand[0]); ++ close(fdreply[1]); ++ if (commandFile == NULL || replyFile == NULL) { ++ closeHelper(); ++ return false; ++ } ++ // ok, helper ready, getKdeRunning() will check if it works ++ } ++ } ++ helperFailed = false; ++ helperRunning = true; ++ return true; ++} ++ ++void nsKDEUtils::closeHelper() { ++ if (commandFile != NULL) ++ fclose(commandFile); // this will also make the helper quit ++ if (replyFile != NULL) fclose(replyFile); ++ helperRunning = false; ++} ++ ++void nsKDEUtils::feedCommand(const nsTArray& command) { ++ for (int i = 0; i < command.Length(); ++i) { ++ nsCString line = command[i]; ++ line.ReplaceSubstring("\\", ++ "\\" ++ "\\"); // \ -> \\ , i.e. escape ++ line.ReplaceSubstring("\n", "\\n"); ++#ifdef DEBUG_KDE ++ fprintf(stderr, "COMM: %s\n", line.get()); ++#endif ++ fputs(line.get(), commandFile); ++ fputs("\n", commandFile); ++ } ++ fputs("\\E\n", ++ commandFile); // done as \E, so it cannot happen in normal data ++ fflush(commandFile); ++} +diff -up firefox-119.0/toolkit/xre/nsKDEUtils.h.integration firefox-119.0/toolkit/xre/nsKDEUtils.h +--- firefox-119.0/toolkit/xre/nsKDEUtils.h.integration 2023-10-31 08:59:03.721124836 +0100 ++++ firefox-119.0/toolkit/xre/nsKDEUtils.h 2023-10-31 08:59:03.721124836 +0100 +@@ -0,0 +1,53 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#ifndef nsKDEUtils_h__ ++#define nsKDEUtils_h__ ++ ++#include "nsString.h" ++#include "nsTArray.h" ++#include ++ ++typedef struct _GtkWindow GtkWindow; ++ ++class nsIArray; ++ ++class NS_EXPORT nsKDEUtils { ++ public: ++ /* Returns true if running inside a KDE session (regardless of whether there ++ is KDE support available for Firefox). This should be used e.g. when ++ determining dialog button order but not for code that requires the KDE ++ support. */ ++ static bool kdeSession(); ++ /* Returns true if running inside a KDE session and KDE support is available ++ for Firefox. This should be used everywhere where the external helper is ++ needed. */ ++ static bool kdeSupport(); ++ /* Executes the given helper command, returns true if helper returned success. ++ */ ++ static bool command(const nsTArray& command, ++ nsTArray* output = NULL); ++ static bool command(nsIArray* command, nsIArray** output = NULL); ++ /* Like command(), but additionally blocks the parent widget like if there was ++ a modal dialog shown and enters the event loop (i.e. there are still paint ++ updates, this is for commands that take long). */ ++ static bool commandBlockUi(const nsTArray& command, ++ GtkWindow* parent, ++ nsTArray* output = NULL); ++ ++ private: ++ nsKDEUtils(); ++ ~nsKDEUtils(); ++ static nsKDEUtils* self(); ++ bool startHelper(); ++ void closeHelper(); ++ void feedCommand(const nsTArray& command); ++ bool internalCommand(const nsTArray& command, GtkWindow* parent, ++ bool isParent, nsTArray* output); ++ FILE* commandFile; ++ FILE* replyFile; ++}; ++ ++#endif // nsKDEUtils +diff -up firefox-119.0/uriloader/exthandler/HandlerServiceParent.cpp.integration firefox-119.0/uriloader/exthandler/HandlerServiceParent.cpp +--- firefox-119.0/uriloader/exthandler/HandlerServiceParent.cpp.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/uriloader/exthandler/HandlerServiceParent.cpp 2023-10-31 08:59:03.721124836 +0100 +@@ -18,7 +18,7 @@ + #include "nsComponentManagerUtils.h" + #include "nsServiceManagerUtils.h" + #ifdef MOZ_WIDGET_GTK +-# include "unix/nsGNOMERegistry.h" ++# include "unix/nsCommonRegistry.h" + #endif + + using mozilla::dom::ContentHandlerService; +@@ -310,8 +310,8 @@ mozilla::ipc::IPCResult HandlerServicePa + } + #ifdef MOZ_WIDGET_GTK + // Check the GNOME registry for a protocol handler +- *aHandlerExists = +- nsGNOMERegistry::HandlerExists(PromiseFlatCString(aProtocolScheme).get()); ++ *aHandlerExists = nsCommonRegistry::HandlerExists( ++ PromiseFlatCString(aProtocolScheme).get()); + #else + *aHandlerExists = false; + #endif +diff -up firefox-119.0/uriloader/exthandler/moz.build.integration firefox-119.0/uriloader/exthandler/moz.build +--- firefox-119.0/uriloader/exthandler/moz.build.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/uriloader/exthandler/moz.build 2023-10-31 08:59:03.721124836 +0100 +@@ -86,7 +86,9 @@ else: + + if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": + UNIFIED_SOURCES += [ ++ "unix/nsCommonRegistry.cpp", + "unix/nsGNOMERegistry.cpp", ++ "unix/nsKDERegistry.cpp", + "unix/nsMIMEInfoUnix.cpp", + ] + elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "android": +@@ -134,6 +136,7 @@ LOCAL_INCLUDES += [ + "/dom/ipc", + "/netwerk/base", + "/netwerk/protocol/http", ++ "/toolkit/xre", + ] + + if CONFIG["MOZ_ENABLE_DBUS"]: +diff -up firefox-119.0/uriloader/exthandler/unix/nsCommonRegistry.cpp.integration firefox-119.0/uriloader/exthandler/unix/nsCommonRegistry.cpp +--- firefox-119.0/uriloader/exthandler/unix/nsCommonRegistry.cpp.integration 2023-10-31 08:59:03.721124836 +0100 ++++ firefox-119.0/uriloader/exthandler/unix/nsCommonRegistry.cpp 2023-10-31 08:59:03.721124836 +0100 +@@ -0,0 +1,42 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#include "nsCommonRegistry.h" ++ ++#include "nsGNOMERegistry.h" ++#include "nsKDERegistry.h" ++#include "nsString.h" ++#include "nsKDEUtils.h" ++ ++/* static */ bool nsCommonRegistry::HandlerExists(const char* aProtocolScheme) { ++ if (nsKDEUtils::kdeSupport()) ++ return nsKDERegistry::HandlerExists(aProtocolScheme); ++ return nsGNOMERegistry::HandlerExists(aProtocolScheme); ++} ++ ++/* static */ nsresult nsCommonRegistry::LoadURL(nsIURI* aURL) { ++ if (nsKDEUtils::kdeSupport()) return nsKDERegistry::LoadURL(aURL); ++ return nsGNOMERegistry::LoadURL(aURL); ++} ++ ++/* static */ void nsCommonRegistry::GetAppDescForScheme( ++ const nsACString& aScheme, nsAString& aDesc) { ++ if (nsKDEUtils::kdeSupport()) ++ return nsKDERegistry::GetAppDescForScheme(aScheme, aDesc); ++ return nsGNOMERegistry::GetAppDescForScheme(aScheme, aDesc); ++} ++ ++/* static */ already_AddRefed ++nsCommonRegistry::GetFromExtension(const nsACString& aFileExt) { ++ if (nsKDEUtils::kdeSupport()) ++ return nsKDERegistry::GetFromExtension(aFileExt); ++ return nsGNOMERegistry::GetFromExtension(aFileExt); ++} ++ ++/* static */ already_AddRefed nsCommonRegistry::GetFromType( ++ const nsACString& aMIMEType) { ++ if (nsKDEUtils::kdeSupport()) return nsKDERegistry::GetFromType(aMIMEType); ++ return nsGNOMERegistry::GetFromType(aMIMEType); ++} +diff -up firefox-119.0/uriloader/exthandler/unix/nsCommonRegistry.h.integration firefox-119.0/uriloader/exthandler/unix/nsCommonRegistry.h +--- firefox-119.0/uriloader/exthandler/unix/nsCommonRegistry.h.integration 2023-10-31 08:59:03.721124836 +0100 ++++ firefox-119.0/uriloader/exthandler/unix/nsCommonRegistry.h 2023-10-31 08:59:03.721124836 +0100 +@@ -0,0 +1,28 @@ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#ifndef nsCommonRegistry_h__ ++#define nsCommonRegistry_h__ ++ ++#include "nsIURI.h" ++#include "nsCOMPtr.h" ++ ++class nsMIMEInfoBase; ++ ++class nsCommonRegistry { ++ public: ++ static bool HandlerExists(const char* aProtocolScheme); ++ ++ static nsresult LoadURL(nsIURI* aURL); ++ ++ static void GetAppDescForScheme(const nsACString& aScheme, nsAString& aDesc); ++ ++ static already_AddRefed GetFromExtension( ++ const nsACString& aFileExt); ++ ++ static already_AddRefed GetFromType( ++ const nsACString& aMIMEType); ++}; ++ ++#endif +diff -up firefox-119.0/uriloader/exthandler/unix/nsKDERegistry.cpp.integration firefox-119.0/uriloader/exthandler/unix/nsKDERegistry.cpp +--- firefox-119.0/uriloader/exthandler/unix/nsKDERegistry.cpp.integration 2023-10-31 08:59:03.722124870 +0100 ++++ firefox-119.0/uriloader/exthandler/unix/nsKDERegistry.cpp 2023-10-31 08:59:03.722124870 +0100 +@@ -0,0 +1,75 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#include "mozilla/StaticPrefs_browser.h" ++#include "nsKDERegistry.h" ++#include "prlink.h" ++#include "prmem.h" ++#include "nsString.h" ++#include "nsMIMEInfoUnix.h" ++#include "nsKDEUtils.h" ++ ++/* static */ bool nsKDERegistry::HandlerExists(const char* aProtocolScheme) { ++ nsTArray command; ++ command.AppendElement("HANDLEREXISTS"_ns); ++ command.AppendElement(nsAutoCString(aProtocolScheme)); ++ return nsKDEUtils::command(command); ++} ++ ++/* static */ nsresult nsKDERegistry::LoadURL(nsIURI* aURL) { ++ nsTArray command; ++ command.AppendElement("OPEN"_ns); ++ nsCString url; ++ aURL->GetSpec(url); ++ command.AppendElement(url); ++ bool rv = nsKDEUtils::command(command); ++ if (!rv) return NS_ERROR_FAILURE; ++ ++ return NS_OK; ++} ++ ++/* static */ void nsKDERegistry::GetAppDescForScheme(const nsACString& aScheme, ++ nsAString& aDesc) { ++ nsTArray command; ++ command.AppendElement("GETAPPDESCFORSCHEME"_ns); ++ command.AppendElement(aScheme); ++ nsTArray output; ++ if (nsKDEUtils::command(command, &output) && output.Length() == 1) ++ CopyUTF8toUTF16(output[0], aDesc); ++} ++ ++/* static */ already_AddRefed nsKDERegistry::GetFromExtension( ++ const nsACString& aFileExt) { ++ NS_ASSERTION(aFileExt[0] != '.', "aFileExt shouldn't start with a dot"); ++ nsTArray command; ++ command.AppendElement("GETFROMEXTENSION"_ns); ++ command.AppendElement(aFileExt); ++ return GetFromHelper(command); ++} ++ ++/* static */ already_AddRefed nsKDERegistry::GetFromType( ++ const nsACString& aMIMEType) { ++ nsTArray command; ++ command.AppendElement("GETFROMTYPE"_ns); ++ command.AppendElement(aMIMEType); ++ return GetFromHelper(command); ++} ++ ++/* static */ already_AddRefed nsKDERegistry::GetFromHelper( ++ const nsTArray& command) { ++ nsTArray output; ++ if (nsKDEUtils::command(command, &output) && output.Length() == 3) { ++ nsCString mimetype = output[0]; ++ RefPtr mimeInfo = new nsMIMEInfoUnix(mimetype); ++ NS_ENSURE_TRUE(mimeInfo, nullptr); ++ nsCString description = output[1]; ++ mimeInfo->SetDescription(NS_ConvertUTF8toUTF16(description)); ++ nsCString handlerAppName = output[2]; ++ mimeInfo->SetPreferredAction(nsIMIMEInfo::saveToDisk); ++ mimeInfo->SetDefaultDescription(NS_ConvertUTF8toUTF16(handlerAppName)); ++ return mimeInfo.forget(); ++ } ++ return nullptr; ++} +diff -up firefox-119.0/uriloader/exthandler/unix/nsKDERegistry.h.integration firefox-119.0/uriloader/exthandler/unix/nsKDERegistry.h +--- firefox-119.0/uriloader/exthandler/unix/nsKDERegistry.h.integration 2023-10-31 08:59:03.722124870 +0100 ++++ firefox-119.0/uriloader/exthandler/unix/nsKDERegistry.h 2023-10-31 08:59:03.722124870 +0100 +@@ -0,0 +1,35 @@ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#ifndef nsKDERegistry_h__ ++#define nsKDERegistry_h__ ++ ++#include "nsIURI.h" ++#include "nsCOMPtr.h" ++#include "nsTArray.h" ++ ++class nsMIMEInfoBase; ++// class nsAutoCString; ++// class nsCString; ++ ++class nsKDERegistry { ++ public: ++ static bool HandlerExists(const char* aProtocolScheme); ++ ++ static nsresult LoadURL(nsIURI* aURL); ++ ++ static void GetAppDescForScheme(const nsACString& aScheme, nsAString& aDesc); ++ ++ static already_AddRefed GetFromExtension( ++ const nsACString& aFileExt); ++ ++ static already_AddRefed GetFromType( ++ const nsACString& aMIMEType); ++ ++ private: ++ static already_AddRefed GetFromHelper( ++ const nsTArray& command); ++}; ++ ++#endif // nsKDERegistry_h__ +diff -up firefox-119.0/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp.integration firefox-119.0/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp +--- firefox-119.0/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp 2023-10-31 08:59:03.722124870 +0100 +@@ -5,16 +5,19 @@ + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + #include "nsMIMEInfoUnix.h" +-#include "nsGNOMERegistry.h" ++#include "nsCommonRegistry.h" + #include "nsIGIOService.h" + #include "nsNetCID.h" + #include "nsIIOService.h" + #ifdef MOZ_ENABLE_DBUS + # include "nsDBusHandlerApp.h" + #endif ++#if defined(XP_UNIX) && !defined(XP_MACOSX) ++# include "nsKDEUtils.h" ++#endif + + nsresult nsMIMEInfoUnix::LoadUriInternal(nsIURI* aURI) { +- return nsGNOMERegistry::LoadURL(aURI); ++ return nsCommonRegistry::LoadURL(aURI); + } + + NS_IMETHODIMP +@@ -29,15 +32,15 @@ nsMIMEInfoUnix::GetHasDefaultHandler(boo + *_retval = false; + + if (mClass == eProtocolInfo) { +- *_retval = nsGNOMERegistry::HandlerExists(mSchemeOrType.get()); ++ *_retval = nsCommonRegistry::HandlerExists(mSchemeOrType.get()); + } else { + RefPtr mimeInfo = +- nsGNOMERegistry::GetFromType(mSchemeOrType); ++ nsCommonRegistry::GetFromType(mSchemeOrType); + if (!mimeInfo) { + nsAutoCString ext; + nsresult rv = GetPrimaryExtension(ext); + if (NS_SUCCEEDED(rv)) { +- mimeInfo = nsGNOMERegistry::GetFromExtension(ext); ++ mimeInfo = nsCommonRegistry::GetFromExtension(ext); + } + } + if (mimeInfo) *_retval = true; +@@ -59,6 +62,21 @@ nsresult nsMIMEInfoUnix::LaunchDefaultWi + nsAutoCString nativePath; + aFile->GetNativePath(nativePath); + ++ if (nsKDEUtils::kdeSupport()) { ++ bool supports; ++ if (NS_SUCCEEDED(GetHasDefaultHandler(&supports)) && supports) { ++ nsTArray command; ++ command.AppendElement("OPEN"_ns); ++ command.AppendElement(nativePath); ++ command.AppendElement("MIMETYPE"_ns); ++ command.AppendElement(mSchemeOrType); ++ if (nsKDEUtils::command(command)) return NS_OK; ++ } ++ if (!GetDefaultApplication()) return NS_ERROR_FILE_NOT_FOUND; ++ ++ return LaunchWithIProcess(GetDefaultApplication(), nativePath); ++ } ++ + nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); + if (!giovfs) { + return NS_ERROR_FAILURE; +diff -up firefox-119.0/uriloader/exthandler/unix/nsOSHelperAppService.cpp.integration firefox-119.0/uriloader/exthandler/unix/nsOSHelperAppService.cpp +--- firefox-119.0/uriloader/exthandler/unix/nsOSHelperAppService.cpp.integration 2023-10-19 21:54:42.000000000 +0200 ++++ firefox-119.0/uriloader/exthandler/unix/nsOSHelperAppService.cpp 2023-10-31 08:59:03.722124870 +0100 +@@ -10,7 +10,7 @@ + #include "nsOSHelperAppService.h" + #include "nsMIMEInfoUnix.h" + #ifdef MOZ_WIDGET_GTK +-# include "nsGNOMERegistry.h" ++# include "nsCommonRegistry.h" + # ifdef MOZ_BUILD_APP_IS_BROWSER + # include "nsIToolkitShellService.h" + # include "nsIGNOMEShellService.h" +@@ -1106,7 +1106,7 @@ nsresult nsOSHelperAppService::OSProtoco + if (!XRE_IsContentProcess()) { + #ifdef MOZ_WIDGET_GTK + // Check the GNOME registry for a protocol handler +- *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme); ++ *aHandlerExists = nsCommonRegistry::HandlerExists(aProtocolScheme); + #else + *aHandlerExists = false; + #endif +@@ -1126,7 +1126,7 @@ nsresult nsOSHelperAppService::OSProtoco + NS_IMETHODIMP nsOSHelperAppService::GetApplicationDescription( + const nsACString& aScheme, nsAString& _retval) { + #ifdef MOZ_WIDGET_GTK +- nsGNOMERegistry::GetAppDescForScheme(aScheme, _retval); ++ nsCommonRegistry::GetAppDescForScheme(aScheme, _retval); + return _retval.IsEmpty() ? NS_ERROR_NOT_AVAILABLE : NS_OK; + #else + return NS_ERROR_NOT_AVAILABLE; +@@ -1231,7 +1231,7 @@ already_AddRefed nsOSHel + #ifdef MOZ_WIDGET_GTK + LOG("Looking in GNOME registry\n"); + RefPtr gnomeInfo = +- nsGNOMERegistry::GetFromExtension(aFileExt); ++ nsCommonRegistry::GetFromExtension(aFileExt); + if (gnomeInfo) { + LOG("Got MIMEInfo from GNOME registry\n"); + return gnomeInfo.forget(); +@@ -1344,7 +1344,7 @@ already_AddRefed nsOSHel + + #ifdef MOZ_WIDGET_GTK + if (handler.IsEmpty()) { +- RefPtr gnomeInfo = nsGNOMERegistry::GetFromType(aMIMEType); ++ RefPtr gnomeInfo = nsCommonRegistry::GetFromType(aMIMEType); + if (gnomeInfo) { + LOG("Got MIMEInfo from GNOME registry without extensions; setting them " + "to %s\n", +diff -up firefox-119.0/widget/gtk/moz.build.integration firefox-119.0/widget/gtk/moz.build +--- firefox-119.0/widget/gtk/moz.build.integration 2023-10-31 08:59:03.704124244 +0100 ++++ firefox-119.0/widget/gtk/moz.build 2023-10-31 08:59:03.723124906 +0100 +@@ -161,6 +161,7 @@ LOCAL_INCLUDES += [ + "/layout/xul", + "/other-licenses/atk-1.0", + "/third_party/cups/include", ++ "/toolkit/xre", + "/widget", + "/widget/headless", + "/widget/x11", +diff -up firefox-119.0/widget/gtk/nsFilePicker.cpp.integration firefox-119.0/widget/gtk/nsFilePicker.cpp +--- firefox-119.0/widget/gtk/nsFilePicker.cpp.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/widget/gtk/nsFilePicker.cpp 2023-10-31 08:59:03.723124906 +0100 +@@ -5,6 +5,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -30,6 +31,8 @@ + #include "WidgetUtilsGtk.h" + + #include "nsFilePicker.h" ++#include "nsKDEUtils.h" ++#include "nsURLHelper.h" + + #undef LOG + #ifdef MOZ_LOGGING +@@ -310,7 +313,8 @@ NS_IMETHODIMP + nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter) { + if (aFilter.EqualsLiteral("..apps")) { + // No platform specific thing we can do here, really.... +- return NS_OK; ++ // Unless it's KDE. ++ if (mMode != modeOpen || !nsKDEUtils::kdeSupport()) return NS_OK; + } + + nsAutoCString filter, name; +@@ -420,6 +424,31 @@ nsFilePicker::Open(nsIFilePickerShownCal + // Can't show two dialogs concurrently with the same filepicker + if (mRunning) return NS_ERROR_NOT_AVAILABLE; + ++ // KDE file picker is not handled via callback ++ if (nsKDEUtils::kdeSupport()) { ++ mCallback = aCallback; ++ mRunning = true; ++ NS_ADDREF_THIS(); ++ g_idle_add( ++ [](gpointer data) -> gboolean { ++ nsFilePicker* queuedPicker = (nsFilePicker*)data; ++ nsIFilePicker::ResultCode result; ++ queuedPicker->kdeFileDialog(&result); ++ if (queuedPicker->mCallback) { ++ queuedPicker->mCallback->Done(result); ++ queuedPicker->mCallback = nullptr; ++ } else { ++ queuedPicker->mResult = result; ++ } ++ queuedPicker->mRunning = false; ++ NS_RELEASE(queuedPicker); ++ return G_SOURCE_REMOVE; ++ }, ++ this); ++ ++ return NS_OK; ++ } ++ + NS_ConvertUTF16toUTF8 title(mTitle); + + GtkWindow* parent_widget = +@@ -701,6 +730,205 @@ void nsFilePicker::Done(void* file_choos + NS_RELEASE_THIS(); + } + ++nsCString nsFilePicker::kdeMakeFilter(int index) { ++ nsCString buf = mFilters[index]; ++ for (PRUint32 i = 0; i < buf.Length(); ++i) ++ if (buf[i] == ';') // KDE separates just using spaces ++ buf.SetCharAt(' ', i); ++ if (!mFilterNames[index].IsEmpty()) { ++ buf += "|"; ++ buf += mFilterNames[index].get(); ++ } ++ return buf; ++} ++ ++static PRInt32 windowToXid(nsIWidget* widget) { ++ GtkWindow* parent_widget = ++ GTK_WINDOW(widget->GetNativeData(NS_NATIVE_SHELLWIDGET)); ++ GdkWindow* gdk_window = ++ gtk_widget_get_window(gtk_widget_get_toplevel(GTK_WIDGET(parent_widget))); ++ return GDK_WINDOW_XID(gdk_window); ++} ++ ++NS_IMETHODIMP nsFilePicker::kdeFileDialog(nsIFilePicker::ResultCode* aReturn) { ++ NS_ENSURE_ARG_POINTER(aReturn); ++ ++ if (mMode == modeOpen && mFilters.Length() == 1 && ++ mFilters[0].EqualsLiteral("..apps")) ++ return kdeAppsDialog(aReturn); ++ ++ nsCString title; ++ title.Adopt(ToNewUTF8String(mTitle)); ++ ++ const char* arg = NULL; ++ if (mAllowURLs) { ++ switch (mMode) { ++ case nsIFilePicker::modeOpen: ++ case nsIFilePicker::modeOpenMultiple: ++ arg = "GETOPENURL"; ++ break; ++ case nsIFilePicker::modeSave: ++ arg = "GETSAVEURL"; ++ break; ++ case nsIFilePicker::modeGetFolder: ++ arg = "GETDIRECTORYURL"; ++ break; ++ } ++ } else { ++ switch (mMode) { ++ case nsIFilePicker::modeOpen: ++ case nsIFilePicker::modeOpenMultiple: ++ arg = "GETOPENFILENAME"; ++ break; ++ case nsIFilePicker::modeSave: ++ arg = "GETSAVEFILENAME"; ++ break; ++ case nsIFilePicker::modeGetFolder: ++ arg = "GETDIRECTORYFILENAME"; ++ break; ++ } ++ } ++ ++ nsAutoCString directory; ++ if (mDisplayDirectory) { ++ mDisplayDirectory->GetNativePath(directory); ++ } else if (mPrevDisplayDirectory) { ++ mPrevDisplayDirectory->GetNativePath(directory); ++ } ++ ++ nsAutoCString startdir; ++ if (!directory.IsEmpty()) { ++ startdir = directory; ++ } ++ if (mMode == nsIFilePicker::modeSave) { ++ if (!startdir.IsEmpty()) { ++ startdir += "/"; ++ startdir += ToNewUTF8String(mDefault); ++ } else ++ startdir = ToNewUTF8String(mDefault); ++ } ++ ++ nsAutoCString filters; ++ PRInt32 count = mFilters.Length(); ++ if (count == 0) // just in case ++ filters = "*"; ++ else { ++ filters = kdeMakeFilter(0); ++ for (PRInt32 i = 1; i < count; ++i) { ++ filters += "\n"; ++ filters += kdeMakeFilter(i); ++ } ++ } ++ ++ nsTArray command; ++ command.AppendElement(nsAutoCString(arg)); ++ command.AppendElement(startdir); ++ if (mMode != nsIFilePicker::modeGetFolder) { ++ command.AppendElement(filters); ++ nsAutoCString selected; ++ selected.AppendInt(mSelectedType); ++ command.AppendElement(selected); ++ } ++ command.AppendElement(title); ++ if (mMode == nsIFilePicker::modeOpenMultiple) ++ command.AppendElement("MULTIPLE"_ns); ++ if (PRInt32 xid = windowToXid(mParentWidget)) { ++ command.AppendElement("PARENT"_ns); ++ nsAutoCString parent; ++ parent.AppendInt(xid); ++ command.AppendElement(parent); ++ } ++ ++ nsTArray output; ++ if (nsKDEUtils::commandBlockUi( ++ command, ++ GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)), ++ &output)) { ++ *aReturn = nsIFilePicker::returnOK; ++ mFiles.Clear(); ++ if (mMode != nsIFilePicker::modeGetFolder) { ++ mSelectedType = atoi(output[0].get()); ++ output.RemoveElementAt(0); ++ } ++ if (mMode == nsIFilePicker::modeOpenMultiple) { ++ mFileURL.Truncate(); ++ PRUint32 count = output.Length(); ++ for (PRUint32 i = 0; i < count; ++i) { ++ nsCOMPtr localfile; ++ nsresult rv = NS_NewNativeLocalFile(output[i], PR_FALSE, ++ getter_AddRefs(localfile)); ++ if (NS_SUCCEEDED(rv)) mFiles.AppendObject(localfile); ++ } ++ } else { ++ if (output.Length() == 0) ++ mFileURL = nsCString(); ++ else if (mAllowURLs) ++ mFileURL = output[0]; ++ else // GetFile() actually requires it to be url even for local files :-/ ++ { ++ nsCOMPtr localfile; ++ nsresult rv = NS_NewNativeLocalFile(output[0], PR_FALSE, ++ getter_AddRefs(localfile)); ++ if (NS_SUCCEEDED(rv)) ++ rv = net_GetURLSpecFromActualFile(localfile, mFileURL); ++ } ++ } ++ // Remember last used directory. ++ nsCOMPtr file; ++ GetFile(getter_AddRefs(file)); ++ if (file) { ++ nsCOMPtr dir; ++ file->GetParent(getter_AddRefs(dir)); ++ nsCOMPtr localDir(dir); ++ if (localDir) { ++ localDir.swap(mPrevDisplayDirectory); ++ } ++ } ++ if (mMode == nsIFilePicker::modeSave) { ++ nsCOMPtr file; ++ GetFile(getter_AddRefs(file)); ++ if (file) { ++ bool exists = false; ++ file->Exists(&exists); ++ if (exists) // TODO do overwrite check in the helper app ++ *aReturn = nsIFilePicker::returnReplace; ++ } ++ } ++ } else { ++ *aReturn = nsIFilePicker::returnCancel; ++ } ++ return NS_OK; ++} ++ ++NS_IMETHODIMP nsFilePicker::kdeAppsDialog(nsIFilePicker::ResultCode* aReturn) { ++ NS_ENSURE_ARG_POINTER(aReturn); ++ ++ nsCString title; ++ title.Adopt(ToNewUTF8String(mTitle)); ++ ++ nsTArray command; ++ command.AppendElement("APPSDIALOG"_ns); ++ command.AppendElement(title); ++ if (PRInt32 xid = windowToXid(mParentWidget)) { ++ command.AppendElement("PARENT"_ns); ++ nsAutoCString parent; ++ parent.AppendInt(xid); ++ command.AppendElement(parent); ++ } ++ ++ nsTArray output; ++ if (nsKDEUtils::commandBlockUi( ++ command, ++ GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)), ++ &output)) { ++ *aReturn = nsIFilePicker::returnOK; ++ mFileURL = output.Length() > 0 ? output[0] : nsCString(); ++ } else { ++ *aReturn = nsIFilePicker::returnCancel; ++ } ++ return NS_OK; ++} ++ + // All below functions available as of GTK 3.20+ + void* nsFilePicker::GtkFileChooserNew(const gchar* title, GtkWindow* parent, + GtkFileChooserAction action, +diff -up firefox-119.0/widget/gtk/nsFilePicker.h.integration firefox-119.0/widget/gtk/nsFilePicker.h +--- firefox-119.0/widget/gtk/nsFilePicker.h.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/widget/gtk/nsFilePicker.h 2023-10-31 08:59:03.723124906 +0100 +@@ -76,6 +76,12 @@ class nsFilePicker : public nsBaseFilePi + private: + static nsIFile* mPrevDisplayDirectory; + ++ bool kdeRunning(); ++ bool getKdeRunning(); ++ NS_IMETHODIMP kdeFileDialog(nsIFilePicker::ResultCode* aReturn); ++ NS_IMETHODIMP kdeAppsDialog(nsIFilePicker::ResultCode* aReturn); ++ nsCString kdeMakeFilter(int index); ++ + void* GtkFileChooserNew(const gchar* title, GtkWindow* parent, + GtkFileChooserAction action, + const gchar* accept_label); +diff -up firefox-119.0/xpcom/components/ManifestParser.cpp.integration firefox-119.0/xpcom/components/ManifestParser.cpp +--- firefox-119.0/xpcom/components/ManifestParser.cpp.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/xpcom/components/ManifestParser.cpp 2023-10-31 08:59:03.723124906 +0100 +@@ -43,6 +43,7 @@ + #include "nsIScriptError.h" + #include "nsIXULAppInfo.h" + #include "nsIXULRuntime.h" ++#include "nsKDEUtils.h" + + using namespace mozilla; + +@@ -394,6 +395,7 @@ void ParseManifest(NSLocationType aType, + constexpr auto kOs = u"os"_ns; + constexpr auto kOsVersion = u"osversion"_ns; + constexpr auto kABI = u"abi"_ns; ++ constexpr auto kDesktop = u"desktop"_ns; + constexpr auto kProcess = u"process"_ns; + #if defined(MOZ_WIDGET_ANDROID) + constexpr auto kTablet = u"tablet"_ns; +@@ -453,6 +455,7 @@ void ParseManifest(NSLocationType aType, + } + + nsAutoString osVersion; ++ nsAutoString desktop; + #if defined(XP_WIN) + # pragma warning(push) + # pragma warning(disable : 4996) // VC12+ deprecates GetVersionEx +@@ -461,14 +464,17 @@ void ParseManifest(NSLocationType aType, + nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", info.dwMajorVersion, + info.dwMinorVersion); + } ++ desktop = u"win"_ns; + # pragma warning(pop) + #elif defined(MOZ_WIDGET_COCOA) + SInt32 majorVersion = nsCocoaFeatures::macOSVersionMajor(); + SInt32 minorVersion = nsCocoaFeatures::macOSVersionMinor(); + nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", majorVersion, minorVersion); ++ desktop = u"macosx"_ns); + #elif defined(MOZ_WIDGET_GTK) + nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", gtk_major_version, + gtk_minor_version); ++ desktop = nsKDEUtils::kdeSession() ? u"kde"_ns : u"gnome"_ns; + #elif defined(MOZ_WIDGET_ANDROID) + bool isTablet = false; + if (jni::IsAvailable()) { +@@ -476,6 +482,7 @@ void ParseManifest(NSLocationType aType, + osVersion.Assign(release->ToString()); + isTablet = java::GeckoAppShell::IsTablet(); + } ++ desktop = u"android"_ns; + #endif + + if (XRE_IsContentProcess()) { +@@ -576,6 +583,7 @@ void ParseManifest(NSLocationType aType, + : eUnspecified; + #endif + int flags = 0; ++ TriState stDesktop = eUnspecified; + + while ((token = nsCRT::strtok(whitespace, kWhitespace, &whitespace)) && + ok) { +@@ -585,6 +593,7 @@ void ParseManifest(NSLocationType aType, + if (CheckStringFlag(kApplication, wtoken, appID, stApp) || + CheckOsFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kABI, wtoken, abi, stABI) || ++ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || + CheckStringFlag(kProcess, wtoken, process, stProcess) || + CheckVersionFlag(kOsVersion, wtoken, osVersion, stOsVersion) || + CheckVersionFlag(kAppVersion, wtoken, appVersion, stAppVersion) || +@@ -644,6 +653,7 @@ void ParseManifest(NSLocationType aType, + + if (!ok || stApp == eBad || stAppVersion == eBad || + stGeckoVersion == eBad || stOs == eBad || stOsVersion == eBad || ++ stDesktop == eBad || + #ifdef MOZ_WIDGET_ANDROID + stTablet == eBad || + #endif +diff -up firefox-119.0/xpcom/components/moz.build.integration firefox-119.0/xpcom/components/moz.build +--- firefox-119.0/xpcom/components/moz.build.integration 2023-10-19 21:54:44.000000000 +0200 ++++ firefox-119.0/xpcom/components/moz.build 2023-10-31 08:59:03.723124906 +0100 +@@ -71,6 +71,7 @@ LOCAL_INCLUDES += [ + "/js/xpconnect/loader", + "/layout/build", + "/modules/libjar", ++ "/toolkit/xre", + ] + + if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": +diff -up firefox-119.0/xpcom/io/nsLocalFileUnix.cpp.integration firefox-119.0/xpcom/io/nsLocalFileUnix.cpp +--- firefox-119.0/xpcom/io/nsLocalFileUnix.cpp.integration 2023-10-19 21:54:43.000000000 +0200 ++++ firefox-119.0/xpcom/io/nsLocalFileUnix.cpp 2023-10-31 08:59:03.724124940 +0100 +@@ -51,6 +51,7 @@ + + #ifdef MOZ_WIDGET_GTK + # include "nsIGIOService.h" ++# include "nsKDEUtils.h" + #endif + + #ifdef MOZ_WIDGET_COCOA +@@ -2172,10 +2173,18 @@ nsLocalFile::Reveal() { + } + + #ifdef MOZ_WIDGET_GTK ++ nsAutoCString url; + nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); +- if (!giovfs) { +- return NS_ERROR_FAILURE; ++ url = mPath; ++ if (nsKDEUtils::kdeSupport()) { ++ nsTArray command; ++ command.AppendElement("REVEAL"_ns); ++ command.AppendElement(mPath); ++ return nsKDEUtils::command(command) ? NS_OK : NS_ERROR_FAILURE; + } ++ ++ if (!giovfs) return NS_ERROR_FAILURE; ++ + return giovfs->RevealFile(this); + #elif defined(MOZ_WIDGET_COCOA) + CFURLRef url; +@@ -2197,6 +2206,13 @@ nsLocalFile::Launch() { + } + + #ifdef MOZ_WIDGET_GTK ++ if (nsKDEUtils::kdeSupport()) { ++ nsTArray command; ++ command.AppendElement("OPEN"_ns); ++ command.AppendElement(mPath); ++ return nsKDEUtils::command(command) ? NS_OK : NS_ERROR_FAILURE; ++ } ++ + nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); + if (!giovfs) { + return NS_ERROR_FAILURE; diff --git a/0026-Add-KDE-integration-to-Firefox.patch b/0026-Add-KDE-integration-to-Firefox.patch new file mode 100644 index 0000000..1e2e938 --- /dev/null +++ b/0026-Add-KDE-integration-to-Firefox.patch @@ -0,0 +1,279 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Sirringhaus +Date: Tue, 8 Aug 2023 16:18:24 +0300 +Subject: [PATCH] Add KDE integration to Firefox + +Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751 +Bug: https://bugzilla.suse.com/show_bug.cgi?id=170055 + +How to apply this patch: + +1. Import and apply it +2. cp browser/base/content/browser.xul browser/base/content/browser-kde.xul +3. Find editBookmarkPanelDoneButton +4. Replace #ifndef with #ifdef in the line above (this hanges the button order from Gnome-style to KDE-style) +5. hg qrefresh +--- + browser/components/preferences/main.js | 18 +++ + browser/components/shell/moz.build | 2 + + .../components/shell/nsKDEShellService.cpp | 109 ++++++++++++++++++ + browser/components/shell/nsKDEShellService.h | 32 +++++ + .../components/shell/nsUnixShellService.cpp | 22 ++++ + browser/components/shell/nsUnixShellService.h | 15 +++ + 6 files changed, 198 insertions(+) + create mode 100644 browser/components/shell/nsKDEShellService.cpp + create mode 100644 browser/components/shell/nsKDEShellService.h + create mode 100644 browser/components/shell/nsUnixShellService.cpp + create mode 100644 browser/components/shell/nsUnixShellService.h + +diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js +index 820e46fb006567bfdf93e2a46da5e3c07d42bf10..57d1c21bdecc2d55d0bed30246e684d3b97ad7fa 100644 +--- a/browser/components/preferences/main.js ++++ b/browser/components/preferences/main.js +@@ -294,6 +294,13 @@ var gMainPane = { + }, backoffTimes[this._backoffIndex]); + } + ++ var env = Components.classes["@mozilla.org/process/environment;1"] ++ .getService(Components.interfaces.nsIEnvironment); ++ var kde_session = 0; ++ if (env.get('KDE_FULL_SESSION') == "true") { ++ kde_session = 1; ++ } ++ + this.initBrowserContainers(); + this.buildContentProcessCountMenuList(); + +@@ -1727,6 +1734,17 @@ var gMainPane = { + } + try { + shellSvc.setDefaultBrowser(true, false); ++ if (kde_session == 1) { ++ var shellObj = Components.classes["@mozilla.org/file/local;1"] ++ .createInstance(Components.interfaces.nsILocalFile); ++ shellObj.initWithPath("/usr/bin/kwriteconfig"); ++ var process = Components.classes["@mozilla.org/process/util;1"] ++ .createInstance(Components.interfaces.nsIProcess); ++ process.init(shellObj); ++ var args = ["--file", "kdeglobals", "--group", "General", "--key", ++ "BrowserApplication", "firefox"]; ++ process.run(false, args, args.length); ++ } + } catch (ex) { + console.error(ex); + return; +diff --git a/browser/components/shell/moz.build b/browser/components/shell/moz.build +index eb88cb287dc3f04022b74b978666118bbd5fa6b2..95277533781a7224d108e3c45731a6d9a89ba1a0 100644 +--- a/browser/components/shell/moz.build ++++ b/browser/components/shell/moz.build +@@ -36,6 +36,8 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": + + SOURCES += [ + "nsGNOMEShellService.cpp", ++ "nsKDEShellService.cpp", ++ "nsUnixShellService.cpp", + ] + if CONFIG["MOZ_ENABLE_DBUS"]: + SOURCES += [ +diff --git a/browser/components/shell/nsKDEShellService.cpp b/browser/components/shell/nsKDEShellService.cpp +new file mode 100644 +index 0000000000000000000000000000000000000000..152a3aca87ea73477bc75c4e93c01e5a52dda102 +--- /dev/null ++++ b/browser/components/shell/nsKDEShellService.cpp +@@ -0,0 +1,109 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#include "mozilla/ArrayUtils.h" ++ ++#include "nsCOMPtr.h" ++#include "nsKDEShellService.h" ++#include "nsShellService.h" ++#include "nsKDEUtils.h" ++#include "nsIPrefService.h" ++#include "nsIProcess.h" ++#include "nsIFile.h" ++#include "nsServiceManagerUtils.h" ++#include "nsComponentManagerUtils.h" ++#include "nsIMutableArray.h" ++#include "nsISupportsPrimitives.h" ++#include "nsArrayUtils.h" ++ ++using namespace mozilla; ++ ++nsresult ++nsKDEShellService::Init() ++{ ++ if( !nsKDEUtils::kdeSupport()) ++ return NS_ERROR_NOT_AVAILABLE; ++ return NS_OK; ++} ++ ++NS_IMPL_ISUPPORTS(nsKDEShellService, nsIGNOMEShellService, nsIShellService) ++ ++NS_IMETHODIMP ++nsKDEShellService::IsDefaultBrowser(bool aForAllTypes, ++ bool* aIsDefaultBrowser) ++{ ++ *aIsDefaultBrowser = false; ++ ++ nsCOMPtr command = do_CreateInstance( NS_ARRAY_CONTRACTID ); ++ if (!command) ++ return NS_ERROR_FAILURE; ++ ++ nsCOMPtr str = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID ); ++ if (!str) ++ return NS_ERROR_FAILURE; ++ ++ str->SetData("ISDEFAULTBROWSER"_ns); ++ command->AppendElement( str ); ++ ++ if( nsKDEUtils::command( command )) ++ *aIsDefaultBrowser = true; ++ return NS_OK; ++} ++ ++NS_IMETHODIMP ++nsKDEShellService::SetDefaultBrowser(bool aClaimAllTypes, ++ bool aForAllUsers) ++{ ++ nsCOMPtr command = do_CreateInstance( NS_ARRAY_CONTRACTID ); ++ if (!command) ++ return NS_ERROR_FAILURE; ++ ++ nsCOMPtr cmdstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID ); ++ nsCOMPtr paramstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID ); ++ if (!cmdstr || !paramstr) ++ return NS_ERROR_FAILURE; ++ ++ cmdstr->SetData("SETDEFAULTBROWSER"_ns); ++ command->AppendElement( cmdstr ); ++ ++ paramstr->SetData( aClaimAllTypes ? "ALLTYPES"_ns : "NORMAL"_ns ); ++ command->AppendElement( paramstr ); ++ ++ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; ++} ++ ++NS_IMETHODIMP ++nsKDEShellService::GetCanSetDesktopBackground(bool* aResult) ++{ ++ *aResult = true; ++ return NS_OK; ++} ++ ++NS_IMETHODIMP ++nsKDEShellService::SetDesktopBackground(dom::Element* aElement, ++ int32_t aPosition, ++ const nsACString& aImageName) ++{ ++ return NS_ERROR_NOT_IMPLEMENTED; ++} ++ ++NS_IMETHODIMP ++nsKDEShellService::GetDesktopBackgroundColor(PRUint32 *aColor) ++{ ++ return NS_ERROR_NOT_IMPLEMENTED; ++} ++ ++NS_IMETHODIMP ++nsKDEShellService::SetDesktopBackgroundColor(PRUint32 aColor) ++{ ++ return NS_ERROR_NOT_IMPLEMENTED; ++} ++ ++NS_IMETHODIMP ++nsKDEShellService::IsDefaultForScheme(nsTSubstring const& aScheme, bool* aIsDefaultBrowser) ++{ ++ return NS_ERROR_NOT_IMPLEMENTED; ++} ++ +diff --git a/browser/components/shell/nsKDEShellService.h b/browser/components/shell/nsKDEShellService.h +new file mode 100644 +index 0000000000000000000000000000000000000000..8b0bb19164352453cfa453dd87c19263160b9ad8 +--- /dev/null ++++ b/browser/components/shell/nsKDEShellService.h +@@ -0,0 +1,32 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#ifndef nskdeshellservice_h____ ++#define nskdeshellservice_h____ ++ ++#include "nsIGNOMEShellService.h" ++#include "nsToolkitShellService.h" ++#include "nsString.h" ++#include "mozilla/Attributes.h" ++ ++class nsKDEShellService final : public nsIGNOMEShellService, ++ public nsToolkitShellService ++{ ++public: ++ nsKDEShellService() : mCheckedThisSession(false) { } ++ ++ NS_DECL_ISUPPORTS ++ NS_DECL_NSISHELLSERVICE ++ NS_DECL_NSIGNOMESHELLSERVICE ++ ++ nsresult Init(); ++ ++private: ++ ~nsKDEShellService() {} ++ ++ bool mCheckedThisSession; ++}; ++ ++#endif // nskdeshellservice_h____ +diff --git a/browser/components/shell/nsUnixShellService.cpp b/browser/components/shell/nsUnixShellService.cpp +new file mode 100644 +index 0000000000000000000000000000000000000000..abf266ebdc52e136f495911da3454e69c770c6db +--- /dev/null ++++ b/browser/components/shell/nsUnixShellService.cpp +@@ -0,0 +1,22 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++ ++#include "nsUnixShellService.h" ++#include "nsGNOMEShellService.h" ++#include "nsKDEShellService.h" ++#include "nsKDEUtils.h" ++#include "mozilla/ModuleUtils.h" ++ ++NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGNOMEShellService, Init) ++NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsKDEShellService, Init) ++ ++NS_IMETHODIMP ++nsUnixShellServiceConstructor(REFNSIID aIID, void **aResult) ++{ ++ if( nsKDEUtils::kdeSupport()) ++ return nsKDEShellServiceConstructor( aIID, aResult ); ++ return nsGNOMEShellServiceConstructor( aIID, aResult ); ++} +diff --git a/browser/components/shell/nsUnixShellService.h b/browser/components/shell/nsUnixShellService.h +new file mode 100644 +index 0000000000000000000000000000000000000000..26b5dbac47dd9a8ec1fcb6c93575cca750692735 +--- /dev/null ++++ b/browser/components/shell/nsUnixShellService.h +@@ -0,0 +1,15 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++ ++#ifndef nsunixshellservice_h____ ++#define nsunixshellservice_h____ ++ ++#include "nsIGNOMEShellService.h" ++ ++NS_IMETHODIMP ++nsUnixShellServiceConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult); ++ ++#endif // nsunixshellservice_h____ diff --git a/D167159.diff b/D167159.diff new file mode 100644 index 0000000..a9261b0 --- /dev/null +++ b/D167159.diff @@ -0,0 +1,132 @@ +diff --git a/dom/canvas/ClientWebGLContext.cpp b/dom/canvas/ClientWebGLContext.cpp +--- a/dom/canvas/ClientWebGLContext.cpp ++++ b/dom/canvas/ClientWebGLContext.cpp +@@ -4253,11 +4253,12 @@ + const auto& sd = *(desc->sd); + const auto sdType = sd.type(); + const auto& contextInfo = mNotLost->info; + + const auto fallbackReason = [&]() -> Maybe { +- auto fallbackReason = BlitPreventReason(level, offset, pi, *desc); ++ auto fallbackReason = ++ BlitPreventReason(level, offset, pi, *desc, Limits()); + if (fallbackReason) return fallbackReason; + + const bool canUploadViaSd = contextInfo.uploadableSdTypes[sdType]; + if (!canUploadViaSd) { + const nsPrintfCString msg( +diff --git a/dom/canvas/TexUnpackBlob.h b/dom/canvas/TexUnpackBlob.h +--- a/dom/canvas/TexUnpackBlob.h ++++ b/dom/canvas/TexUnpackBlob.h +@@ -41,11 +41,12 @@ + struct PackingInfo; + struct DriverUnpackInfo; + + Maybe BlitPreventReason(int32_t level, const ivec3& offset, + const webgl::PackingInfo&, +- const TexUnpackBlobDesc&); ++ const TexUnpackBlobDesc&, ++ const Limits& limits); + + class TexUnpackBlob { + public: + const TexUnpackBlobDesc& mDesc; + bool mNeedsExactUpload = true; +diff --git a/dom/canvas/TexUnpackBlob.cpp b/dom/canvas/TexUnpackBlob.cpp +--- a/dom/canvas/TexUnpackBlob.cpp ++++ b/dom/canvas/TexUnpackBlob.cpp +@@ -658,11 +658,12 @@ + return ValidateUnpackPixels(webgl, pi, fullRows, *this); + } + + Maybe BlitPreventReason(const int32_t level, const ivec3& offset, + const webgl::PackingInfo& pi, +- const TexUnpackBlobDesc& desc) { ++ const TexUnpackBlobDesc& desc, ++ const Limits& limits) { + const auto& size = desc.size; + const auto& unpacking = desc.unpacking; + + const auto ret = [&]() -> const char* { + if (size.z != 1) { +@@ -689,12 +690,16 @@ + return "UNPACK_PREMULTIPLY_ALPHA_WEBGL is not false"; + } + }(); + if (premultReason) return premultReason; + +- if (pi.format != LOCAL_GL_RGBA) { +- return "`format` is not RGBA"; ++ if (pi.format != LOCAL_GL_RGBA && pi.format != LOCAL_GL_RGB) { ++ return "`format` is not RGBA or RGB"; ++ } ++ ++ if (pi.format == LOCAL_GL_RGB && !limits.rgbColorRenderable) { ++ return "`format` is RGB, which is not color-renderable"; + } + + if (pi.type != LOCAL_GL_UNSIGNED_BYTE) { + return "`type` is not UNSIGNED_BYTE"; + } +@@ -722,12 +727,12 @@ + + const auto& gl = webgl->GL(); + + // - + +- const auto reason = +- BlitPreventReason(level, {xOffset, yOffset, zOffset}, pi, mDesc); ++ const auto reason = BlitPreventReason(level, {xOffset, yOffset, zOffset}, pi, ++ mDesc, tex->mContext->Limits()); + if (reason) { + webgl->GeneratePerfWarning( + "Failed to hit GPU-copy fast-path." + " (%s) Falling back to CPU upload.", + reason->c_str()); +diff --git a/dom/canvas/WebGLContextValidate.cpp b/dom/canvas/WebGLContextValidate.cpp +--- a/dom/canvas/WebGLContextValidate.cpp ++++ b/dom/canvas/WebGLContextValidate.cpp +@@ -239,10 +239,12 @@ + [WebGLExtensionID::WEBGL_compressed_texture_astc]) { + limits.astcHdr = gl.IsExtensionSupported( + gl::GLContext::KHR_texture_compression_astc_hdr); + } + ++ limits.rgbColorRenderable = webgl.gl->IsRGBColorRenderable(); ++ + if (webgl.IsWebGL2() || + limits.supportedExtensions[WebGLExtensionID::WEBGL_draw_buffers]) { + gl.GetUIntegerv(LOCAL_GL_MAX_DRAW_BUFFERS, &limits.maxColorDrawBuffers); + } + +diff --git a/dom/canvas/WebGLTypes.h b/dom/canvas/WebGLTypes.h +--- a/dom/canvas/WebGLTypes.h ++++ b/dom/canvas/WebGLTypes.h +@@ -663,10 +663,11 @@ + uint32_t maxUniformBufferBindings = 0; + uint32_t uniformBufferOffsetAlignment = 0; + + // Exts + bool astcHdr = false; ++ bool rgbColorRenderable = false; + uint32_t maxColorDrawBuffers = 1; + uint64_t queryCounterBitsTimeElapsed = 0; + uint64_t queryCounterBitsTimestamp = 0; + uint32_t maxMultiviewLayers = 0; + }; +diff --git a/gfx/gl/GLContext.h b/gfx/gl/GLContext.h +--- a/gfx/gl/GLContext.h ++++ b/gfx/gl/GLContext.h +@@ -290,10 +290,11 @@ + mTopError = GetError(); + return IsContextLost(); + } + + bool HasPBOState() const { return (!IsGLES() || Version() >= 300); } ++ bool IsRGBColorRenderable() { return !IsGLES() || Version() >= 300; } + + /** + * If this context is double-buffered, returns TRUE. + */ + virtual bool IsDoubleBuffered() const { return false; } + diff --git a/D168799.diff b/D168799.diff new file mode 100644 index 0000000..40dc3b4 --- /dev/null +++ b/D168799.diff @@ -0,0 +1,93 @@ +diff --git a/extensions/pref/autoconfig/test/unit/test_autoconfig_custom_path.js b/extensions/pref/autoconfig/test/unit/test_autoconfig_custom_path.js +--- a/extensions/pref/autoconfig/test/unit/test_autoconfig_custom_path.js ++++ b/extensions/pref/autoconfig/test/unit/test_autoconfig_custom_path.js +@@ -9,10 +9,13 @@ + let testDirName = do_get_cwd().clone(); + Services.env.set("MOZ_SYSTEM_CONFIG_DIR", testDirName.path); + + updateAppInfo(); + ++ try { ++ Services.dirsvc.undefine("SysConfD"); ++ } catch (e) {} + let customSysConfD = Services.dirsvc.get("SysConfD", Ci.nsIFile); + let parent = customSysConfD.parent; + let child = customSysConfD.leafName; + notEqual("/etc", parent.path, "SysConfD is not in /etc"); + equal("xpcshell", child, "SysConfD is xpcshell"); +diff --git a/extensions/pref/autoconfig/test/unit/test_autoconfig_default_path.js b/extensions/pref/autoconfig/test/unit/test_autoconfig_default_path.js +--- a/extensions/pref/autoconfig/test/unit/test_autoconfig_default_path.js ++++ b/extensions/pref/autoconfig/test/unit/test_autoconfig_default_path.js +@@ -6,8 +6,11 @@ + ); + + function run_test() { + updateAppInfo(); + ++ try { ++ Services.dirsvc.undefine("SysConfD"); ++ } catch (e) {} + let defaultSysConfD = Services.dirsvc.get("SysConfD", Ci.nsIFile); + equal("/etc/xpcshell", defaultSysConfD.path, "SysConfD is in /etc"); + } +diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp +--- a/modules/libpref/Preferences.cpp ++++ b/modules/libpref/Preferences.cpp +@@ -4917,27 +4917,10 @@ + ArrayLength(specialFiles)); + if (NS_FAILED(rv)) { + NS_WARNING("Error parsing application default preferences."); + } + +-#if defined(MOZ_WIDGET_GTK) +- // Under Flatpak/Snap package, load /etc/firefox/defaults/pref/*.js. +- if (mozilla::widget::IsRunningUnderFlatpakOrSnap()) { +- nsCOMPtr defaultSnapPrefDir; +- rv = NS_GetSpecialDirectory(NS_OS_SYSTEM_CONFIG_DIR, +- getter_AddRefs(defaultSnapPrefDir)); +- NS_ENSURE_SUCCESS(rv, rv); +- defaultSnapPrefDir->AppendNative("defaults"_ns); +- defaultSnapPrefDir->AppendNative("pref"_ns); +- +- rv = pref_LoadPrefsInDir(defaultSnapPrefDir, nullptr, 0); +- if (NS_FAILED(rv)) { +- NS_WARNING("Error parsing application default preferences under Snap."); +- } +- } +-#endif +- + // Load jar:$app/omni.jar!/defaults/preferences/*.js + // or jar:$gre/omni.jar!/defaults/preferences/*.js. + RefPtr appJarReader = Omnijar::GetReader(Omnijar::APP); + + // GetReader(Omnijar::APP) returns null when `$app == $gre`, in +@@ -5006,10 +4989,28 @@ + // Do we care if a file provided by this process fails to load? + pref_LoadPrefsInDir(path, nullptr, 0); + } + } + ++#if defined(MOZ_WIDGET_GTK) ++ // To ensure the system-wide preferences are not overwritten by ++ // firefox/browser/defauts/preferences/*.js we need to load ++ // the /etc/firefox/defaults/pref/*.js settings as last. ++ // Under Flatpak, the NS_OS_SYSTEM_CONFIG_DIR points to /app/etc/firefox ++ nsCOMPtr defaultSystemPrefDir; ++ rv = NS_GetSpecialDirectory(NS_OS_SYSTEM_CONFIG_DIR, ++ getter_AddRefs(defaultSystemPrefDir)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ defaultSystemPrefDir->AppendNative("defaults"_ns); ++ defaultSystemPrefDir->AppendNative("pref"_ns); ++ ++ rv = pref_LoadPrefsInDir(defaultSystemPrefDir, nullptr, 0); ++ if (NS_FAILED(rv)) { ++ NS_WARNING("Error parsing application default preferences."); ++ } ++#endif ++ + if (XRE_IsParentProcess()) { + SetupTelemetryPref(); + } + + if (aIsStartup) { + diff --git a/D192061.1699444912.diff b/D192061.1699444912.diff new file mode 100644 index 0000000..a7c4e85 --- /dev/null +++ b/D192061.1699444912.diff @@ -0,0 +1,113 @@ +diff --git a/widget/gtk/nsUserIdleServiceGTK.cpp b/widget/gtk/nsUserIdleServiceGTK.cpp +--- a/widget/gtk/nsUserIdleServiceGTK.cpp ++++ b/widget/gtk/nsUserIdleServiceGTK.cpp +@@ -149,48 +149,62 @@ + + #ifdef MOZ_ENABLE_DBUS + class UserIdleServiceMutter : public UserIdleServiceImpl { + public: + bool PollIdleTime(uint32_t* aIdleTime) override { +- MOZ_LOG(sIdleLog, LogLevel::Info, +- ("UserIdleServiceMutter::PollIdleTime()\n")); +- +- MOZ_ASSERT(mProxy); +- GUniquePtr error; ++ MOZ_LOG(sIdleLog, LogLevel::Info, ("PollIdleTime() request\n")); + +- RefPtr result = dont_AddRef(g_dbus_proxy_call_sync( +- mProxy, "GetIdletime", nullptr, G_DBUS_CALL_FLAGS_NONE, -1, +- mCancellable, getter_Transfers(error))); +- if (!result) { +- MOZ_LOG(sIdleLog, LogLevel::Info, +- ("UserIdleServiceMutter::PollIdleTime() failed, message: %s\n", +- error->message)); ++ // We're not ready yet ++ if (!mProxy) { + return false; + } +- if (!g_variant_is_of_type(result, G_VARIANT_TYPE_TUPLE) || +- g_variant_n_children(result) != 1) { +- MOZ_LOG( +- sIdleLog, LogLevel::Info, +- ("UserIdleServiceMutter::PollIdleTime() Unexpected params type: %s\n", +- g_variant_get_type_string(result))); +- return false; ++ ++ if (!mPollInProgress) { ++ mPollInProgress = true; ++ DBusProxyCall(mProxy, "GetIdletime", nullptr, G_DBUS_CALL_FLAGS_NONE, -1, ++ mCancellable) ++ ->Then( ++ GetCurrentSerialEventTarget(), __func__, ++ // It's safe to capture this as we use mCancellable to stop ++ // listening. ++ [self = RefPtr{this}, this](RefPtr&& aResult) { ++ if (!g_variant_is_of_type(aResult, G_VARIANT_TYPE_TUPLE) || ++ g_variant_n_children(aResult) != 1) { ++ MOZ_LOG(sIdleLog, LogLevel::Info, ++ ("PollIdleTime() Unexpected params type: %s\n", ++ g_variant_get_type_string(aResult))); ++ mLastIdleTime = 0; ++ return; ++ } ++ RefPtr iTime = ++ dont_AddRef(g_variant_get_child_value(aResult, 0)); ++ if (!g_variant_is_of_type(iTime, G_VARIANT_TYPE_UINT64)) { ++ MOZ_LOG(sIdleLog, LogLevel::Info, ++ ("PollIdleTime() Unexpected params type: %s\n", ++ g_variant_get_type_string(aResult))); ++ mLastIdleTime = 0; ++ return; ++ } ++ uint64_t idleTime = g_variant_get_uint64(iTime); ++ if (idleTime > std::numeric_limits::max()) { ++ idleTime = std::numeric_limits::max(); ++ } ++ mLastIdleTime = idleTime; ++ mPollInProgress = false; ++ MOZ_LOG(sIdleLog, LogLevel::Info, ++ ("Async handler got %d\n", mLastIdleTime)); ++ }, ++ [self = RefPtr{this}, this](GUniquePtr&& aError) { ++ mPollInProgress = false; ++ g_warning("Failed to call GetIdletime(): %s\n", ++ aError->message); ++ }); + } +- RefPtr iTime = dont_AddRef(g_variant_get_child_value(result, 0)); +- if (!g_variant_is_of_type(iTime, G_VARIANT_TYPE_UINT64)) { +- MOZ_LOG( +- sIdleLog, LogLevel::Info, +- ("UserIdleServiceMutter::PollIdleTime() Unexpected params type: %s\n", +- g_variant_get_type_string(result))); +- return false; +- } +- uint64_t idleTime = g_variant_get_uint64(iTime); +- if (idleTime > std::numeric_limits::max()) { +- idleTime = std::numeric_limits::max(); +- } +- *aIdleTime = idleTime; ++ ++ *aIdleTime = mLastIdleTime; + MOZ_LOG(sIdleLog, LogLevel::Info, +- ("UserIdleServiceMutter::PollIdleTime() %d\n", *aIdleTime)); ++ ("PollIdleTime() returns %d\n", *aIdleTime)); + return true; + } + + bool ProbeImplementation( + RefPtr aUserIdleServiceGTK) override { +@@ -229,10 +243,12 @@ + } + + private: + RefPtr mProxy; + RefPtr mCancellable; ++ uint32_t mLastIdleTime = 0; ++ bool mPollInProgress = false; + }; + #endif + + void nsUserIdleServiceGTK::ProbeService() { + MOZ_LOG(sIdleLog, LogLevel::Info, + diff --git a/D192208.1699444906.diff b/D192208.1699444906.diff new file mode 100644 index 0000000..f77a357 --- /dev/null +++ b/D192208.1699444906.diff @@ -0,0 +1,201 @@ +diff --git a/widget/gtk/nsUserIdleServiceGTK.h b/widget/gtk/nsUserIdleServiceGTK.h +--- a/widget/gtk/nsUserIdleServiceGTK.h ++++ b/widget/gtk/nsUserIdleServiceGTK.h +@@ -14,18 +14,20 @@ + + class nsUserIdleServiceGTK; + + class UserIdleServiceImpl { + public: +- NS_INLINE_DECL_REFCOUNTING(UserIdleServiceImpl); ++ explicit UserIdleServiceImpl(nsUserIdleServiceGTK* aUserIdleService) ++ : mUserIdleServiceGTK(aUserIdleService){}; + + virtual bool PollIdleTime(uint32_t* aIdleTime) = 0; +- virtual bool ProbeImplementation( +- RefPtr aUserIdleServiceGTK) = 0; ++ virtual bool ProbeImplementation() = 0; ++ ++ virtual ~UserIdleServiceImpl() = default; + + protected: +- virtual ~UserIdleServiceImpl() = default; ++ nsUserIdleServiceGTK* mUserIdleServiceGTK; + }; + + #define IDLE_SERVICE_MUTTER 0 + #define IDLE_SERVICE_XSCREENSAVER 1 + #define IDLE_SERVICE_NONE 2 +@@ -61,11 +63,11 @@ + nsUserIdleServiceGTK() = default; + + private: + ~nsUserIdleServiceGTK() = default; + +- RefPtr mIdleService; ++ mozilla::UniquePtr mIdleService; + #ifdef MOZ_ENABLE_DBUS + int mIdleServiceType = IDLE_SERVICE_MUTTER; + #else + int mIdleServiceType = IDLE_SERVICE_XSCREENSAVER; + #endif +diff --git a/widget/gtk/nsUserIdleServiceGTK.cpp b/widget/gtk/nsUserIdleServiceGTK.cpp +--- a/widget/gtk/nsUserIdleServiceGTK.cpp ++++ b/widget/gtk/nsUserIdleServiceGTK.cpp +@@ -74,12 +74,11 @@ + MOZ_LOG(sIdleLog, LogLevel::Warning, + ("XSSQueryExtension returned false!\n")); + return false; + } + +- bool ProbeImplementation( +- RefPtr aUserIdleServiceGTK) override { ++ bool ProbeImplementation() override { + MOZ_LOG(sIdleLog, LogLevel::Info, + ("UserIdleServiceX11::UserIdleServiceX11()\n")); + + if (!mozilla::widget::GdkIsX11Display()) { + return false; +@@ -114,15 +113,17 @@ + // We're missing X11 symbols + return false; + } + + // UserIdleServiceX11 uses sync init, confirm it now. +- aUserIdleServiceGTK->AcceptServiceCallback(); ++ mUserIdleServiceGTK->AcceptServiceCallback(); + return true; + } + +- protected: ++ explicit UserIdleServiceX11(nsUserIdleServiceGTK* aUserIdleService) ++ : UserIdleServiceImpl(aUserIdleService){}; ++ + ~UserIdleServiceX11() { + # ifdef MOZ_X11 + if (mXssInfo) { + XFree(mXssInfo); + } +@@ -164,11 +165,11 @@ + mCancellable) + ->Then( + GetCurrentSerialEventTarget(), __func__, + // It's safe to capture this as we use mCancellable to stop + // listening. +- [self = RefPtr{this}, this](RefPtr&& aResult) { ++ [this](RefPtr&& aResult) { + if (!g_variant_is_of_type(aResult, G_VARIANT_TYPE_TUPLE) || + g_variant_n_children(aResult) != 1) { + MOZ_LOG(sIdleLog, LogLevel::Info, + ("PollIdleTime() Unexpected params type: %s\n", + g_variant_get_type_string(aResult))); +@@ -191,25 +192,25 @@ + mLastIdleTime = idleTime; + mPollInProgress = false; + MOZ_LOG(sIdleLog, LogLevel::Info, + ("Async handler got %d\n", mLastIdleTime)); + }, +- [self = RefPtr{this}, this](GUniquePtr&& aError) { ++ [this](GUniquePtr&& aError) { + mPollInProgress = false; + g_warning("Failed to call GetIdletime(): %s\n", + aError->message); ++ mUserIdleServiceGTK->RejectAndTryNextServiceCallback(); + }); + } + + *aIdleTime = mLastIdleTime; + MOZ_LOG(sIdleLog, LogLevel::Info, + ("PollIdleTime() returns %d\n", *aIdleTime)); + return true; + } + +- bool ProbeImplementation( +- RefPtr aUserIdleServiceGTK) override { ++ bool ProbeImplementation() override { + MOZ_LOG(sIdleLog, LogLevel::Info, + ("UserIdleServiceMutter::UserIdleServiceMutter()\n")); + + mCancellable = dont_AddRef(g_cancellable_new()); + CreateDBusProxyForBus( +@@ -219,23 +220,23 @@ + nullptr, "org.gnome.Mutter.IdleMonitor", + "/org/gnome/Mutter/IdleMonitor/Core", "org.gnome.Mutter.IdleMonitor", + mCancellable) + ->Then( + GetCurrentSerialEventTarget(), __func__, +- [self = RefPtr{this}, service = RefPtr{aUserIdleServiceGTK}]( +- RefPtr&& aProxy) { +- self->mProxy = std::move(aProxy); +- service->AcceptServiceCallback(); ++ [this](RefPtr&& aProxy) { ++ mProxy = std::move(aProxy); ++ mUserIdleServiceGTK->AcceptServiceCallback(); + }, +- [self = RefPtr{this}, service = RefPtr{aUserIdleServiceGTK}]( +- GUniquePtr&& aError) { +- service->RejectAndTryNextServiceCallback(); ++ [this](GUniquePtr&& aError) { ++ mUserIdleServiceGTK->RejectAndTryNextServiceCallback(); + }); + return true; + } + +- protected: ++ explicit UserIdleServiceMutter(nsUserIdleServiceGTK* aUserIdleService) ++ : UserIdleServiceImpl(aUserIdleService){}; ++ + ~UserIdleServiceMutter() { + if (mCancellable) { + g_cancellable_cancel(mCancellable); + mCancellable = nullptr; + } +@@ -257,23 +258,23 @@ + MOZ_ASSERT(!mIdleService); + + switch (mIdleServiceType) { + #ifdef MOZ_ENABLE_DBUS + case IDLE_SERVICE_MUTTER: +- mIdleService = new UserIdleServiceMutter(); ++ mIdleService = MakeUnique(this); + break; + #endif + #ifdef MOZ_X11 + case IDLE_SERVICE_XSCREENSAVER: +- mIdleService = new UserIdleServiceX11(); ++ mIdleService = MakeUnique(this); + break; + #endif + default: + return; + } + +- if (!mIdleService->ProbeImplementation(this)) { ++ if (!mIdleService->ProbeImplementation()) { + RejectAndTryNextServiceCallback(); + } + } + + void nsUserIdleServiceGTK::AcceptServiceCallback() { +@@ -289,19 +290,19 @@ + mIdleServiceType)); + + // Delete recent non-working service + MOZ_ASSERT(mIdleService, "Nothing to reject?"); + mIdleService = nullptr; ++ mIdleServiceInitialized = false; + + mIdleServiceType++; + if (mIdleServiceType < IDLE_SERVICE_NONE) { + MOZ_LOG(sIdleLog, LogLevel::Info, + ("nsUserIdleServiceGTK try next idle service\n")); + ProbeService(); + } else { + MOZ_LOG(sIdleLog, LogLevel::Info, ("nsUserIdleServiceGTK failed\n")); +- mIdleServiceInitialized = false; + } + } + + bool nsUserIdleServiceGTK::PollIdleTime(uint32_t* aIdleTime) { + if (!mIdleServiceInitialized) { + diff --git a/bmo-1559213-Support-system-av1.patch b/bmo-1559213-Support-system-av1.patch new file mode 100644 index 0000000..1d50290 --- /dev/null +++ b/bmo-1559213-Support-system-av1.patch @@ -0,0 +1,91 @@ +diff -up firefox-122.0/config/external/moz.build.system-av1 firefox-122.0/config/external/moz.build +--- firefox-122.0/config/external/moz.build.system-av1 2024-01-18 21:41:20.000000000 +0100 ++++ firefox-122.0/config/external/moz.build 2024-01-19 18:27:03.512034790 +0100 +@@ -40,8 +40,9 @@ if not CONFIG["MOZ_SYSTEM_LIBVPX"]: + external_dirs += ["media/libvpx"] + + if CONFIG["MOZ_AV1"]: +- external_dirs += ["media/libaom"] +- external_dirs += ["media/libdav1d"] ++ if not CONFIG["MOZ_SYSTEM_AV1"]: ++ external_dirs += ["media/libaom"] ++ external_dirs += ["media/libdav1d"] + + if not CONFIG["MOZ_SYSTEM_PNG"]: + external_dirs += ["media/libpng"] +diff -up firefox-122.0/config/system-headers.mozbuild.system-av1 firefox-122.0/config/system-headers.mozbuild +--- firefox-122.0/config/system-headers.mozbuild.system-av1 2024-01-19 18:27:03.513034826 +0100 ++++ firefox-122.0/config/system-headers.mozbuild 2024-01-19 19:02:54.515493457 +0100 +@@ -1304,6 +1304,14 @@ if CONFIG["MOZ_ENABLE_LIBPROXY"]: + "proxy.h", + ] + ++if CONFIG['MOZ_SYSTEM_AV1']: ++ system_headers += [ ++ 'aom/aom_decoder.h', ++ 'aom/aomdx.h', ++ 'aom/aom_image.h', ++ 'dav1d/dav1d.h', ++ ] ++ + if CONFIG["MOZ_SYSTEM_ICU"]: + system_headers += [ + "unicode/calendar.h", +diff -up firefox-122.0/dom/media/platforms/moz.build.system-av1 firefox-122.0/dom/media/platforms/moz.build +--- firefox-122.0/dom/media/platforms/moz.build.system-av1 2024-01-18 21:41:21.000000000 +0100 ++++ firefox-122.0/dom/media/platforms/moz.build 2024-01-19 18:27:03.513034826 +0100 +@@ -81,6 +81,11 @@ if CONFIG["MOZ_AV1"]: + "agnostic/AOMDecoder.cpp", + "agnostic/DAV1DDecoder.cpp", + ] ++ if CONFIG["MOZ_SYSTEM_AV1"]: ++ CXXFLAGS += CONFIG["MOZ_SYSTEM_LIBAOM_CFLAGS"] ++ OS_LIBS += CONFIG["MOZ_SYSTEM_LIBAOM_LIBS"] ++ CXXFLAGS += CONFIG["MOZ_SYSTEM_LIBDAV1D_CFLAGS"] ++ OS_LIBS += CONFIG["MOZ_SYSTEM_LIBDAV1D_LIBS"] + + if CONFIG["MOZ_OMX"]: + EXPORTS += [ +diff -up firefox-122.0/toolkit/moz.configure.system-av1 firefox-122.0/toolkit/moz.configure +--- firefox-122.0/toolkit/moz.configure.system-av1 2024-01-19 18:27:03.495034173 +0100 ++++ firefox-122.0/toolkit/moz.configure 2024-01-19 18:27:03.514034863 +0100 +@@ -743,14 +743,29 @@ def av1(value): + if value: + return True + ++option("--with-system-av1", help="Use system av1 (located with pkg-config)") + +-@depends(target, when=av1 & compile_environment) ++system_libaom_info = pkg_check_modules('MOZ_SYSTEM_LIBAOM', 'aom >= 1.0.0', ++ when='--with-system-av1') ++ ++system_libdav1d_info = pkg_check_modules('MOZ_SYSTEM_LIBDAV1D', 'dav1d >= 0.1.1', ++ when='--with-system-av1') ++ ++@depends(system_libaom_info, system_libdav1d_info) ++def system_av1(system_libaom_info, system_libdav1d_info): ++ has_av1_libs = False ++ if system_libaom_info and system_libdav1d_info: ++ has_av1_libs = True ++ return has_av1_libs ++ ++ ++@depends(target, when=av1 & depends(system_av1)(lambda v: not v) & compile_environment) + def dav1d_asm(target): + if target.cpu in ("aarch64", "x86", "x86_64"): + return True + + +-@depends(target, when=av1 & compile_environment) ++@depends(target, when=av1 & depends(system_av1)(lambda v: not v) & compile_environment) + def dav1d_nasm(target): + if target.cpu in ("x86", "x86_64"): + return namespace(version="2.14", what="AV1") +@@ -760,6 +775,7 @@ set_config("MOZ_DAV1D_ASM", dav1d_asm) + set_define("MOZ_DAV1D_ASM", dav1d_asm) + set_config("MOZ_AV1", av1) + set_define("MOZ_AV1", av1) ++set_config("MOZ_SYSTEM_AV1", depends_if(system_av1)(lambda _: True)) + + # JXL Image Codec Support + # ============================================================== diff --git a/bmo-1559213-fix-system-av1-libs.patch b/bmo-1559213-fix-system-av1-libs.patch new file mode 100644 index 0000000..d687e8f --- /dev/null +++ b/bmo-1559213-fix-system-av1-libs.patch @@ -0,0 +1,22 @@ +diff -Naur a/media/ffvpx/libavcodec/moz.build b/media/ffvpx/libavcodec/moz.build +--- a/media/ffvpx/libavcodec/moz.build 2023-08-01 09:34:20.242044722 +0300 ++++ b/media/ffvpx/libavcodec/moz.build 2023-08-01 09:36:01.445808739 +0300 +@@ -109,10 +109,14 @@ + 'vp9recon.c', + 'vpx_rac.c', + ] +- USE_LIBS += [ +- 'dav1d', +- 'media_libdav1d_asm', +- ] ++ if CONFIG["MOZ_SYSTEM_AV1"]: ++ CFLAGS += CONFIG['MOZ_SYSTEM_LIBDAV1D_CFLAGS'] ++ OS_LIBS += CONFIG['MOZ_SYSTEM_LIBDAV1D_LIBS'] ++ else: ++ USE_LIBS += [ ++ 'dav1d', ++ 'media_libdav1d_asm', ++ ] + if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": + LOCAL_INCLUDES += ['/media/mozva'] + SOURCES += [ diff --git a/build-aarch64-skia.patch b/build-aarch64-skia.patch new file mode 100644 index 0000000..342836f --- /dev/null +++ b/build-aarch64-skia.patch @@ -0,0 +1,25 @@ +diff -up firefox-114.0/gfx/skia/skia/modules/skcms/src/Transform_inl.h.aarch64-skia firefox-114.0/gfx/skia/skia/modules/skcms/src/Transform_inl.h +--- firefox-114.0/gfx/skia/skia/modules/skcms/src/Transform_inl.h.aarch64-skia 2023-06-02 03:15:22.000000000 +0200 ++++ firefox-114.0/gfx/skia/skia/modules/skcms/src/Transform_inl.h 2023-06-05 10:18:46.942777997 +0200 +@@ -189,8 +189,6 @@ SI F F_from_Half(U16 half) { + SI U16 Half_from_F(F f) { + #if defined(USING_NEON_FP16) + return bit_pun(f); +-#elif defined(USING_NEON_F16C) +- return (U16)vcvt_f16_f32(f); + #elif defined(USING_AVX512F) + return (U16)_mm512_cvtps_ph((__m512 )f, _MM_FROUND_CUR_DIRECTION ); + #elif defined(USING_AVX_F16C) +diff -up firefox-114.0/gfx/skia/skia/src/base/SkHalf.h.aarch64-skia firefox-114.0/gfx/skia/skia/src/base/SkHalf.h +diff -up firefox-114.0/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h.aarch64-skia firefox-114.0/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h +--- firefox-114.0/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h.aarch64-skia 2023-06-05 10:18:46.941777963 +0200 ++++ firefox-114.0/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h 2023-06-05 10:20:44.924843847 +0200 +@@ -1128,7 +1128,7 @@ SI F from_half(U16 h) { + } + + SI U16 to_half(F f) { +-#if defined(JUMPER_IS_NEON) && defined(SK_CPU_ARM64) \ ++#if 0 //defined(JUMPER_IS_NEON) && defined(SK_CPU_ARM64) \ + && !defined(SK_BUILD_FOR_GOOGLE3) // Temporary workaround for some Google3 builds. + return sk_bit_cast(vcvt_f16_f32(f)); + diff --git a/build-arm-libopus.patch b/build-arm-libopus.patch new file mode 100644 index 0000000..1b3f31b --- /dev/null +++ b/build-arm-libopus.patch @@ -0,0 +1,12 @@ +diff -up firefox-66.0/media/libopus/silk/arm/arm_silk_map.c.old firefox-66.0/media/libopus/silk/arm/arm_silk_map.c +--- firefox-66.0/media/libopus/silk/arm/arm_silk_map.c.old 2019-03-12 21:07:35.356677522 +0100 ++++ firefox-66.0/media/libopus/silk/arm/arm_silk_map.c 2019-03-12 21:07:42.937693394 +0100 +@@ -28,7 +28,7 @@ POSSIBILITY OF SUCH DAMAGE. + # include "config.h" + #endif + +-#include "main_FIX.h" ++#include "fixed/main_FIX.h" + #include "NSQ.h" + #include "SigProc_FIX.h" + diff --git a/build-cacheFlush-missing.patch b/build-cacheFlush-missing.patch new file mode 100644 index 0000000..51c368c --- /dev/null +++ b/build-cacheFlush-missing.patch @@ -0,0 +1,13 @@ +diff -up firefox-55.0.3/js/src/jit/ExecutableAllocator.h.wasm firefox-55.0.3/js/src/jit/ExecutableAllocator.h +--- firefox-55.0.3/js/src/jit/ExecutableAllocator.h.wasm 2017-09-05 11:32:12.235909468 +0200 ++++ firefox-55.0.3/js/src/jit/ExecutableAllocator.h 2017-09-05 11:32:46.157916575 +0200 +@@ -219,7 +219,7 @@ class ExecutableAllocator + + static void poisonCode(JSRuntime* rt, JitPoisonRangeVector& ranges); + +-#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) || defined(JS_SIMULATOR_ARM64) ++#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) || defined(JS_SIMULATOR_ARM64) || defined(JS_CODEGEN_NONE) + static void cacheFlush(void*, size_t) + { + } +diff -up firefox-55.0.3/js/src/jit-test/tests/wasm/bench/wasm_box2d.wasm firefox-55.0.3/js/src/jit-test/tests/wasm/bench/wasm_box2d diff --git a/build-ppc-jit.patch b/build-ppc-jit.patch new file mode 100644 index 0000000..a9dc6d1 --- /dev/null +++ b/build-ppc-jit.patch @@ -0,0 +1,51 @@ +diff -up firefox-55.0/js/src/jit/MIR.h.old firefox-55.0/js/src/jit/MIR.h +--- firefox-55.0/js/src/jit/MIR.h.old 2017-08-08 14:04:44.528460099 +0200 ++++ firefox-55.0/js/src/jit/MIR.h 2017-08-08 14:05:11.045364831 +0200 +@@ -12434,7 +12434,7 @@ class MNearbyInt + TRIVIAL_NEW_WRAPPERS + + static bool HasAssemblerSupport(RoundingMode mode) { +- return Assembler::HasRoundInstruction(mode); ++ return false; + } + + RoundingMode roundingMode() const { return roundingMode_; } +diff -up firefox-55.0/js/src/jit/ExecutableAllocator.h.old firefox-55.0/js/src/jit/ExecutableAllocator.h +--- firefox-55.0/js/src/jit/ExecutableAllocator.h.old 2017-08-09 09:24:18.784983505 +0200 ++++ firefox-55.0/js/src/jit/ExecutableAllocator.h 2017-08-09 09:28:01.471100075 +0200 +@@ -307,6 +307,10 @@ class ExecutableAllocator + { + sync_instruction_memory((caddr_t)code, size); + } ++#else ++ static void cacheFlush(void*, size_t) ++ { ++ } + #endif + + private: +diff -up firefox-55.0/js/src/wasm/WasmBuiltins.cpp.old firefox-55.0/js/src/wasm/WasmBuiltins.cpp +--- firefox-55.0/js/src/wasm/WasmBuiltins.cpp.old 2017-08-09 12:50:46.877450765 +0200 ++++ firefox-55.0/js/src/wasm/WasmBuiltins.cpp 2017-08-09 12:50:59.725406974 +0200 +@@ -881,7 +881,6 @@ wasm::EnsureBuiltinThunksInitialized() + MOZ_ASSERT(!masm.numSymbolicAccesses()); + #endif + +- ExecutableAllocator::cacheFlush(thunks->codeBase, thunks->codeSize); + if (!ExecutableAllocator::makeExecutable(thunks->codeBase, thunks->codeSize)) + return false; + +diff -up firefox-55.0/js/src/wasm/WasmCode.cpp.old firefox-55.0/js/src/wasm/WasmCode.cpp +--- firefox-55.0/js/src/wasm/WasmCode.cpp.old 2017-08-09 12:50:37.205483731 +0200 ++++ firefox-55.0/js/src/wasm/WasmCode.cpp 2017-08-09 12:51:10.365370708 +0200 +@@ -287,8 +287,6 @@ CodeSegment::initialize(Tier tier, + if (!StaticallyLink(*this, linkData)) + return false; + +- ExecutableAllocator::cacheFlush(bytes_.get(), RoundupCodeLength(codeLength)); +- + // Reprotect the whole region to avoid having separate RW and RX mappings. + if (!ExecutableAllocator::makeExecutable(bytes_.get(), RoundupCodeLength(codeLength))) + return false; +diff -up firefox-55.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old firefox-55.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium +diff -up firefox-55.0/media/webrtc/trunk/Makefile.old firefox-55.0/media/webrtc/trunk/Makefile diff --git a/build-rust-ppc64le.patch b/build-rust-ppc64le.patch new file mode 100644 index 0000000..2474c35 --- /dev/null +++ b/build-rust-ppc64le.patch @@ -0,0 +1,25 @@ +diff -up firefox-55.0/build/moz.configure/rust.configure.rust-ppc64le firefox-55.0/build/moz.configure/rust.configure +--- firefox-55.0/build/moz.configure/rust.configure.rust-ppc64le 2017-07-31 18:20:49.000000000 +0200 ++++ firefox-55.0/build/moz.configure/rust.configure 2017-08-02 10:19:03.254220003 +0200 +@@ -151,6 +151,9 @@ def rust_triple_alias(host_or_target): + ('sparc64', 'Linux'): 'sparc64-unknown-linux-gnu', + ('x86', 'Linux'): 'i686-unknown-linux-gnu', + ('x86_64', 'Linux'): 'x86_64-unknown-linux-gnu', ++ ('ppc64le', 'Linux'): 'powerpc64le-unknown-linux-gnu', ++ ('ppc64', 'Linux'): 'powerpc64-unknown-linux-gnu', ++ ('s390x', 'Linux'): 's390x-unknown-linux-gnu', + # OS X + ('x86', 'OSX'): 'i686-apple-darwin', + ('x86_64', 'OSX'): 'x86_64-apple-darwin', +@@ -174,8 +177,10 @@ def rust_triple_alias(host_or_target): + ('sparc64', 'SunOS'): 'sparcv9-sun-solaris', + }.get((host_or_target.cpu, os_or_kernel), None) + ++ if (rustc_target == 'powerpc64-unknown-linux-gnu' and host_or_target.endianness == 'little'): ++ rustc_target = 'powerpc64le-unknown-linux-gnu' + if rustc_target is None: +- die("Don't know how to translate {} for rustc".format(host_or_target.alias)) ++ die("Don't know how to translate {} for rustc, cpu: {}, os: {}".format(target.alias, target.cpu, os_or_kernel)) + + # Check to see whether our rustc has a reasonably functional stdlib + # for our chosen target. diff --git a/dead.package b/dead.package deleted file mode 100644 index 23f2701..0000000 --- a/dead.package +++ /dev/null @@ -1 +0,0 @@ -firefox package is retired on branch c10s for BAKERY-412 \ No newline at end of file diff --git a/disable-openh264-download.patch b/disable-openh264-download.patch new file mode 100644 index 0000000..0631850 --- /dev/null +++ b/disable-openh264-download.patch @@ -0,0 +1,36 @@ +diff -up firefox-121.0/toolkit/content/jar.mn.disable-openh264-download firefox-121.0/toolkit/content/jar.mn +--- firefox-121.0/toolkit/content/jar.mn.disable-openh264-download 2023-12-18 20:15:04.352014249 +0100 ++++ firefox-121.0/toolkit/content/jar.mn 2023-12-18 20:19:26.857929200 +0100 +@@ -130,7 +130,6 @@ toolkit.jar: + #ifdef XP_MACOSX + content/global/macWindowMenu.js + #endif +- content/global/gmp-sources/openh264.json (gmp-sources/openh264.json) + content/global/gmp-sources/widevinecdm.json (gmp-sources/widevinecdm.json) + content/global/gmp-sources/widevinecdm_l1.json (gmp-sources/widevinecdm_l1.json) + +diff -up firefox-121.0/toolkit/modules/GMPInstallManager.sys.mjs.disable-openh264-download firefox-121.0/toolkit/modules/GMPInstallManager.sys.mjs +--- firefox-121.0/toolkit/modules/GMPInstallManager.sys.mjs.disable-openh264-download 2023-12-11 21:42:21.000000000 +0100 ++++ firefox-121.0/toolkit/modules/GMPInstallManager.sys.mjs 2023-12-18 20:18:52.665768579 +0100 +@@ -35,11 +35,6 @@ function getScopedLogger(prefix) { + + const LOCAL_GMP_SOURCES = [ + { +- id: "gmp-gmpopenh264", +- src: "chrome://global/content/gmp-sources/openh264.json", +- installByDefault: true, +- }, +- { + id: "gmp-widevinecdm", + src: "chrome://global/content/gmp-sources/widevinecdm.json", + installByDefault: true, +@@ -421,6 +416,9 @@ GMPInstallManager.prototype = { + * downloaderr, verifyerr or previouserrorencountered + */ + installAddon(gmpAddon) { ++ if (gmpAddon.isOpenH264) { ++ return Promise.reject({ type: "disabled" }); ++ } + if (this._deferred) { + let log = getScopedLogger("GMPInstallManager.installAddon"); + log.error("previous error encountered"); diff --git a/distribution.ini b/distribution.ini new file mode 100644 index 0000000..11f1f96 --- /dev/null +++ b/distribution.ini @@ -0,0 +1,9 @@ +[Global] +id=fedora +version=1.0 +about=Mozilla Firefox for Fedora + +[Preferences] +app.distributor=fedora +app.distributor.channel=fedora +app.partner.fedora=fedora diff --git a/fedora-customization.patch b/fedora-customization.patch new file mode 100644 index 0000000..e1d54b0 --- /dev/null +++ b/fedora-customization.patch @@ -0,0 +1,31 @@ +diff -up firefox-120.0/toolkit/xre/nsAppRunner.cpp.fedora-customization firefox-120.0/toolkit/xre/nsAppRunner.cpp +--- firefox-120.0/toolkit/xre/nsAppRunner.cpp.fedora-customization 2023-11-13 21:48:38.000000000 +0100 ++++ firefox-120.0/toolkit/xre/nsAppRunner.cpp 2023-11-14 10:39:13.001603081 +0100 +@@ -5765,6 +5765,12 @@ int XREMain::XRE_main(int argc, char* ar + if (!mAppData->remotingName) { + mAppData->remotingName = mAppData->name; + } ++ ++ const char* appRemotingName = getenv("MOZ_APP_REMOTINGNAME"); ++ if (appRemotingName) { ++ mAppData->remotingName = strdup(appRemotingName); ++ } ++ + // used throughout this file + gAppData = mAppData.get(); + +diff -up firefox-120.0/widget/gtk/nsWindow.cpp.fedora-customization firefox-120.0/widget/gtk/nsWindow.cpp +--- firefox-120.0/widget/gtk/nsWindow.cpp.fedora-customization 2023-11-14 10:39:13.003603150 +0100 ++++ firefox-120.0/widget/gtk/nsWindow.cpp 2023-11-14 10:41:06.339532735 +0100 +@@ -3457,6 +3457,11 @@ void* nsWindow::GetNativeData(uint32_t a + nsresult nsWindow::SetTitle(const nsAString& aTitle) { + if (!mShell) return NS_OK; + ++ const char* appTitle = getenv("MOZ_APP_TITLE"); ++ if (appTitle) { ++ gtk_window_set_title(GTK_WINDOW(mShell), appTitle); ++ return NS_OK; ++ } + // convert the string into utf8 and set the title. + #define UTF8_FOLLOWBYTE(ch) (((ch) & 0xC0) == 0x80) + NS_ConvertUTF16toUTF8 titleUTF8(aTitle); diff --git a/fedora-shebang-build.patch b/fedora-shebang-build.patch new file mode 100644 index 0000000..9ade86c --- /dev/null +++ b/fedora-shebang-build.patch @@ -0,0 +1,9 @@ +diff -up firefox-73.0/build/unix/run-mozilla.sh.old firefox-73.0/build/unix/run-mozilla.sh +--- firefox-73.0/build/unix/run-mozilla.sh.old 2020-02-12 09:58:00.150895904 +0100 ++++ firefox-73.0/build/unix/run-mozilla.sh 2020-02-12 09:58:06.505860696 +0100 +@@ -1,4 +1,4 @@ +-#!/bin/sh ++#!/usr/bin/sh + # + # This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this diff --git a/firefox-112.0-commasplit.patch b/firefox-112.0-commasplit.patch new file mode 100644 index 0000000..a56aec4 --- /dev/null +++ b/firefox-112.0-commasplit.patch @@ -0,0 +1,76 @@ +--- firefox-111.0.1/build/moz.configure/rust.configure 2023-03-21 06:16:03.000000000 -0700 ++++ firefox-111.0.1/build/moz.configure/rust.configure.new 2023-04-05 08:57:29.403219120 -0700 +@@ -593,7 +593,7 @@ + + # ============================================================== + +-option(env="RUSTFLAGS", nargs=1, help="Rust compiler flags") ++option(env="RUSTFLAGS", nargs=1, help="Rust compiler flags", comma_split=False) + set_config("RUSTFLAGS", depends("RUSTFLAGS")(lambda flags: flags)) + + +--- firefox-111.0.1/python/mozbuild/mozbuild/configure/options.py 2023-03-21 06:16:09.000000000 -0700 ++++ firefox-111.0.1/python/mozbuild/mozbuild/configure/options.py.new 2023-04-05 08:57:31.270193468 -0700 +@@ -191,6 +191,10 @@ + to instantiate an option indirectly. Set this to a positive integer to + force the script to look into a deeper stack frame when inferring the + `category`. ++ - `comma_split` specifies whether the value string should be split on ++ commas. The default is True. Setting it False is necessary for things ++ like compiler flags which should be a single string that may contain ++ commas. + """ + + __slots__ = ( +@@ -205,6 +209,7 @@ + "possible_origins", + "category", + "define_depth", ++ "comma_split", + ) + + def __init__( +@@ -218,6 +223,7 @@ + category=None, + help=None, + define_depth=0, ++ comma_split=True, + ): + if not name and not env: + raise InvalidOptionError( +@@ -335,9 +341,10 @@ + self.choices = choices + self.help = help + self.category = category or _infer_option_category(define_depth) ++ self.comma_split = comma_split + + @staticmethod +- def split_option(option): ++ def split_option(option, comma_split=True): + """Split a flag or variable into a prefix, a name and values + + Variables come in the form NAME=values (no prefix). +@@ -350,7 +357,13 @@ + + elements = option.split("=", 1) + name = elements[0] +- values = tuple(elements[1].split(",")) if len(elements) == 2 else () ++ if len(elements) == 2: ++ if comma_split: ++ values = tuple(elements[1].split(",")) ++ else: ++ values = (elements[1],) ++ else: ++ values = () + if name.startswith("--"): + name = name[2:] + if not name.islower(): +@@ -426,7 +439,7 @@ + % (option, origin, ", ".join(self.possible_origins)) + ) + +- prefix, name, values = self.split_option(option) ++ prefix, name, values = self.split_option(option, self.comma_split) + option = self._join_option(prefix, name) + + assert name in (self.name, self.env)