summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-05 03:13:08 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-05 03:13:08 +0000
commitee8469dbc1fa88e770dc42b9e36c16096db86c5c (patch)
treea3408825c9e3c0e6f300598835ea1f5d761bb5b4
parentc598e711556fc5cd73a0a78ba7c6c3c71b28b074 (diff)
automatic import of firefoxopeneuler24.03_LTS
-rw-r--r--.gitignore7
-rw-r--r--CVE-2023-44488-libvpx.patch127
-rw-r--r--build-big-endian-errors.patch57
-rw-r--r--build-disable-elfhack.patch12
-rw-r--r--build-ppc64-abiv2.patch12
-rw-r--r--build-rhel7-lower-node-min-version.patch11
-rw-r--r--build-rhel7-nasm-dwarf.patch12
-rw-r--r--disable-pipewire.patch242
-rw-r--r--distribution.ini9
-rw-r--r--expat-CVE-2023-52425.patch375
-rw-r--r--fedora-shebang-build.patch9
-rw-r--r--firefox-enable-addons.patch13
-rw-r--r--firefox-gcc-build.patch38
-rw-r--r--firefox-mozconfig29
-rw-r--r--firefox-nss-addon-hack.patch19
-rw-r--r--firefox-redhat-default-prefs.js38
-rw-r--r--firefox-search-provider.ini5
-rw-r--r--firefox-symbolic.svg3
-rw-r--r--firefox-tests-xpcshell-freeze.patch14
-rw-r--r--firefox-x11.desktop235
-rw-r--r--firefox-x11.sh.in7
-rw-r--r--firefox.1141
-rw-r--r--firefox.appdata.xml.in59
-rw-r--r--firefox.desktop275
-rw-r--r--firefox.sh.in292
-rw-r--r--firefox.spec2238
-rw-r--r--google-api-key1
-rw-r--r--google-loc-api-key1
-rw-r--r--mozilla-api-key1
-rw-r--r--mozilla-bmo1170092.patch95
-rw-r--r--mozilla-bmo1504834-part1.patch86
-rw-r--r--mozilla-bmo1504834-part3.patch17
-rw-r--r--mozilla-bmo1636168-fscreen.patch82
-rw-r--r--mozilla-bmo1670333.patch69
-rw-r--r--mozilla-bmo1716707-svg.patch29
-rw-r--r--mozilla-bmo1716707-swizzle.patch34
-rw-r--r--mozilla-bmo1789216-disable-av1.patch89
-rw-r--r--mozilla-bmo849632.patch26
-rw-r--r--mozilla-bmo998749.patch29
-rwxr-xr-xnode-stdout-nonblocking-wrapper2
-rw-r--r--nss-setup-flags-env.inc7
-rwxr-xr-xprocess-official-tarball23
-rw-r--r--rhbz-1173156.patch12
-rw-r--r--rhbz-1354671.patch12
-rw-r--r--rhbz-2131158-webrtc-nss-fix.patch25
-rw-r--r--sources7
-rwxr-xr-xtesting.sh260
47 files changed, 5186 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..2685a20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1,7 @@
+/cbindgen-vendor.tar.xz
+/firefox-115.9.1esr.processed-source.tar.xz
+/firefox-langpacks-115.9.1esr-20240322.tar.xz
+/mochitest-python.tar.gz
+/nspr-4.35.0-1.el8_1.src.rpm
+/nss-3.90.0-3.el8_1.src.rpm
+/nss-3.90.0-3.el9_0.src.rpm
diff --git a/CVE-2023-44488-libvpx.patch b/CVE-2023-44488-libvpx.patch
new file mode 100644
index 0000000..79e5235
--- /dev/null
+++ b/CVE-2023-44488-libvpx.patch
@@ -0,0 +1,127 @@
+From 263682c9a29395055f3b3afe2d97be1828a6223f Mon Sep 17 00:00:00 2001
+From: Jerome Jiang <jianj@google.com>
+Date: Thu, 30 Jun 2022 13:48:56 -0400
+Subject: [PATCH] Fix bug with smaller width bigger size
+
+Fixed previous patch that clusterfuzz failed on.
+
+Bug: webm:1642
+Change-Id: If0e08e72abd2e042efe4dcfac21e4cc51afdfdb9
+---
+ test/resize_test.cc | 11 +++--------
+ vp9/common/vp9_alloccommon.c | 13 ++++++-------
+ vp9/encoder/vp9_encoder.c | 27 +++++++++++++++++++++++++--
+ 3 files changed, 34 insertions(+), 17 deletions(-)
+
+diff --git a/test/resize_test.cc b/test/resize_test.cc
+index fd1c2a92de6..20ad2229b46 100644
+--- a/test/resize_test.cc
++++ b/test/resize_test.cc
+@@ -102,11 +102,8 @@ void ScaleForFrameNumber(unsigned int frame, unsigned int initial_w,
+ if (frame < 30) {
+ return;
+ }
+- if (frame < 100) {
+- *w = initial_w * 7 / 10;
+- *h = initial_h * 16 / 10;
+- return;
+- }
++ *w = initial_w * 7 / 10;
++ *h = initial_h * 16 / 10;
+ return;
+ }
+ if (frame < 10) {
+@@ -559,9 +556,7 @@ TEST_P(ResizeRealtimeTest, TestExternalResizeWorks) {
+ }
+ }
+
+-// TODO(https://crbug.com/webm/1642): This causes a segfault in
+-// init_encode_frame_mb_context().
+-TEST_P(ResizeRealtimeTest, DISABLED_TestExternalResizeSmallerWidthBiggerSize) {
++TEST_P(ResizeRealtimeTest, TestExternalResizeSmallerWidthBiggerSize) {
+ ResizingVideoSource video;
+ video.flag_codec_ = true;
+ video.smaller_width_larger_size_ = true;
+diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c
+index e53883f621d..9e73e40ea09 100644
+--- a/vp9/common/vp9_alloccommon.c
++++ b/vp9/common/vp9_alloccommon.c
+@@ -135,13 +135,6 @@ int vp9_alloc_context_buffers(VP9_COMMON *cm, int width, int height) {
+ cm->free_mi(cm);
+ if (cm->alloc_mi(cm, new_mi_size)) goto fail;
+ }
+-
+- if (cm->seg_map_alloc_size < cm->mi_rows * cm->mi_cols) {
+- // Create the segmentation map structure and set to 0.
+- free_seg_map(cm);
+- if (alloc_seg_map(cm, cm->mi_rows * cm->mi_cols)) goto fail;
+- }
+-
+ if (cm->above_context_alloc_cols < cm->mi_cols) {
+ vpx_free(cm->above_context);
+ cm->above_context = (ENTROPY_CONTEXT *)vpx_calloc(
+@@ -156,6 +149,12 @@ int vp9_alloc_context_buffers(VP9_COMMON *cm, int width, int height) {
+ cm->above_context_alloc_cols = cm->mi_cols;
+ }
+
++ if (cm->seg_map_alloc_size < cm->mi_rows * cm->mi_cols) {
++ // Create the segmentation map structure and set to 0.
++ free_seg_map(cm);
++ if (alloc_seg_map(cm, cm->mi_rows * cm->mi_cols)) goto fail;
++ }
++
+ if (vp9_alloc_loop_filter(cm)) goto fail;
+
+ return 0;
+diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
+index 69a4e3c314f..e3ba294c32f 100644
+--- a/vp9/encoder/vp9_encoder.c
++++ b/vp9/encoder/vp9_encoder.c
+@@ -2047,6 +2047,17 @@ static void alloc_copy_partition_data(VP9_COMP *cpi) {
+ }
+ }
+
++static void free_copy_partition_data(VP9_COMP *cpi) {
++ vpx_free(cpi->prev_partition);
++ cpi->prev_partition = NULL;
++ vpx_free(cpi->prev_segment_id);
++ cpi->prev_segment_id = NULL;
++ vpx_free(cpi->prev_variance_low);
++ cpi->prev_variance_low = NULL;
++ vpx_free(cpi->copied_frame_cnt);
++ cpi->copied_frame_cnt = NULL;
++}
++
+ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
+ VP9_COMMON *const cm = &cpi->common;
+ RATE_CONTROL *const rc = &cpi->rc;
+@@ -2126,6 +2137,8 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
+ new_mi_size = cm->mi_stride * calc_mi_size(cm->mi_rows);
+ if (cm->mi_alloc_size < new_mi_size) {
+ vp9_free_context_buffers(cm);
++ vp9_free_pc_tree(&cpi->td);
++ vpx_free(cpi->mbmi_ext_base);
+ alloc_compressor_data(cpi);
+ realloc_segmentation_maps(cpi);
+ cpi->initial_width = cpi->initial_height = 0;
+@@ -2144,8 +2157,18 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
+ update_frame_size(cpi);
+
+ if (last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) {
+- memset(cpi->consec_zero_mv, 0,
+- cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv));
++ vpx_free(cpi->consec_zero_mv);
++ CHECK_MEM_ERROR(
++ &cm->error, cpi->consec_zero_mv,
++ vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->consec_zero_mv)));
++
++ vpx_free(cpi->skin_map);
++ CHECK_MEM_ERROR(
++ &cm->error, cpi->skin_map,
++ vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(cpi->skin_map[0])));
++
++ free_copy_partition_data(cpi);
++ alloc_copy_partition_data(cpi);
+ if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
+ vp9_cyclic_refresh_reset_resize(cpi);
+ rc->rc_1_frame = 0;
diff --git a/build-big-endian-errors.patch b/build-big-endian-errors.patch
new file mode 100644
index 0000000..b4bcb38
--- /dev/null
+++ b/build-big-endian-errors.patch
@@ -0,0 +1,57 @@
+diff -up firefox-102.0/third_party/libwebrtc/common_audio/wav_file.cc.big-endian-errors firefox-102.0/third_party/libwebrtc/common_audio/wav_file.cc
+--- firefox-102.0/third_party/libwebrtc/common_audio/wav_file.cc.big-endian-errors 2022-08-17 13:19:53.056891028 +0200
++++ firefox-102.0/third_party/libwebrtc/common_audio/wav_file.cc 2022-08-17 13:19:57.251879556 +0200
+@@ -89,9 +89,6 @@ void WavReader::Reset() {
+
+ size_t WavReader::ReadSamples(const size_t num_samples,
+ int16_t* const samples) {
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Need to convert samples to big-endian when reading from WAV file"
+-#endif
+
+ size_t num_samples_left_to_read = num_samples;
+ size_t next_chunk_start = 0;
+@@ -129,9 +126,6 @@ size_t WavReader::ReadSamples(const size
+ }
+
+ size_t WavReader::ReadSamples(const size_t num_samples, float* const samples) {
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Need to convert samples to big-endian when reading from WAV file"
+-#endif
+
+ size_t num_samples_left_to_read = num_samples;
+ size_t next_chunk_start = 0;
+@@ -213,9 +207,6 @@ WavWriter::WavWriter(FileWrapper file,
+ }
+
+ void WavWriter::WriteSamples(const int16_t* samples, size_t num_samples) {
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Need to convert samples to little-endian when writing to WAV file"
+-#endif
+
+ for (size_t i = 0; i < num_samples; i += kMaxChunksize) {
+ const size_t num_remaining_samples = num_samples - i;
+@@ -243,9 +234,6 @@ void WavWriter::WriteSamples(const int16
+ }
+
+ void WavWriter::WriteSamples(const float* samples, size_t num_samples) {
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Need to convert samples to little-endian when writing to WAV file"
+-#endif
+
+ for (size_t i = 0; i < num_samples; i += kMaxChunksize) {
+ const size_t num_remaining_samples = num_samples - i;
+diff -up firefox-102.0/third_party/libwebrtc/common_audio/wav_header.cc.big-endian-errors firefox-102.0/third_party/libwebrtc/common_audio/wav_header.cc
+--- firefox-102.0/third_party/libwebrtc/common_audio/wav_header.cc.big-endian-errors 2022-08-17 13:18:04.688187393 +0200
++++ firefox-102.0/third_party/libwebrtc/common_audio/wav_header.cc 2022-08-17 13:18:22.451138816 +0200
+@@ -26,10 +26,6 @@
+ namespace webrtc {
+ namespace {
+
+-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
+-#error "Code not working properly for big endian platforms."
+-#endif
+-
+ #pragma pack(2)
+ struct ChunkHeader {
+ uint32_t ID;
diff --git a/build-disable-elfhack.patch b/build-disable-elfhack.patch
new file mode 100644
index 0000000..859c50f
--- /dev/null
+++ b/build-disable-elfhack.patch
@@ -0,0 +1,12 @@
+diff -up firefox-115.2.0/toolkit/moz.configure.disable-elfhack firefox-115.2.0/toolkit/moz.configure
+--- firefox-115.2.0/toolkit/moz.configure.disable-elfhack 2023-09-20 21:55:41.002788320 +0200
++++ firefox-115.2.0/toolkit/moz.configure 2023-09-20 21:56:37.343757245 +0200
+@@ -1511,7 +1511,7 @@ with only_when("--enable-compile-environ
+ "Cannot enable elfhack with lld."
+ " Use --enable-linker=bfd, --enable-linker=gold, or --disable-elf-hack"
+ )
+- return True
++ return False
+
+ set_config("USE_ELF_HACK", use_elf_hack)
+
diff --git a/build-ppc64-abiv2.patch b/build-ppc64-abiv2.patch
new file mode 100644
index 0000000..7a68390
--- /dev/null
+++ b/build-ppc64-abiv2.patch
@@ -0,0 +1,12 @@
+diff -up firefox-115.0.2/security/nss/lib/freebl/sha512-p8.s.ppc-abiv2 firefox-115.0.2/security/nss/lib/freebl/sha512-p8.s
+--- firefox-115.0.2/security/nss/lib/freebl/sha512-p8.s.ppc-abiv2 2023-07-25 09:01:42.602375809 +0200
++++ firefox-115.0.2/security/nss/lib/freebl/sha512-p8.s 2023-07-25 09:01:48.273373924 +0200
+@@ -3,7 +3,7 @@
+ # See the full LICENSE under scripts/.
+
+ .machine "any"
+-.abiversion 2
++.abiversion 1
+ .text
+
+ .globl sha512_block_p8
diff --git a/build-rhel7-lower-node-min-version.patch b/build-rhel7-lower-node-min-version.patch
new file mode 100644
index 0000000..398cbc3
--- /dev/null
+++ b/build-rhel7-lower-node-min-version.patch
@@ -0,0 +1,11 @@
+--- firefox-115.8.0/python/mozbuild/mozbuild/nodeutil.py.lower-node-min-version 2024-02-12 21:53:56.000000000 +0200
++++ firefox-115.8.0/python/mozbuild/mozbuild/nodeutil.py 2024-02-14 16:48:12.476182627 +0200
+@@ -13,7 +13,7 @@ from mozboot.util import get_tools_dir
+ from packaging.version import Version
+ from six import PY3
+
+-NODE_MIN_VERSION = Version("12.22.12")
++NODE_MIN_VERSION = Version("10.24.0")
+ NPM_MIN_VERSION = Version("6.14.16")
+
+
diff --git a/build-rhel7-nasm-dwarf.patch b/build-rhel7-nasm-dwarf.patch
new file mode 100644
index 0000000..5e2ba4a
--- /dev/null
+++ b/build-rhel7-nasm-dwarf.patch
@@ -0,0 +1,12 @@
+diff -up firefox-91.0.1/python/mozbuild/mozbuild/frontend/context.py.rhel7-nasm firefox-91.0.1/python/mozbuild/mozbuild/frontend/context.py
+--- firefox-91.0.1/python/mozbuild/mozbuild/frontend/context.py.rhel7-nasm 2021-08-31 08:02:10.814740774 +0200
++++ firefox-91.0.1/python/mozbuild/mozbuild/frontend/context.py 2021-08-31 08:04:03.967146994 +0200
+@@ -420,7 +420,7 @@ class AsmFlags(BaseCompileFlags):
+ if self._context.config.substs.get("OS_ARCH") == "WINNT":
+ debug_flags += ["-F", "cv8"]
+ elif self._context.config.substs.get("OS_ARCH") != "Darwin":
+- debug_flags += ["-F", "dwarf"]
++ debug_flags += ["-f", "elf32"]
+ elif (
+ self._context.config.substs.get("OS_ARCH") == "WINNT"
+ and self._context.config.substs.get("CPU_ARCH") == "aarch64"
diff --git a/disable-pipewire.patch b/disable-pipewire.patch
new file mode 100644
index 0000000..cea6b68
--- /dev/null
+++ b/disable-pipewire.patch
@@ -0,0 +1,242 @@
+diff --git a/dom/media/webrtc/third_party_build/webrtc.mozbuild b/dom/media/webrtc/third_party_build/webrtc.mozbuild
+index 30169c36c2..335e3cb1a1 100644
+--- a/dom/media/webrtc/third_party_build/webrtc.mozbuild
++++ b/dom/media/webrtc/third_party_build/webrtc.mozbuild
+@@ -35,6 +35,3 @@ if CONFIG['MOZ_WEBRTC']:
+
+ if CONFIG['MOZ_X11']:
+ DEFINES['WEBRTC_USE_X11'] = True
+-
+- if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
+- DEFINES['WEBRTC_USE_PIPEWIRE'] = True
+diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build
+index 8c56b6b8e5..eaf8d7087a 100644
+--- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build
++++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build
+@@ -232,102 +232,6 @@ if CONFIG["CPU_ARCH"] == "aarch64":
+ DEFINES["WEBRTC_ARCH_ARM64"] = True
+ DEFINES["WEBRTC_HAS_NEON"] = True
+
+-if CONFIG["CPU_ARCH"] == "arm":
+-
+- CXXFLAGS += [
+- "-mfpu=neon"
+- ]
+-
+- DEFINES["WEBRTC_ARCH_ARM"] = True
+- DEFINES["WEBRTC_ARCH_ARM_V7"] = True
+- DEFINES["WEBRTC_HAS_NEON"] = True
+- DEFINES["WEBRTC_USE_PIPEWIRE"] = True
+- DEFINES["_GNU_SOURCE"] = True
+-
+- LOCAL_INCLUDES += [
+- "/gfx/angle/checkout/include/",
+- "/third_party/drm/drm/",
+- "/third_party/drm/drm/include/",
+- "/third_party/drm/drm/include/libdrm/",
+- "/third_party/gbm/gbm/",
+- "/third_party/libepoxy/libepoxy/include/",
+- "/third_party/pipewire/"
+- ]
+-
+- SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc"
+- ]
+-
+- UNIFIED_SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc"
+- ]
+-
+-if CONFIG["CPU_ARCH"] == "mips32":
+-
+- DEFINES["MIPS32_LE"] = True
+- DEFINES["MIPS_FPU_LE"] = True
+- DEFINES["WEBRTC_USE_PIPEWIRE"] = True
+- DEFINES["_GNU_SOURCE"] = True
+-
+- LOCAL_INCLUDES += [
+- "/gfx/angle/checkout/include/",
+- "/third_party/drm/drm/",
+- "/third_party/drm/drm/include/",
+- "/third_party/drm/drm/include/libdrm/",
+- "/third_party/gbm/gbm/",
+- "/third_party/libepoxy/libepoxy/include/",
+- "/third_party/pipewire/"
+- ]
+-
+- SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc"
+- ]
+-
+- UNIFIED_SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc"
+- ]
+-
+-if CONFIG["CPU_ARCH"] == "mips64":
+-
+- DEFINES["WEBRTC_USE_PIPEWIRE"] = True
+- DEFINES["_GNU_SOURCE"] = True
+-
+- LOCAL_INCLUDES += [
+- "/gfx/angle/checkout/include/",
+- "/third_party/drm/drm/",
+- "/third_party/drm/drm/include/",
+- "/third_party/drm/drm/include/libdrm/",
+- "/third_party/gbm/gbm/",
+- "/third_party/libepoxy/libepoxy/include/",
+- "/third_party/pipewire/"
+- ]
+-
+- SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc"
+- ]
+-
+- UNIFIED_SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc"
+- ]
+-
+ if CONFIG["CPU_ARCH"] == "ppc64":
+
+ DEFINES["USE_X11"] = "1"
+@@ -410,97 +314,6 @@ if CONFIG["MOZ_DEBUG"] == "1" and CONFIG["OS_TARGET"] == "WINNT":
+
+ DEFINES["_HAS_ITERATOR_DEBUGGING"] = "0"
+
+-if CONFIG["CPU_ARCH"] == "aarch64" and CONFIG["OS_TARGET"] == "Linux":
+-
+- DEFINES["WEBRTC_USE_PIPEWIRE"] = True
+- DEFINES["_GNU_SOURCE"] = True
+-
+- LOCAL_INCLUDES += [
+- "/gfx/angle/checkout/include/",
+- "/third_party/drm/drm/",
+- "/third_party/drm/drm/include/",
+- "/third_party/drm/drm/include/libdrm/",
+- "/third_party/gbm/gbm/",
+- "/third_party/libepoxy/libepoxy/include/",
+- "/third_party/pipewire/"
+- ]
+-
+- SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc"
+- ]
+-
+- UNIFIED_SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc"
+- ]
+-
+-if CONFIG["CPU_ARCH"] == "x86" and CONFIG["OS_TARGET"] == "Linux":
+-
+- CXXFLAGS += [
+- "-msse2"
+- ]
+-
+- DEFINES["WEBRTC_USE_PIPEWIRE"] = True
+- DEFINES["_GNU_SOURCE"] = True
+-
+- LOCAL_INCLUDES += [
+- "/gfx/angle/checkout/include/",
+- "/third_party/drm/drm/",
+- "/third_party/drm/drm/include/",
+- "/third_party/drm/drm/include/libdrm/",
+- "/third_party/gbm/gbm/",
+- "/third_party/libepoxy/libepoxy/include/",
+- "/third_party/pipewire/"
+- ]
+-
+- SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc"
+- ]
+-
+- UNIFIED_SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc"
+- ]
+-
+-if CONFIG["CPU_ARCH"] == "x86_64" and CONFIG["OS_TARGET"] == "Linux":
+-
+- DEFINES["WEBRTC_USE_PIPEWIRE"] = True
+- DEFINES["_GNU_SOURCE"] = True
+-
+- LOCAL_INCLUDES += [
+- "/gfx/angle/checkout/include/",
+- "/third_party/drm/drm/",
+- "/third_party/drm/drm/include/",
+- "/third_party/drm/drm/include/libdrm/",
+- "/third_party/gbm/gbm/",
+- "/third_party/libepoxy/libepoxy/include/",
+- "/third_party/pipewire/"
+- ]
+-
+- SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/base_capturer_pipewire.cc"
+- ]
+-
+- UNIFIED_SOURCES += [
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/mouse_cursor_monitor_pipewire.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/restore_token_manager.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screen_capture_portal_interface.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc",
+- "/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc"
+- ]
+-
+ if CONFIG["CPU_ARCH"] == "aarch64" and CONFIG["MOZ_X11"] == "1" and CONFIG["OS_TARGET"] == "Linux":
+
+ DEFINES["USE_X11"] = "1"
+diff --git a/third_party/libwebrtc/modules/portal/portal_gn/moz.build b/third_party/libwebrtc/modules/portal/portal_gn/moz.build
+index 77603c780b..e6f2c9e724 100644
+--- a/third_party/libwebrtc/modules/portal/portal_gn/moz.build
++++ b/third_party/libwebrtc/modules/portal/portal_gn/moz.build
+@@ -26,7 +26,7 @@ DEFINES["WEBRTC_MOZILLA_BUILD"] = True
+ DEFINES["WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS"] = "0"
+ DEFINES["WEBRTC_POSIX"] = True
+ DEFINES["WEBRTC_STRICT_FIELD_TRIALS"] = "0"
+-DEFINES["WEBRTC_USE_PIPEWIRE"] = True
++DEFINES["WEBRTC_USE_PIPEWIRE"] = False
+ DEFINES["_FILE_OFFSET_BITS"] = "64"
+ DEFINES["_GNU_SOURCE"] = True
+ DEFINES["_LARGEFILE64_SOURCE"] = True
+diff --git a/third_party/libwebrtc/third_party/pipewire/pipewire_gn/moz.build b/third_party/libwebrtc/third_party/pipewire/pipewire_gn/moz.build
+index 86a0daf8fa..e895f2eb15 100644
+--- a/third_party/libwebrtc/third_party/pipewire/pipewire_gn/moz.build
++++ b/third_party/libwebrtc/third_party/pipewire/pipewire_gn/moz.build
+@@ -24,7 +24,7 @@ DEFINES["WEBRTC_MOZILLA_BUILD"] = True
+ DEFINES["WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS"] = "0"
+ DEFINES["WEBRTC_POSIX"] = True
+ DEFINES["WEBRTC_STRICT_FIELD_TRIALS"] = "0"
+-DEFINES["WEBRTC_USE_PIPEWIRE"] = True
++DEFINES["WEBRTC_USE_PIPEWIRE"] = False
+ DEFINES["_FILE_OFFSET_BITS"] = "64"
+ DEFINES["_GNU_SOURCE"] = True
+ DEFINES["_LARGEFILE64_SOURCE"] = True
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/expat-CVE-2023-52425.patch b/expat-CVE-2023-52425.patch
new file mode 100644
index 0000000..bdd06ca
--- /dev/null
+++ b/expat-CVE-2023-52425.patch
@@ -0,0 +1,375 @@
+# erAck: backport of expat CVE-2023-52425 DoS fix
+# https://github.com/libexpat/libexpat/commit/34b598c5f594b015c513c73f06e7ced3323edbf1
+#
+--- firefox-115.9.0/parser/expat/lib/expat.h.expat-CVE-2023-52425 2024-03-11 20:36:11.000000000 +0100
++++ firefox-115.9.0/parser/expat/lib/expat.h 2024-03-13 20:46:45.648505015 +0100
+@@ -1045,6 +1045,10 @@ XMLPARSEAPI(const XML_Feature *)
+ XML_GetFeatureList(void);
+
+
++/* Added in Expat 2.6.0. */
++XMLPARSEAPI(XML_Bool)
++XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled);
++
+ /* Expat follows the semantic versioning convention.
+ See http://semver.org.
+ */
+--- firefox-115.9.0/parser/expat/lib/internal.h.expat-CVE-2023-52425 2024-03-11 20:36:11.000000000 +0100
++++ firefox-115.9.0/parser/expat/lib/internal.h 2024-03-14 00:14:39.334319725 +0100
+@@ -80,6 +80,7 @@
+ # endif
+ #endif
+
++#include "expat.h" // so we can use type XML_Parser below
+
+ #ifdef __cplusplus
+ extern "C" {
+@@ -90,6 +91,9 @@ void
+ align_limit_to_full_utf8_characters(const char * from, const char ** fromLimRef);
+
+
++extern XML_Bool g_reparseDeferralEnabledDefault; // written ONLY in runtests.c
++extern unsigned int g_parseAttempts; // used for testing only
++
+ #ifdef __cplusplus
+ }
+ #endif
+--- firefox-115.9.0/parser/expat/lib/xmlparse.c.expat-CVE-2023-52425 2024-03-11 20:36:11.000000000 +0100
++++ firefox-115.9.0/parser/expat/lib/xmlparse.c 2024-03-13 22:55:14.844756009 +0100
+@@ -6,6 +6,7 @@
+
+ #define _GNU_SOURCE /* syscall prototype */
+
++#include <stdbool.h>
+ #include <stddef.h>
+ #include <string.h> /* memset(), memcpy() */
+ #include <assert.h>
+@@ -89,6 +90,9 @@ typedef char ICHAR;
+ /* Round up n to be a multiple of sz, where sz is a power of 2. */
+ #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
+
++/* Do safe (NULL-aware) pointer arithmetic */
++#define EXPAT_SAFE_PTR_DIFF(p, q) (((p) && (q)) ? ((p) - (q)) : 0)
++
+ /* Handle the case where memmove() doesn't exist. */
+ #ifndef HAVE_MEMMOVE
+ #ifdef HAVE_BCOPY
+@@ -98,6 +102,8 @@ typedef char ICHAR;
+ #endif /* HAVE_BCOPY */
+ #endif /* HAVE_MEMMOVE */
+
++#define EXPAT_MIN(a, b) (((a) < (b)) ? (a) : (b))
++
+ #include "internal.h"
+ #include "xmltok.h"
+ #include "xmlrole.h"
+@@ -476,6 +482,9 @@ parserInit(XML_Parser parser, const XML_
+ ? 0 \
+ : ((*((pool)->ptr)++ = c), 1))
+
++XML_Bool g_reparseDeferralEnabledDefault = XML_TRUE; // write ONLY in runtests.c
++unsigned int g_parseAttempts = 0; // used for testing only
++
+ struct XML_ParserStruct {
+ /* The first member must be userData so that the XML_GetUserData
+ macro works. */
+@@ -491,6 +500,9 @@ struct XML_ParserStruct {
+ const char *m_bufferLim;
+ XML_Index m_parseEndByteIndex;
+ const char *m_parseEndPtr;
++ size_t m_partialTokenBytesBefore; /* used in heuristic to avoid O(n^2) */
++ XML_Bool m_reparseDeferralEnabled;
++ int m_lastBufferRequestSize;
+ XML_Char *m_dataBuf;
+ XML_Char *m_dataBufEnd;
+ XML_StartElementHandler m_startElementHandler;
+@@ -647,6 +659,9 @@ struct XML_ParserStruct {
+ #define bufferEnd (parser->m_bufferEnd)
+ #define parseEndByteIndex (parser->m_parseEndByteIndex)
+ #define parseEndPtr (parser->m_parseEndPtr)
++#define partialTokenBytesBefore (parser->m_partialTokenBytesBefore)
++#define reparseDeferralEnabled (parser->m_reparseDeferralEnabled)
++#define lastBufferRequestSize (parser->m_lastBufferRequestSize)
+ #define bufferLim (parser->m_bufferLim)
+ #define dataBuf (parser->m_dataBuf)
+ #define dataBufEnd (parser->m_dataBufEnd)
+@@ -887,6 +902,47 @@ get_hash_secret_salt(XML_Parser parser)
+ return parser->m_hash_secret_salt;
+ }
+
++static enum XML_Error
++callProcessor(XML_Parser parser, const char *start, const char *end,
++ const char **endPtr) {
++ const size_t have_now = EXPAT_SAFE_PTR_DIFF(end, start);
++
++ if (parser->m_reparseDeferralEnabled
++ && ! parser->m_parsingStatus.finalBuffer) {
++ // Heuristic: don't try to parse a partial token again until the amount of
++ // available data has increased significantly.
++ const size_t had_before = parser->m_partialTokenBytesBefore;
++ // ...but *do* try anyway if we're close to causing a reallocation.
++ size_t available_buffer
++ = EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer);
++#if XML_CONTEXT_BYTES > 0
++ available_buffer -= EXPAT_MIN(available_buffer, XML_CONTEXT_BYTES);
++#endif
++ available_buffer
++ += EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferEnd);
++ // m_lastBufferRequestSize is never assigned a value < 0, so the cast is ok
++ const bool enough
++ = (have_now >= 2 * had_before)
++ || ((size_t)parser->m_lastBufferRequestSize > available_buffer);
++
++ if (! enough) {
++ *endPtr = start; // callers may expect this to be set
++ return XML_ERROR_NONE;
++ }
++ }
++ g_parseAttempts += 1;
++ const enum XML_Error ret = parser->m_processor(parser, start, end, endPtr);
++ if (ret == XML_ERROR_NONE) {
++ // if we consumed nothing, remember what we had on this parse attempt.
++ if (*endPtr == start) {
++ parser->m_partialTokenBytesBefore = have_now;
++ } else {
++ parser->m_partialTokenBytesBefore = 0;
++ }
++ }
++ return ret;
++}
++
+ static XML_Bool /* only valid for root parser */
+ startParsing(XML_Parser parser)
+ {
+@@ -1075,6 +1131,9 @@ parserInit(XML_Parser parser, const XML_
+ bufferEnd = buffer;
+ parseEndByteIndex = 0;
+ parseEndPtr = NULL;
++ partialTokenBytesBefore = 0;
++ reparseDeferralEnabled = g_reparseDeferralEnabledDefault;
++ lastBufferRequestSize = 0;
+ declElementType = NULL;
+ declAttributeId = NULL;
+ declEntity = NULL;
+@@ -1232,6 +1291,7 @@ XML_ExternalEntityParserCreate(XML_Parse
+ to worry which hash secrets each table has.
+ */
+ unsigned long oldhash_secret_salt;
++ XML_Bool oldReparseDeferralEnabled;
+
+ /* Validate the oldParser parameter before we pull everything out of it */
+ if (oldParser == NULL)
+@@ -1276,6 +1336,7 @@ XML_ExternalEntityParserCreate(XML_Parse
+ to worry which hash secrets each table has.
+ */
+ oldhash_secret_salt = hash_secret_salt;
++ oldReparseDeferralEnabled = reparseDeferralEnabled;
+
+ #ifdef XML_DTD
+ if (!context)
+@@ -1330,6 +1391,7 @@ XML_ExternalEntityParserCreate(XML_Parse
+ defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
+ ns_triplets = oldns_triplets;
+ hash_secret_salt = oldhash_secret_salt;
++ reparseDeferralEnabled = oldReparseDeferralEnabled;
+ parentParser = oldParser;
+ #ifdef XML_DTD
+ paramEntityParsing = oldParamEntityParsing;
+@@ -1850,39 +1912,8 @@ XML_Parse(XML_Parser parser, const char
+ ps_parsing = XML_PARSING;
+ }
+
+- if (len == 0) {
+- ps_finalBuffer = (XML_Bool)isFinal;
+- if (!isFinal)
+- return XML_STATUS_OK;
+- positionPtr = bufferPtr;
+- parseEndPtr = bufferEnd;
+-
+- /* If data are left over from last buffer, and we now know that these
+- data are the final chunk of input, then we have to check them again
+- to detect errors based on that fact.
+- */
+- errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
+-
+- if (errorCode == XML_ERROR_NONE) {
+- switch (ps_parsing) {
+- case XML_SUSPENDED:
+- XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
+- positionPtr = bufferPtr;
+- return XML_STATUS_SUSPENDED;
+- case XML_INITIALIZED:
+- case XML_PARSING:
+- ps_parsing = XML_FINISHED;
+- /* fall through */
+- default:
+- return XML_STATUS_OK;
+- }
+- }
+- eventEndPtr = eventPtr;
+- processor = errorProcessor;
+- return XML_STATUS_ERROR;
+- }
+ #ifndef XML_CONTEXT_BYTES
+- else if (bufferPtr == bufferEnd) {
++ if (bufferPtr == bufferEnd) {
+ const char *end;
+ int nLeftOver;
+ enum XML_Status result;
+@@ -1899,11 +1930,14 @@ XML_Parse(XML_Parser parser, const char
+ processor = errorProcessor;
+ return XML_STATUS_ERROR;
+ }
++ // though this isn't a buffer request, we assume that `len` is the app's
++ // preferred buffer fill size, and therefore save it here.
++ lastBufferRequestSize = len;
+ parseEndByteIndex += len;
+ positionPtr = s;
+ ps_finalBuffer = (XML_Bool)isFinal;
+
+- errorCode = processor(parser, s, parseEndPtr = s + len, &end);
++ errorCode = callProcessor(parser, s, parseEndPtr = s + len, &end);
+
+ if (errorCode != XML_ERROR_NONE) {
+ eventEndPtr = eventPtr;
+@@ -1930,6 +1964,8 @@ XML_Parse(XML_Parser parser, const char
+ XmlUpdatePosition(encoding, positionPtr, end, &position);
+ nLeftOver = s + len - end;
+ if (nLeftOver) {
++#if 0
++// erAck: replace with XML_GetBuffer() below.
+ if (buffer == NULL || nLeftOver > bufferLim - buffer) {
+ /* avoid _signed_ integer overflow */
+ char *temp = NULL;
+@@ -1939,6 +1975,28 @@ XML_Parse(XML_Parser parser, const char
+ ? (char *)MALLOC(bytesToAllocate)
+ : (char *)REALLOC(buffer, bytesToAllocate));
+ }
++#endif
++#if 1
++// erAck: the original patch context had a call to XML_GetBuffer() instead:
++ // Back up and restore the parsing status to avoid XML_ERROR_SUSPENDED
++ // (and XML_ERROR_FINISHED) from XML_GetBuffer.
++ const enum XML_Parsing originalStatus = ps_parsing;
++ ps_parsing = XML_PARSING;
++ void *const temp = XML_GetBuffer(parser, nLeftOver);
++ ps_parsing = originalStatus;
++#endif
++ // GetBuffer may have overwritten this, but we want to remember what the
++ // app requested, not how many bytes were left over after parsing.
++ lastBufferRequestSize = len;
++#if 1
++ if (temp == NULL) {
++ // NOTE: parser->m_errorCode has already been set by XML_GetBuffer().
++ eventPtr = eventEndPtr = NULL;
++ processor = errorProcessor;
++ return XML_STATUS_ERROR;
++ }
++#endif
++#if 0
+ if (temp == NULL) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ eventPtr = eventEndPtr = NULL;
+@@ -1948,6 +2006,7 @@ XML_Parse(XML_Parser parser, const char
+ buffer = temp;
+ bufferLim = buffer + bytesToAllocate;
+ }
++#endif
+ memcpy(buffer, end, nLeftOver);
+ }
+ bufferPtr = buffer;
+@@ -1959,15 +2018,14 @@ XML_Parse(XML_Parser parser, const char
+ return result;
+ }
+ #endif /* not defined XML_CONTEXT_BYTES */
+- else {
+- void *buff = XML_GetBuffer(parser, len);
+- if (buff == NULL)
+- return XML_STATUS_ERROR;
+- else {
+- memcpy(buff, s, len);
+- return XML_ParseBuffer(parser, len, isFinal);
+- }
++ void *buff = XML_GetBuffer(parser, len);
++ if (buff == NULL)
++ return XML_STATUS_ERROR;
++ if (len > 0) {
++ assert(s != NULL); // make sure s==NULL && len!=0 was rejected above
++ memcpy(buff, s, len);
+ }
++ return XML_ParseBuffer(parser, len, isFinal);
+ }
+
+ enum XML_Status XMLCALL
+@@ -2001,7 +2059,7 @@ XML_ParseBuffer(XML_Parser parser, int l
+ parseEndByteIndex += len;
+ ps_finalBuffer = (XML_Bool)isFinal;
+
+- errorCode = processor(parser, start, parseEndPtr, &bufferPtr);
++ errorCode = callProcessor(parser, start, parseEndPtr, &bufferPtr);
+
+ if (errorCode != XML_ERROR_NONE) {
+ eventEndPtr = eventPtr;
+@@ -2047,7 +2105,11 @@ XML_GetBuffer(XML_Parser parser, int len
+ default: ;
+ }
+
+- if (len > bufferLim - bufferEnd) {
++ // whether or not the request succeeds, `len` seems to be the app's preferred
++ // buffer fill size; remember it.
++ lastBufferRequestSize = len;
++ if (len > EXPAT_SAFE_PTR_DIFF(bufferLim, bufferEnd)
++ || buffer == NULL) {
+ #ifdef XML_CONTEXT_BYTES
+ int keep;
+ #endif /* defined XML_CONTEXT_BYTES */
+@@ -2063,7 +2125,9 @@ XML_GetBuffer(XML_Parser parser, int len
+ keep = XML_CONTEXT_BYTES;
+ neededSize += keep;
+ #endif /* defined XML_CONTEXT_BYTES */
+- if (neededSize <= bufferLim - buffer) {
++ if (buffer && bufferPtr
++ && neededSize
++ <= EXPAT_SAFE_PTR_DIFF(bufferLim, buffer)) {
+ #ifdef XML_CONTEXT_BYTES
+ if (keep < bufferPtr - buffer) {
+ int offset = (int)(bufferPtr - buffer) - keep;
+@@ -2072,8 +2136,11 @@ XML_GetBuffer(XML_Parser parser, int len
+ bufferPtr -= offset;
+ }
+ #else
+- memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
+- bufferEnd = buffer + (bufferEnd - bufferPtr);
++ memmove(buffer, bufferPtr,
++ EXPAT_SAFE_PTR_DIFF(bufferEnd, bufferPtr));
++ bufferEnd
++ = buffer
++ + EXPAT_SAFE_PTR_DIFF(bufferEnd, bufferPtr);
+ bufferPtr = buffer;
+ #endif /* not defined XML_CONTEXT_BYTES */
+ }
+@@ -2171,7 +2238,7 @@ XML_ResumeParser(XML_Parser parser)
+ }
+ ps_parsing = XML_PARSING;
+
+- errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
++ errorCode = callProcessor(parser, bufferPtr, parseEndPtr, &bufferPtr);
+
+ if (errorCode != XML_ERROR_NONE) {
+ eventEndPtr = eventPtr;
+@@ -2481,6 +2548,15 @@ MOZ_XML_ProcessingEntityValue(XML_Parser
+ }
+ /* END MOZILLA CHANGE */
+
++XML_Bool XMLCALL
++XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled) {
++ if (parser != NULL && (enabled == XML_TRUE || enabled == XML_FALSE)) {
++ parser->m_reparseDeferralEnabled = enabled;
++ return XML_TRUE;
++ }
++ return XML_FALSE;
++}
++
+ /* Initially tag->rawName always points into the parse buffer;
+ for those TAG instances opened while the current parse buffer was
+ processed, and not yet closed, we need to store tag->rawName in a more
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-enable-addons.patch b/firefox-enable-addons.patch
new file mode 100644
index 0000000..15d0707
--- /dev/null
+++ b/firefox-enable-addons.patch
@@ -0,0 +1,13 @@
+diff -up firefox-55.0/browser/app/profile/firefox.js.addons firefox-55.0/browser/app/profile/firefox.js
+--- firefox-55.0/browser/app/profile/firefox.js.addons 2017-08-02 10:58:30.566363833 +0200
++++ firefox-55.0/browser/app/profile/firefox.js 2017-08-02 10:59:15.377216959 +0200
+@@ -65,7 +65,8 @@ pref("extensions.systemAddon.update.url"
+
+ // Disable add-ons that are not installed by the user in all scopes by default.
+ // See the SCOPE constants in AddonManager.jsm for values to use here.
+-pref("extensions.autoDisableScopes", 15);
++pref("extensions.autoDisableScopes", 0);
++pref("extensions.showMismatchUI", false);
+ // Scopes to scan for changes at startup.
+ pref("extensions.startupScanScopes", 0);
+
diff --git a/firefox-gcc-build.patch b/firefox-gcc-build.patch
new file mode 100644
index 0000000..55017ad
--- /dev/null
+++ b/firefox-gcc-build.patch
@@ -0,0 +1,38 @@
+--- firefox-80.0.1/toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h 2020-08-31 10:04:19.000000000 -0400
++++ firefox-80.0.1/toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h 2020-09-12 07:24:35.298931628 -0400
+@@ -1962,7 +1962,7 @@ struct kernel_statfs {
+ LSS_ENTRYPOINT \
+ "pop %%ebx" \
+ args \
+- : "esp", "memory"); \
++ : "memory"); \
+ LSS_RETURN(type,__res)
+ #undef _syscall0
+ #define _syscall0(type,name) \
+@@ -2019,7 +2019,7 @@ struct kernel_statfs {
+ : "i" (__NR_##name), "ri" ((long)(arg1)), \
+ "c" ((long)(arg2)), "d" ((long)(arg3)), \
+ "S" ((long)(arg4)), "D" ((long)(arg5)) \
+- : "esp", "memory"); \
++ : "memory"); \
+ LSS_RETURN(type,__res); \
+ }
+ #undef _syscall6
+@@ -2041,7 +2041,7 @@ struct kernel_statfs {
+ : "i" (__NR_##name), "0" ((long)(&__s)), \
+ "c" ((long)(arg2)), "d" ((long)(arg3)), \
+ "S" ((long)(arg4)), "D" ((long)(arg5)) \
+- : "esp", "memory"); \
++ : "memory"); \
+ LSS_RETURN(type,__res); \
+ }
+ LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
+@@ -2127,7 +2127,7 @@ struct kernel_statfs {
+ : "0"(-EINVAL), "i"(__NR_clone),
+ "m"(fn), "m"(child_stack), "m"(flags), "m"(arg),
+ "m"(parent_tidptr), "m"(newtls), "m"(child_tidptr)
+- : "esp", "memory", "ecx", "edx", "esi", "edi");
++ : "memory", "ecx", "edx", "esi", "edi");
+ LSS_RETURN(int, __res);
+ }
+
diff --git a/firefox-mozconfig b/firefox-mozconfig
new file mode 100644
index 0000000..952a799
--- /dev/null
+++ b/firefox-mozconfig
@@ -0,0 +1,29 @@
+. $topsrcdir/browser/config/mozconfig
+
+ac_add_options --allow-addon-sideload
+ac_add_options --disable-crashreporter
+ac_add_options --disable-strip
+ac_add_options --disable-updater
+ac_add_options --enable-av1
+ac_add_options --enable-chrome-format=omni
+ac_add_options --enable-js-shell
+ac_add_options --enable-necko-wifi
+ac_add_options --enable-official-branding
+ac_add_options --enable-pulseaudio
+ac_add_options --enable-release
+ac_add_options --enable-system-ffi
+ac_add_options --without-sysroot
+ac_add_options --without-system-icu
+ac_add_options --without-wasm-sandboxed-libraries
+ac_add_options --with-system-jpeg
+ac_add_options --with-system-zlib
+ac_add_options --with-unsigned-addon-scopes=app,system
+
+export BUILD_OFFICIAL=1
+export MOZILLA_OFFICIAL=1
+export MOZ_TELEMETRY_REPORTING=1
+export MOZ_UPDATE_CHANNEL=release
+export MOZ_APP_REMOTINGNAME=firefox
+mk_add_options BUILD_OFFICIAL=1
+mk_add_options MOZILLA_OFFICIAL=1
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir
diff --git a/firefox-nss-addon-hack.patch b/firefox-nss-addon-hack.patch
new file mode 100644
index 0000000..0322707
--- /dev/null
+++ b/firefox-nss-addon-hack.patch
@@ -0,0 +1,19 @@
+diff -up firefox-84.0.2/security/certverifier/NSSCertDBTrustDomain.cpp.nss-hack firefox-84.0.2/security/certverifier/NSSCertDBTrustDomain.cpp
+--- firefox-84.0.2/security/certverifier/NSSCertDBTrustDomain.cpp.nss-hack 2021-01-11 12:12:02.585514543 +0100
++++ firefox-84.0.2/security/certverifier/NSSCertDBTrustDomain.cpp 2021-01-11 12:47:50.345984582 +0100
+@@ -1619,6 +1619,15 @@ SECStatus InitializeNSS(const nsACString
+ return srv;
+ }
+
++ /* Sets the NSS_USE_ALG_IN_ANY_SIGNATURE bit.
++ * does not change NSS_USE_ALG_IN_CERT_SIGNATURE,
++ * so policy will still disable use of sha1 in
++ * certificate related signature processing. */
++ srv = NSS_SetAlgorithmPolicy(SEC_OID_SHA1, NSS_USE_ALG_IN_ANY_SIGNATURE, 0);
++ if (srv != SECSuccess) {
++ NS_WARNING("Unable to use SHA1 for Add-ons, expect broken/disabled Add-ons. See https://bugzilla.redhat.com/show_bug.cgi?id=1908018 for details.");
++ }
++
+ if (nssDbConfig == NSSDBConfig::ReadWrite) {
+ UniquePK11SlotInfo slot(PK11_GetInternalKeySlot());
+ if (!slot) {
diff --git a/firefox-redhat-default-prefs.js b/firefox-redhat-default-prefs.js
new file mode 100644
index 0000000..cdb98dd
--- /dev/null
+++ b/firefox-redhat-default-prefs.js
@@ -0,0 +1,38 @@
+pref("app.update.auto", false);
+pref("app.update.enabled", false);
+pref("app.update.autoInstallEnabled", false);
+pref("general.smoothScroll", true);
+pref("intl.locale.requested", "");
+pref("toolkit.storage.synchronous", 0);
+pref("toolkit.networkmanager.disable", false);
+pref("offline.autoDetect", true);
+pref("browser.backspace_action", 2);
+pref("browser.display.use_system_colors", true);
+pref("browser.download.folderList", 1);
+pref("browser.link.open_external", 3);
+pref("browser.shell.checkDefaultBrowser", false);
+pref("network.manage-offline-status", true);
+pref("extensions.shownSelectionUI", true);
+pref("ui.SpellCheckerUnderlineStyle", 1);
+pref("startup.homepage_override_url", "%HOMEPAGE%");
+pref("startup.homepage_welcome_url", "%HOMEPAGE%");
+pref("browser.startup.homepage", "data:text/plain,browser.startup.homepage=file:///%PREFIX%/share/doc/HTML/index.html");
+pref("media.gmp-gmpopenh264.autoupdate",true);
+pref("media.gmp-gmpopenh264.enabled",false);
+pref("media.gmp.decoder.enabled", true);
+pref("plugins.notifyMissingFlash", false);
+/* See https://bugzilla.redhat.com/show_bug.cgi?id=1226489 */
+pref("browser.display.use_system_colors", false);
+/* Allow sending credetials to all https:// sites */
+pref("network.negotiate-auth.trusted-uris", "https://");
+pref("security.use_sqldb", false);
+pref("spellchecker.dictionary_path","/usr/share/myspell");
+/* Disable DoH by default */
+pref("network.trr.mode", 5);
+/* Enable per-user policy dir, see mozbz#1583466 */
+pref("browser.policies.perUserDir", true);
+pref("browser.gnome-search-provider.enabled",true);
+/* Enable ffvpx playback for WebRTC */
+pref("media.navigator.mediadatadecoder_vpx_enabled", true);
+/* See https://bugzilla.redhat.com/show_bug.cgi?id=1672424 */
+pref("storage.nfs_filesystem", true);
diff --git a/firefox-search-provider.ini b/firefox-search-provider.ini
new file mode 100644
index 0000000..3868e3d
--- /dev/null
+++ b/firefox-search-provider.ini
@@ -0,0 +1,5 @@
+[Shell Search Provider]
+DesktopId=firefox.desktop
+BusName=org.mozilla.Firefox.SearchProvider
+ObjectPath=/org/mozilla/Firefox/SearchProvider
+Version=2
diff --git a/firefox-symbolic.svg b/firefox-symbolic.svg
new file mode 100644
index 0000000..8ecd135
--- /dev/null
+++ b/firefox-symbolic.svg
@@ -0,0 +1,3 @@
+<svg id="Assets" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
+ <path d="M190.368 150.591c0.157 0.009 0.079 0.003 0 0zm-57.874-28.933c0.158 0.008 0.079 0.003 0 0zm346.228 44.674c-10.445-25.123-31.6-52.248-48.211-60.82 13.52 26.5 21.345 53.093 24.335 72.935 0 0.04 0.015 0.136 0.047 0.4-27.175-67.732-73.254-95.047-110.886-154.512-1.9-3.008-3.805-6.022-5.661-9.2a73.237 73.237 0 0 1-2.646-4.972 43.757 43.757 0 0 1-3.585-9.5 0.625 0.625 0 0 0-0.546-0.644 0.8 0.8 0 0 0-0.451 0c-0.033 0.011-0.084 0.051-0.119 0.065-0.053 0.02-0.12 0.069-0.176 0.095 0.026-0.036 0.083-0.117 0.1-0.135-53.437 31.3-75.587 86.093-81.282 120.97a128.057 128.057 0 0 0-47.624 12.153 6.144 6.144 0 0 0-3.041 7.63 6.034 6.034 0 0 0 8.192 3.525 116.175 116.175 0 0 1 41.481-10.826c0.468-0.033 0.937-0.062 1.405-0.1a117.624 117.624 0 0 1 5.932-0.211 120.831 120.831 0 0 1 34.491 4.777c0.654 0.192 1.295 0.414 1.946 0.616a120.15 120.15 0 0 1 5.539 1.842 121.852 121.852 0 0 1 3.992 1.564c1.074 0.434 2.148 0.868 3.206 1.331a118.453 118.453 0 0 1 4.9 2.307c0.743 0.368 1.485 0.735 2.217 1.117a120.535 120.535 0 0 1 4.675 2.587 107.785 107.785 0 0 1 2.952 1.776 123.018 123.018 0 0 1 42.028 43.477c-12.833-9.015-35.81-17.918-57.947-14.068 86.441 43.214 63.234 192.027-56.545 186.408a106.7 106.7 0 0 1-31.271-6.031 132.461 132.461 0 0 1-7.059-2.886c-1.356-0.618-2.711-1.243-4.051-1.935-29.349-15.168-53.583-43.833-56.611-78.643 0 0 11.093-41.335 79.433-41.335 7.388 0 28.508-20.614 28.9-26.593-0.09-1.953-41.917-18.59-58.223-34.656-8.714-8.585-12.851-12.723-16.514-15.829a71.7 71.7 0 0 0-6.225-4.7 111.335 111.335 0 0 1-0.675-58.733c-24.687 11.242-43.89 29.011-57.849 44.7h-0.111c-9.528-12.067-8.855-51.873-8.312-60.184-0.114-0.516-7.107 3.63-8.024 4.254a175.21 175.21 0 0 0-23.486 20.12 210.5 210.5 0 0 0-22.443 26.913c0 0.012-0.007 0.025-0.011 0.037 0-0.012 0.007-0.025 0.011-0.038a202.837 202.837 0 0 0-32.244 72.81c-0.058 0.265-2.29 10.054-3.92 22.147a265.794 265.794 0 0 0-0.769 5.651c-0.558 3.636-0.992 7.6-1.42 13.767-0.019 0.239-0.031 0.474-0.048 0.712a591.152 591.152 0 0 0-0.481 7.995c0 0.411-0.025 0.816-0.025 1.227 0 132.709 107.6 240.29 240.324 240.29 118.865 0 217.559-86.288 236.882-199.63 0.407-3.075 0.732-6.168 1.092-9.27 4.777-41.21-0.53-84.525-15.588-120.747zm-164.068 72.1z" fill="#fff"/>
+</svg>
diff --git a/firefox-tests-xpcshell-freeze.patch b/firefox-tests-xpcshell-freeze.patch
new file mode 100644
index 0000000..1115417
--- /dev/null
+++ b/firefox-tests-xpcshell-freeze.patch
@@ -0,0 +1,14 @@
+diff -up firefox-88.0/testing/xpcshell/runxpcshelltests.py.old firefox-88.0/testing/xpcshell/runxpcshelltests.py
+--- firefox-88.0/testing/xpcshell/runxpcshelltests.py.old 2021-04-30 10:45:14.466616224 +0200
++++ firefox-88.0/testing/xpcshell/runxpcshelltests.py 2021-04-30 10:45:21.339525085 +0200
+@@ -1382,8 +1382,8 @@ class XPCShellTests(object):
+ self.log.info("Process %s" % label)
+ self.log.info(msg)
+
+- dumpOutput(proc.stdout, "stdout")
+- dumpOutput(proc.stderr, "stderr")
++ #dumpOutput(proc.stdout, "stdout")
++ #dumpOutput(proc.stderr, "stderr")
+ self.nodeProc = {}
+
+ def startHttp3Server(self):
diff --git a/firefox-x11.desktop b/firefox-x11.desktop
new file mode 100644
index 0000000..4124891
--- /dev/null
+++ b/firefox-x11.desktop
@@ -0,0 +1,235 @@
+[Desktop Entry]
+Version=1.0
+Name=Firefox on X11
+GenericName=Web Browser
+Comment=Browse the Web
+Exec=firefox-x11 --name firefox-x11 %u
+Icon=firefox
+Terminal=false
+Type=Application
+MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https;
+StartupNotify=true
+Categories=Network;WebBrowser;
+Keywords=web;browser;internet;
+Actions=new-window;new-private-window;profile-manager-window;
+
+[Desktop Action new-window]
+Name=Open a New Window
+Name[ach]=Dirica manyen
+Name[af]=Nuwe venster
+Name[an]=Nueva finestra
+Name[ar]=نافذة جديدة
+Name[as]=নতুন উইন্ডো
+Name[ast]=Ventana nueva
+Name[az]=Yeni Pəncərə
+Name[be]=Новае акно
+Name[bg]=Нов прозорец
+Name[bn_BD]=নতুন উইন্ডো (N)
+Name[bn_IN]=নতুন উইন্ডো
+Name[br]=Prenestr nevez
+Name[brx]=गोदान उइन्ड'(N)
+Name[bs]=Novi prozor
+Name[ca]=Finestra nova
+Name[cak]=K'ak'a' tzuwäch
+Name[cs]=Nové okno
+Name[cy]=Ffenestr Newydd
+Name[da]=Nyt vindue
+Name[de]=Neues Fenster
+Name[dsb]=Nowe wokno
+Name[el]=Νέο παράθυρο
+Name[en_GB]=New Window
+Name[en_US]=New Window
+Name[en_ZA]=New Window
+Name[eo]=Nova fenestro
+Name[es_AR]=Nueva ventana
+Name[es_CL]=Nueva ventana
+Name[es_ES]=Nueva ventana
+Name[es_MX]=Nueva ventana
+Name[et]=Uus aken
+Name[eu]=Leiho berria
+Name[fa]=پنجره جدید‌
+Name[ff]=Henorde Hesere
+Name[fi]=Uusi ikkuna
+Name[fr]=Nouvelle fenêtre
+Name[fy_NL]=Nij finster
+Name[ga_IE]=Fuinneog Nua
+Name[gd]=Uinneag ùr
+Name[gl]=Nova xanela
+Name[gn]=Ovetã pyahu
+Name[gu_IN]=નવી વિન્ડો
+Name[he]=חלון חדש
+Name[hi_IN]=नया विंडो
+Name[hr]=Novi prozor
+Name[hsb]=Nowe wokno
+Name[hu]=Új ablak
+Name[hy_AM]=Նոր Պատուհան
+Name[id]=Jendela Baru
+Name[is]=Nýr gluggi
+Name[it]=Nuova finestra
+Name[ja]=新しいウィンドウ
+Name[ja_JP-mac]=新規ウインドウ
+Name[ka]=ახალი ფანჯარა
+Name[kk]=Жаңа терезе
+Name[km]=បង្អួច​​​ថ្មី
+Name[kn]=ಹೊಸ ಕಿಟಕಿ
+Name[ko]=새 창
+Name[kok]=नवें जनेल
+Name[ks]=نئئ وِنڈو
+Name[lij]=Neuvo barcon
+Name[lo]=ຫນ້າຕ່າງໃຫມ່
+Name[lt]=Naujas langas
+Name[ltg]=Jauns lūgs
+Name[lv]=Jauns logs
+Name[mai]=नव विंडो
+Name[mk]=Нов прозорец
+Name[ml]=പുതിയ ജാലകം
+Name[mr]=नवीन पटल
+Name[ms]=Tetingkap Baru
+Name[my]=ဝင်းဒိုးအသစ်
+Name[nb_NO]=Nytt vindu
+Name[ne_NP]=नयाँ सञ्झ्याल
+Name[nl]=Nieuw venster
+Name[nn_NO]=Nytt vindauge
+Name[or]=ନୂତନ ୱିଣ୍ଡୋ
+Name[pa_IN]=ਨਵੀਂ ਵਿੰਡੋ
+Name[pl]=Nowe okno
+Name[pt_BR]=Nova janela
+Name[pt_PT]=Nova janela
+Name[rm]=Nova fanestra
+Name[ro]=Fereastră nouă
+Name[ru]=Новое окно
+Name[sat]=नावा विंडो (N)
+Name[si]=නව කවුළුවක්
+Name[sk]=Nové okno
+Name[sl]=Novo okno
+Name[son]=Zanfun taaga
+Name[sq]=Dritare e Re
+Name[sr]=Нови прозор
+Name[sv_SE]=Nytt fönster
+Name[ta]=புதிய சாளரம்
+Name[te]=కొత్త విండో
+Name[th]=หน้าต่างใหม่
+Name[tr]=Yeni pencere
+Name[tsz]=Eraatarakua jimpani
+Name[uk]=Нове вікно
+Name[ur]=نیا دریچہ
+Name[uz]=Yangi oyna
+Name[vi]=Cửa sổ mới
+Name[wo]=Palanteer bu bees
+Name[xh]=Ifestile entsha
+Name[zh_CN]=新建窗口
+Name[zh_TW]=開新視窗
+Exec=firefox-x11 --name firefox-x11 --new-window %u
+
+[Desktop Action new-private-window]
+Name=Open a New Private Window
+Name[ach]=Dirica manyen me mung
+Name[af]=Nuwe privaatvenster
+Name[an]=Nueva finestra privada
+Name[ar]=نافذة خاصة جديدة
+Name[as]=নতুন ব্যক্তিগত উইন্ডো
+Name[ast]=Ventana privada nueva
+Name[az]=Yeni Məxfi Pəncərə
+Name[be]=Новае акно адасаблення
+Name[bg]=Нов прозорец за поверително сърфиране
+Name[bn_BD]=নতুন ব্যক্তিগত উইন্ডো
+Name[bn_IN]=নতুন ব্যক্তিগত উইন্ডো
+Name[br]=Prenestr merdeiñ prevez nevez
+Name[brx]=गोदान प्राइभेट उइन्ड'
+Name[bs]=Novi privatni prozor
+Name[ca]=Finestra privada nova
+Name[cak]=K'ak'a' ichinan tzuwäch
+Name[cs]=Nové anonymní okno
+Name[cy]=Ffenestr Breifat Newydd
+Name[da]=Nyt privat vindue
+Name[de]=Neues privates Fenster
+Name[dsb]=Nowe priwatne wokno
+Name[el]=Νέο παράθυρο ιδιωτικής περιήγησης
+Name[en_GB]=New Private Window
+Name[en_US]=New Private Window
+Name[en_ZA]=New Private Window
+Name[eo]=Nova privata fenestro
+Name[es_AR]=Nueva ventana privada
+Name[es_CL]=Nueva ventana privada
+Name[es_ES]=Nueva ventana privada
+Name[es_MX]=Nueva ventana privada
+Name[et]=Uus privaatne aken
+Name[eu]=Leiho pribatu berria
+Name[fa]=پنجره ناشناس جدید
+Name[ff]=Henorde Suturo Hesere
+Name[fi]=Uusi yksityinen ikkuna
+Name[fr]=Nouvelle fenêtre de navigation privée
+Name[fy_NL]=Nij priveefinster
+Name[ga_IE]=Fuinneog Nua Phríobháideach
+Name[gd]=Uinneag phrìobhaideach ùr
+Name[gl]=Nova xanela privada
+Name[gn]=Ovetã ñemi pyahu
+Name[gu_IN]=નવી ખાનગી વિન્ડો
+Name[he]=חלון פרטי חדש
+Name[hi_IN]=नयी निजी विंडो
+Name[hr]=Novi privatni prozor
+Name[hsb]=Nowe priwatne wokno
+Name[hu]=Új privát ablak
+Name[hy_AM]=Սկսել Գաղտնի դիտարկում
+Name[id]=Jendela Mode Pribadi Baru
+Name[is]=Nýr huliðsgluggi
+Name[it]=Nuova finestra anonima
+Name[ja]=新しいプライベートウィンドウ
+Name[ja_JP-mac]=新規プライベートウインドウ
+Name[ka]=ახალი პირადი ფანჯარა
+Name[kk]=Жаңа жекелік терезе
+Name[km]=បង្អួច​ឯកជន​ថ្មី
+Name[kn]=ಹೊಸ ಖಾಸಗಿ ಕಿಟಕಿ
+Name[ko]=새 사생활 보호 모드
+Name[kok]=नवो खाजगी विंडो
+Name[ks]=نْو پرایوٹ وینڈو&amp;
+Name[lij]=Neuvo barcon privou
+Name[lo]=ເປີດຫນ້າຕ່າງສວນຕົວຂື້ນມາໃຫມ່
+Name[lt]=Naujas privataus naršymo langas
+Name[ltg]=Jauns privatais lūgs
+Name[lv]=Jauns privātais logs
+Name[mai]=नया निज विंडो (W)
+Name[mk]=Нов приватен прозорец
+Name[ml]=പുതിയ സ്വകാര്യ ജാലകം
+Name[mr]=नवीन वैयक्तिक पटल
+Name[ms]=Tetingkap Persendirian Baharu
+Name[my]=New Private Window
+Name[nb_NO]=Nytt privat vindu
+Name[ne_NP]=नयाँ निजी सञ्झ्याल
+Name[nl]=Nieuw privévenster
+Name[nn_NO]=Nytt privat vindauge
+Name[or]=ନୂତନ ବ୍ୟକ୍ତିଗତ ୱିଣ୍ଡୋ
+Name[pa_IN]=ਨਵੀਂ ਪ੍ਰਾਈਵੇਟ ਵਿੰਡੋ
+Name[pl]=Nowe okno prywatne
+Name[pt_BR]=Nova janela privativa
+Name[pt_PT]=Nova janela privada
+Name[rm]=Nova fanestra privata
+Name[ro]=Fereastră privată nouă
+Name[ru]=Новое приватное окно
+Name[sat]=नावा निजेराक् विंडो (W )
+Name[si]=නව පුද්ගලික කවුළුව (W)
+Name[sk]=Nové okno v režime Súkromné prehliadanie
+Name[sl]=Novo zasebno okno
+Name[son]=Sutura zanfun taaga
+Name[sq]=Dritare e Re Private
+Name[sr]=Нови приватан прозор
+Name[sv_SE]=Nytt privat fönster
+Name[ta]=புதிய தனிப்பட்ட சாளரம்
+Name[te]=కొత్త ఆంతరంగిక విండో
+Name[th]=หน้าต่างส่วนตัวใหม่
+Name[tr]=Yeni gizli pencere
+Name[tsz]=Juchiiti eraatarakua jimpani
+Name[uk]=Приватне вікно
+Name[ur]=نیا نجی دریچہ
+Name[uz]=Yangi maxfiy oyna
+Name[vi]=Cửa sổ riêng tư mới
+Name[wo]=Panlanteeru biir bu bees
+Name[xh]=Ifestile yangasese entsha
+Name[zh_CN]=新建隐私浏览窗口
+Name[zh_TW]=新增隱私視窗
+Exec=firefox-x11 --private-window --name firefox-x11 %u
+
+[Desktop Action profile-manager-window]
+Name=Open the Profile Manager
+Name[cs]=Správa profilů
+Exec=firefox-x11 --name firefox-x11 --ProfileManager
diff --git a/firefox-x11.sh.in b/firefox-x11.sh.in
new file mode 100644
index 0000000..94045c9
--- /dev/null
+++ b/firefox-x11.sh.in
@@ -0,0 +1,7 @@
+#!/usr/bin/bash
+#
+# Run Firefox on X11 backend
+#
+
+export MOZ_DISABLE_WAYLAND=1
+exec /__PREFIX__/bin/firefox "$@"
diff --git a/firefox.1 b/firefox.1
new file mode 100644
index 0000000..556cf07
--- /dev/null
+++ b/firefox.1
@@ -0,0 +1,141 @@
+.TH FIREFOX 1 "November 30, 2017" firefox "Linux User's Manual"
+.SH NAME
+firefox \- a Web browser for X11 derived from the Mozilla browser
+
+.SH SYNOPSIS
+.B firefox
+[\fIOPTIONS\fR ...] [\fIURL\fR]
+
+.B firefox-bin
+[\fIOPTIONS\fR] [\fIURL\fR]
+
+.SH DESCRIPTION
+\fBMozilla Firefox\fR is an open-source web browser, designed for
+standards compliance, performance and portability.
+
+.SH USAGE
+\fBfirefox\fR is a simple shell script that will set up the
+environment for the actual executable, \fBfirefox-bin\fR.
+
+.SH OPTIONS
+A summary of the options supported by \fBfirefox\fR is included below.
+
+.SS "X11 options"
+.TP
+.BI \-\-display= DISPLAY
+X display to use
+.TP
+.B \--sync
+Make X calls synchronous
+.TP
+.B \-\-g-fatal-warnings
+Make all warnings fatal
+
+.SS "Firefox options"
+.TP
+.B \-h, \-help
+Show summary of options.
+.TP
+.B \-v, \-version
+Print Firefox version.
+.TP
+\fB\-P\fR \fIprofile\fR
+Start with \fIprofile\fR.
+.TP
+\fB\-\-profile\fR \fIpath\fR
+Start with profile at \fIpath\fR.
+.TP
+\fB\-\-migration\fR
+Start with migration wizard.
+.TP
+.B \-\-ProfileManager
+Start with ProfileManager.
+.TP
+\fB\-\-no\-remote\fR
+Do not accept or send remote commands; implies \fB--new-instance\fR.
+.TP
+\fB\-\-new\-instance\fR
+Open new instance, not a new window in running instance.
+.TP
+\fB\-\-UILocale\fR \fIlocale\fR
+Start with \fIlocale\fR resources as UI Locale.
+.TP
+\fB\-\-safe\-mode\fR
+Disables extensions and themes for this session.
+.TP
+\fB\-\-headless\fR
+Run without a GUI.
+.TP
+\fB\-\-marionette\fR
+Enable remote control server.
+.TP
+\fB\-\-browser\fR
+Open a browser window.
+.TP
+\fB\-\-new-window\fR \fIurl\fR
+Open \fIurl\fR in a new window.
+.TP
+\fB\-\-new-tab\fR \fIurl\fR
+Open \fIurl\fR in a new tab.
+.TP
+\fB\-\-private-window\fR \fIurl\fR
+Open \fIurl\fR in a new private window.
+.TP
+\fB\-\-preferences\fR
+Open Preferences dialog.
+.TP
+\fB\-\-screenshot\fR [\fIpath\fR]
+Save screenshot to \fIpath\fR or in working directory.
+.TP
+\fB\-\-window-size\fR \fIwidth\fR[,\fIheight\fR]
+Width and optionally height of screenshot.
+.TP
+\fB\-\-search\fR \fIterm\fR
+Search \fIterm\fR with your default search engine.
+.TP
+
+
+\fB\-\-jsconsole\fR
+Open the Browser Console.
+.TP
+\fB\-\-jsdebugger\fR
+Open the Browser Toolbox.
+.TP
+\fB\-\-wait-for-jsdebugger\fR
+Spin event loop until JS debugger connects. Enables debugging (some) application startup code paths. Only has an effect when \fI--jsdebugger\fR is also supplied.
+.TP
+\fB\-\-devtools\fR
+Open DevTools on initial load.
+.TP
+\fB\-\-start-debugger-server\fR [ws:][\fIport\fR|\fIpath\fR]
+Start the debugger server on a TCP port or Unix domain socket path. Defaults to TCP port 6000. Use WebSocket protocol if ws: prefix is specified.
+.TP
+\fB\-\-recording\fR \fIfile\fR
+Record drawing for a given URL.
+.TP
+\fB\-\-recording-output\fR \fIfile\fR
+Specify destination file for a drawing recording.
+.TP
+\fB\-\-setDefaultBrowser\fR
+Set this app as the default browser.
+
+.SH FILES
+\fI/usr/bin/firefox\fR - shell script wrapping
+\fBfirefox\fR
+.br
+\fI/usr/lib64/firefox/firefox-bin\fR - \fBfirefox\fR
+executable
+
+.SH VERSION
+57.0
+
+.SH BUGS
+To report a bug, please visit \fIhttp://bugzilla.mozilla.org/\fR
+
+.SH AUTHORS
+.TP
+.B The Mozilla Organization
+.I http://www.mozilla.org/about.html
+.TP
+.B Tobias Girstmair
+.I https://gir.st/
diff --git a/firefox.appdata.xml.in b/firefox.appdata.xml.in
new file mode 100644
index 0000000..bfa9afc
--- /dev/null
+++ b/firefox.appdata.xml.in
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2019 Firefox contributors -->
+<component type="desktop">
+ <id>firefox.desktop</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <name>Firefox</name>
+ <summary>Web Browser</summary>
+ <summary xml:lang="ca">Navegador web</summary>
+ <summary xml:lang="cs">Webový prohlížeč</summary>
+ <summary xml:lang="es">Navegador web</summary>
+ <summary xml:lang="fa">مرورگر اینترنتی</summary>
+ <summary xml:lang="fi">WWW-selain</summary>
+ <summary xml:lang="fr">Navigateur Web</summary>
+ <summary xml:lang="hu">Webböngésző</summary>
+ <summary xml:lang="it">Browser Web</summary>
+ <summary xml:lang="ja">ウェブ・ブラウザ</summary>
+ <summary xml:lang="ko">웹 브라우저</summary>
+ <summary xml:lang="nb">Nettleser</summary>
+ <summary xml:lang="nl">Webbrowser</summary>
+ <summary xml:lang="nn">Nettlesar</summary>
+ <summary xml:lang="no">Nettleser</summary>
+ <summary xml:lang="pl">Przeglądarka WWW</summary>
+ <summary xml:lang="pt">Navegador Web</summary>
+ <summary xml:lang="pt_BR">Navegador Web</summary>
+ <summary xml:lang="sk">Internetový prehliadač</summary>
+ <summary xml:lang="sv">Webbläsare</summary>
+ <description>
+ <p>
+ Bringing together all kinds of awesomeness to make browsing better for you.
+ Get to your favorite sites quickly – even if you don’t remember the URLs.
+ Type your term into the location bar (aka the Awesome Bar) and the autocomplete
+ function will include possible matches from your browsing history, bookmarked
+ sites and open tabs.
+ </p>
+ </description>
+ <url type="homepage">https://www.mozilla.org</url>
+ <update_contact>stransky@redhat.com</update_contact>
+ <kudos>
+ <kudo>ModernToolkit</kudo>
+ <kudo>SearchProvider</kudo>
+ </kudos>
+ <project_group>Mozilla</project_group>
+ <project_license>GPL-3.0+</project_license>
+ <developer_name>Mozilla Corporation</developer_name>
+ <url type="bugtracker">https://bugzilla.mozilla.org/</url>
+ <url type="help">https://support.mozilla.org/</url>
+ <translation type="gettext">firefox</translation>
+ <provides>
+ <id>firefox.desktop</id>
+ </provides>
+ <screenshots>
+ <screenshot type="default">https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/a.png</screenshot>
+ <screenshot>https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/b.png</screenshot>
+ <screenshot>https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/c.png</screenshot>
+ </screenshots>
+ <releases>
+ <release version="__VERSION__" date="__DATE__"/>
+ </releases>
+</component>
diff --git a/firefox.desktop b/firefox.desktop
new file mode 100644
index 0000000..a152ed4
--- /dev/null
+++ b/firefox.desktop
@@ -0,0 +1,275 @@
+[Desktop Entry]
+Version=1.0
+Name=Firefox
+GenericName=Web Browser
+GenericName[ca]=Navegador web
+GenericName[cs]=Webový prohlížeč
+GenericName[es]=Navegador web
+GenericName[fa]=مرورگر اینترنتی
+GenericName[fi]=WWW-selain
+GenericName[fr]=Navigateur Web
+GenericName[hu]=Webböngésző
+GenericName[it]=Browser Web
+GenericName[ja]=ウェブ・ブラウザ
+GenericName[ko]=웹 브라우저
+GenericName[nb]=Nettleser
+GenericName[nl]=Webbrowser
+GenericName[nn]=Nettlesar
+GenericName[no]=Nettleser
+GenericName[pl]=Przeglądarka WWW
+GenericName[pt]=Navegador Web
+GenericName[pt_BR]=Navegador Web
+GenericName[sk]=Internetový prehliadač
+GenericName[sv]=Webbläsare
+Comment=Browse the Web
+Comment[ca]=Navegueu per el web
+Comment[cs]=Prohlížení stránek World Wide Webu
+Comment[de]=Im Internet surfen
+Comment[es]=Navegue por la web
+Comment[fa]=صفحات شبکه جهانی اینترنت را مرور نمایید
+Comment[fi]=Selaa Internetin WWW-sivuja
+Comment[fr]=Navigue sur Internet
+Comment[hu]=A világháló böngészése
+Comment[it]=Esplora il web
+Comment[ja]=ウェブを閲覧します
+Comment[ko]=웹을 돌아 다닙니다
+Comment[nb]=Surf på nettet
+Comment[nl]=Verken het internet
+Comment[nn]=Surf på nettet
+Comment[no]=Surf på nettet
+Comment[pl]=Przeglądanie stron WWW
+Comment[pt]=Navegue na Internet
+Comment[pt_BR]=Navegue na Internet
+Comment[sk]=Prehliadanie internetu
+Comment[sv]=Surfa på webben
+Exec=firefox %u
+Icon=firefox
+Terminal=false
+Type=Application
+MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https;
+StartupNotify=true
+Categories=Network;WebBrowser;
+Keywords=web;browser;internet;
+Actions=new-window;new-private-window;profile-manager-window;
+
+[Desktop Action new-window]
+Name=Open a New Window
+Name[ach]=Dirica manyen
+Name[af]=Nuwe venster
+Name[an]=Nueva finestra
+Name[ar]=نافذة جديدة
+Name[as]=নতুন উইন্ডো
+Name[ast]=Ventana nueva
+Name[az]=Yeni Pəncərə
+Name[be]=Новае акно
+Name[bg]=Нов прозорец
+Name[bn_BD]=নতুন উইন্ডো (N)
+Name[bn_IN]=নতুন উইন্ডো
+Name[br]=Prenestr nevez
+Name[brx]=गोदान उइन्ड'(N)
+Name[bs]=Novi prozor
+Name[ca]=Finestra nova
+Name[cak]=K'ak'a' tzuwäch
+Name[cs]=Nové okno
+Name[cy]=Ffenestr Newydd
+Name[da]=Nyt vindue
+Name[de]=Neues Fenster
+Name[dsb]=Nowe wokno
+Name[el]=Νέο παράθυρο
+Name[en_GB]=New Window
+Name[en_US]=New Window
+Name[en_ZA]=New Window
+Name[eo]=Nova fenestro
+Name[es_AR]=Nueva ventana
+Name[es_CL]=Nueva ventana
+Name[es_ES]=Nueva ventana
+Name[es_MX]=Nueva ventana
+Name[et]=Uus aken
+Name[eu]=Leiho berria
+Name[fa]=پنجره جدید‌
+Name[ff]=Henorde Hesere
+Name[fi]=Uusi ikkuna
+Name[fr]=Nouvelle fenêtre
+Name[fy_NL]=Nij finster
+Name[ga_IE]=Fuinneog Nua
+Name[gd]=Uinneag ùr
+Name[gl]=Nova xanela
+Name[gn]=Ovetã pyahu
+Name[gu_IN]=નવી વિન્ડો
+Name[he]=חלון חדש
+Name[hi_IN]=नया विंडो
+Name[hr]=Novi prozor
+Name[hsb]=Nowe wokno
+Name[hu]=Új ablak
+Name[hy_AM]=Նոր Պատուհան
+Name[id]=Jendela Baru
+Name[is]=Nýr gluggi
+Name[it]=Nuova finestra
+Name[ja]=新しいウィンドウ
+Name[ja_JP-mac]=新規ウインドウ
+Name[ka]=ახალი ფანჯარა
+Name[kk]=Жаңа терезе
+Name[km]=បង្អួច​​​ថ្មី
+Name[kn]=ಹೊಸ ಕಿಟಕಿ
+Name[ko]=새 창
+Name[kok]=नवें जनेल
+Name[ks]=نئئ وِنڈو
+Name[lij]=Neuvo barcon
+Name[lo]=ຫນ້າຕ່າງໃຫມ່
+Name[lt]=Naujas langas
+Name[ltg]=Jauns lūgs
+Name[lv]=Jauns logs
+Name[mai]=नव विंडो
+Name[mk]=Нов прозорец
+Name[ml]=പുതിയ ജാലകം
+Name[mr]=नवीन पटल
+Name[ms]=Tetingkap Baru
+Name[my]=ဝင်းဒိုးအသစ်
+Name[nb_NO]=Nytt vindu
+Name[ne_NP]=नयाँ सञ्झ्याल
+Name[nl]=Nieuw venster
+Name[nn_NO]=Nytt vindauge
+Name[or]=ନୂତନ ୱିଣ୍ଡୋ
+Name[pa_IN]=ਨਵੀਂ ਵਿੰਡੋ
+Name[pl]=Nowe okno
+Name[pt_BR]=Nova janela
+Name[pt_PT]=Nova janela
+Name[rm]=Nova fanestra
+Name[ro]=Fereastră nouă
+Name[ru]=Новое окно
+Name[sat]=नावा विंडो (N)
+Name[si]=නව කවුළුවක්
+Name[sk]=Nové okno
+Name[sl]=Novo okno
+Name[son]=Zanfun taaga
+Name[sq]=Dritare e Re
+Name[sr]=Нови прозор
+Name[sv_SE]=Nytt fönster
+Name[ta]=புதிய சாளரம்
+Name[te]=కొత్త విండో
+Name[th]=หน้าต่างใหม่
+Name[tr]=Yeni pencere
+Name[tsz]=Eraatarakua jimpani
+Name[uk]=Нове вікно
+Name[ur]=نیا دریچہ
+Name[uz]=Yangi oyna
+Name[vi]=Cửa sổ mới
+Name[wo]=Palanteer bu bees
+Name[xh]=Ifestile entsha
+Name[zh_CN]=新建窗口
+Name[zh_TW]=開新視窗
+Exec=firefox --new-window %u
+
+[Desktop Action new-private-window]
+Name=Open a New Private Window
+Name[ach]=Dirica manyen me mung
+Name[af]=Nuwe privaatvenster
+Name[an]=Nueva finestra privada
+Name[ar]=نافذة خاصة جديدة
+Name[as]=নতুন ব্যক্তিগত উইন্ডো
+Name[ast]=Ventana privada nueva
+Name[az]=Yeni Məxfi Pəncərə
+Name[be]=Новае акно адасаблення
+Name[bg]=Нов прозорец за поверително сърфиране
+Name[bn_BD]=নতুন ব্যক্তিগত উইন্ডো
+Name[bn_IN]=নতুন ব্যক্তিগত উইন্ডো
+Name[br]=Prenestr merdeiñ prevez nevez
+Name[brx]=गोदान प्राइभेट उइन्ड'
+Name[bs]=Novi privatni prozor
+Name[ca]=Finestra privada nova
+Name[cak]=K'ak'a' ichinan tzuwäch
+Name[cs]=Nové anonymní okno
+Name[cy]=Ffenestr Breifat Newydd
+Name[da]=Nyt privat vindue
+Name[de]=Neues privates Fenster
+Name[dsb]=Nowe priwatne wokno
+Name[el]=Νέο παράθυρο ιδιωτικής περιήγησης
+Name[en_GB]=New Private Window
+Name[en_US]=New Private Window
+Name[en_ZA]=New Private Window
+Name[eo]=Nova privata fenestro
+Name[es_AR]=Nueva ventana privada
+Name[es_CL]=Nueva ventana privada
+Name[es_ES]=Nueva ventana privada
+Name[es_MX]=Nueva ventana privada
+Name[et]=Uus privaatne aken
+Name[eu]=Leiho pribatu berria
+Name[fa]=پنجره ناشناس جدید
+Name[ff]=Henorde Suturo Hesere
+Name[fi]=Uusi yksityinen ikkuna
+Name[fr]=Nouvelle fenêtre de navigation privée
+Name[fy_NL]=Nij priveefinster
+Name[ga_IE]=Fuinneog Nua Phríobháideach
+Name[gd]=Uinneag phrìobhaideach ùr
+Name[gl]=Nova xanela privada
+Name[gn]=Ovetã ñemi pyahu
+Name[gu_IN]=નવી ખાનગી વિન્ડો
+Name[he]=חלון פרטי חדש
+Name[hi_IN]=नयी निजी विंडो
+Name[hr]=Novi privatni prozor
+Name[hsb]=Nowe priwatne wokno
+Name[hu]=Új privát ablak
+Name[hy_AM]=Սկսել Գաղտնի դիտարկում
+Name[id]=Jendela Mode Pribadi Baru
+Name[is]=Nýr huliðsgluggi
+Name[it]=Nuova finestra anonima
+Name[ja]=新しいプライベートウィンドウ
+Name[ja_JP-mac]=新規プライベートウインドウ
+Name[ka]=ახალი პირადი ფანჯარა
+Name[kk]=Жаңа жекелік терезе
+Name[km]=បង្អួច​ឯកជន​ថ្មី
+Name[kn]=ಹೊಸ ಖಾಸಗಿ ಕಿಟಕಿ
+Name[ko]=새 사생활 보호 모드
+Name[kok]=नवो खाजगी विंडो
+Name[ks]=نْو پرایوٹ وینڈو&amp;
+Name[lij]=Neuvo barcon privou
+Name[lo]=ເປີດຫນ້າຕ່າງສວນຕົວຂື້ນມາໃຫມ່
+Name[lt]=Naujas privataus naršymo langas
+Name[ltg]=Jauns privatais lūgs
+Name[lv]=Jauns privātais logs
+Name[mai]=नया निज विंडो (W)
+Name[mk]=Нов приватен прозорец
+Name[ml]=പുതിയ സ്വകാര്യ ജാലകം
+Name[mr]=नवीन वैयक्तिक पटल
+Name[ms]=Tetingkap Persendirian Baharu
+Name[my]=New Private Window
+Name[nb_NO]=Nytt privat vindu
+Name[ne_NP]=नयाँ निजी सञ्झ्याल
+Name[nl]=Nieuw privévenster
+Name[nn_NO]=Nytt privat vindauge
+Name[or]=ନୂତନ ବ୍ୟକ୍ତିଗତ ୱିଣ୍ଡୋ
+Name[pa_IN]=ਨਵੀਂ ਪ੍ਰਾਈਵੇਟ ਵਿੰਡੋ
+Name[pl]=Nowe okno prywatne
+Name[pt_BR]=Nova janela privativa
+Name[pt_PT]=Nova janela privada
+Name[rm]=Nova fanestra privata
+Name[ro]=Fereastră privată nouă
+Name[ru]=Новое приватное окно
+Name[sat]=नावा निजेराक् विंडो (W )
+Name[si]=නව පුද්ගලික කවුළුව (W)
+Name[sk]=Nové okno v režime Súkromné prehliadanie
+Name[sl]=Novo zasebno okno
+Name[son]=Sutura zanfun taaga
+Name[sq]=Dritare e Re Private
+Name[sr]=Нови приватан прозор
+Name[sv_SE]=Nytt privat fönster
+Name[ta]=புதிய தனிப்பட்ட சாளரம்
+Name[te]=కొత్త ఆంతరంగిక విండో
+Name[th]=หน้าต่างส่วนตัวใหม่
+Name[tr]=Yeni gizli pencere
+Name[tsz]=Juchiiti eraatarakua jimpani
+Name[uk]=Приватне вікно
+Name[ur]=نیا نجی دریچہ
+Name[uz]=Yangi maxfiy oyna
+Name[vi]=Cửa sổ riêng tư mới
+Name[wo]=Panlanteeru biir bu bees
+Name[xh]=Ifestile yangasese entsha
+Name[zh_CN]=新建隐私浏览窗口
+Name[zh_TW]=新增隱私視窗
+Exec=firefox --private-window %u
+
+[Desktop Action profile-manager-window]
+Name=Open the Profile Manager
+Name[cs]=Správa profilů
+Name[de]=Profilverwaltung öffnen
+Exec=firefox --ProfileManager
diff --git a/firefox.sh.in b/firefox.sh.in
new file mode 100644
index 0000000..6a3f6e4
--- /dev/null
+++ b/firefox.sh.in
@@ -0,0 +1,292 @@
+#!/usr/bin/bash
+#
+# The contents of this file are subject to the Netscape Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/NPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is Netscape
+# Communications Corporation. Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s):
+#
+
+##
+## Usage:
+##
+## $ firefox
+##
+## This script is meant to run a mozilla program from the mozilla
+## rpm installation.
+##
+## The script will setup all the environment voodoo needed to make
+## mozilla work.
+
+cmdname=`basename $0`
+
+##
+## Variables
+##
+MOZ_ARCH=$(uname -m)
+case $MOZ_ARCH in
+ x86_64 | s390x | sparc64)
+ MOZ_LIB_DIR="/__PREFIX__/lib64"
+ SECONDARY_LIB_DIR="/__PREFIX__/lib"
+ ;;
+ * )
+ MOZ_LIB_DIR="/__PREFIX__/lib"
+ SECONDARY_LIB_DIR="/__PREFIX__/lib64"
+ ;;
+esac
+
+MOZ_FIREFOX_FILE="firefox"
+
+if [ ! -r $MOZ_LIB_DIR/firefox/$MOZ_FIREFOX_FILE ]; then
+ if [ ! -r $SECONDARY_LIB_DIR/firefox/$MOZ_FIREFOX_FILE ]; then
+ echo "Error: $MOZ_LIB_DIR/firefox/$MOZ_FIREFOX_FILE not found"
+ if [ -d $SECONDARY_LIB_DIR ]; then
+ echo " $SECONDARY_LIB_DIR/firefox/$MOZ_FIREFOX_FILE not found"
+ fi
+ exit 1
+ fi
+ MOZ_LIB_DIR="$SECONDARY_LIB_DIR"
+fi
+MOZ_DIST_BIN="$MOZ_LIB_DIR/firefox"
+MOZ_LANGPACKS_DIR="$MOZ_DIST_BIN/langpacks"
+MOZ_EXTENSIONS_PROFILE_DIR="$HOME/.mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
+MOZ_PROGRAM="$MOZ_DIST_BIN/$MOZ_FIREFOX_FILE"
+MOZ_LAUNCHER="$MOZ_DIST_BIN/run-mozilla.sh"
+GETENFORCE_FILE="/usr/sbin/getenforce"
+
+##
+## Enable Wayland backend?
+##
+%DISABLE_WAYLAND_PLACEHOLDER%
+
+if ! [ $MOZ_DISABLE_WAYLAND ] && [ "$WAYLAND_DISPLAY" ]; then
+ if [ "$XDG_CURRENT_DESKTOP" == "GNOME" ]; then
+ export MOZ_ENABLE_WAYLAND=1
+ fi
+## Enable Wayland on KDE/Sway
+##
+ if [ "$XDG_SESSION_TYPE" == "wayland" ]; then
+ export MOZ_ENABLE_WAYLAND=1
+ fi
+fi
+
+##
+## Use D-Bus remote exclusively when there's Wayland display.
+##
+if [ "$WAYLAND_DISPLAY" ]; then
+ export MOZ_DBUS_REMOTE=1
+fi
+
+##
+## Set MOZ_GRE_CONF
+##
+MOZ_GRE_CONF=/etc/gre.d/gre.conf
+if [ "$MOZ_LIB_DIR" == "/__PREFIX__/lib64" ]; then
+ MOZ_GRE_CONF=/etc/gre.d/gre64.conf
+fi
+export MOZ_GRE_CONF
+
+##
+## Set MOZILLA_FIVE_HOME
+##
+MOZILLA_FIVE_HOME="$MOZ_DIST_BIN"
+
+export MOZILLA_FIVE_HOME
+
+##
+## Make sure that we set the plugin path
+##
+MOZ_PLUGIN_DIR="plugins"
+
+if [ "$MOZ_PLUGIN_PATH" ]
+then
+ MOZ_PLUGIN_PATH=$MOZ_PLUGIN_PATH:$MOZ_LIB_DIR/mozilla/$MOZ_PLUGIN_DIR:$MOZ_DIST_BIN/$MOZ_PLUGIN_DIR
+else
+ MOZ_PLUGIN_PATH=$MOZ_LIB_DIR/mozilla/$MOZ_PLUGIN_DIR:$MOZ_DIST_BIN/$MOZ_PLUGIN_DIR
+fi
+export MOZ_PLUGIN_PATH
+
+##
+## Set MOZ_APP_LAUNCHER for gnome-session
+##
+export MOZ_APP_LAUNCHER="/__PREFIX__/bin/firefox"
+
+##
+## Set FONTCONFIG_PATH for Xft/fontconfig
+##
+FONTCONFIG_PATH="/etc/fonts:${MOZILLA_FIVE_HOME}/res/Xft"
+export FONTCONFIG_PATH
+
+##
+## We want Firefox to use Openh264 provided by Fedora
+##
+export MOZ_GMP_PATH=$MOZ_LIB_DIR/mozilla/plugins/gmp-gmpopenh264/system-installed
+
+##
+## In order to better support certain scripts (such as Indic and some CJK
+## scripts), Fedora builds its Firefox, with permission from the Mozilla
+## Corporation, with the Pango system as its text renderer. This change
+## may negatively impact performance on some pages. To disable the use of
+## Pango, set MOZ_DISABLE_PANGO=1 in your environment before launching
+## Firefox.
+##
+#
+# MOZ_DISABLE_PANGO=1
+# export MOZ_DISABLE_PANGO
+#
+
+##
+## Disable the GNOME crash dialog, Moz has it's own
+##
+GNOME_DISABLE_CRASH_DIALOG=1
+export GNOME_DISABLE_CRASH_DIALOG
+
+##
+## Disable the SLICE allocator (rhbz#1014858)
+##
+export G_SLICE=always-malloc
+
+##
+## Enable Xinput2 (mozbz#1207973)
+##
+export MOZ_USE_XINPUT2=1
+
+# OK, here's where all the real work gets done
+
+
+##
+## To disable the use of Firefox localization, set MOZ_DISABLE_LANGPACKS=1
+## in your environment before launching Firefox.
+##
+#
+# MOZ_DISABLE_LANGPACKS=1
+# export MOZ_DISABLE_LANGPACKS
+#
+
+##
+## Automatically installed langpacks are tracked by .fedora-langpack-install
+## config file.
+##
+FEDORA_LANGPACK_CONFIG="$MOZ_EXTENSIONS_PROFILE_DIR/.fedora-langpack-install"
+
+# MOZ_DISABLE_LANGPACKS disables language packs completely
+MOZILLA_DOWN=0
+if ! [ $MOZ_DISABLE_LANGPACKS ] || [ $MOZ_DISABLE_LANGPACKS -eq 0 ]; then
+ if [ -x $MOZ_DIST_BIN/$MOZ_FIREFOX_FILE ]; then
+ # Is firefox running?
+ /__PREFIX__/bin/pidof $MOZ_PROGRAM > /dev/null 2>&1
+ MOZILLA_DOWN=$?
+ fi
+fi
+
+# When Firefox is not running, restore SELinux labels for profile files
+# (rhbz#1731371)
+if [ $MOZILLA_DOWN -ne 0 ]; then
+ if [ -x $GETENFORCE_FILE ] && [ `$GETENFORCE_FILE` != "Disabled" ] && [ -d ~/.mozilla/firefox ]; then
+ (/usr/sbin/restorecon -vr ~/.mozilla/firefox &)
+ fi
+fi
+
+# Modify language pack configuration only when firefox is not running
+# and language packs are not disabled
+if [ $MOZILLA_DOWN -ne 0 ]; then
+
+ # Clear already installed langpacks
+ mkdir -p $MOZ_EXTENSIONS_PROFILE_DIR
+ if [ -f $FEDORA_LANGPACK_CONFIG ]; then
+ rm `cat $FEDORA_LANGPACK_CONFIG` > /dev/null 2>&1
+ rm $FEDORA_LANGPACK_CONFIG > /dev/null 2>&1
+ # remove all empty langpacks dirs while they block installation of langpacks
+ rmdir $MOZ_EXTENSIONS_PROFILE_DIR/langpack* > /dev/null 2>&1
+ fi
+
+ # Get locale from system
+ CURRENT_LOCALE=$LC_ALL
+ CURRENT_LOCALE=${CURRENT_LOCALE:-$LC_MESSAGES}
+ CURRENT_LOCALE=${CURRENT_LOCALE:-$LANG}
+
+ # Try with a local variant first, then without a local variant
+ SHORTMOZLOCALE=`echo $CURRENT_LOCALE | sed "s|_\([^.]*\).*||g" | sed "s|\..*||g"`
+ MOZLOCALE=`echo $CURRENT_LOCALE | sed "s|_\([^.]*\).*|-\1|g" | sed "s|\..*||g"`
+
+ function create_langpack_link() {
+ local language=$*
+ local langpack=langpack-${language}@firefox.mozilla.org.xpi
+ if [ -f $MOZ_LANGPACKS_DIR/$langpack ]; then
+ rm -rf $MOZ_EXTENSIONS_PROFILE_DIR/$langpack
+ # If the target file is a symlink (the fallback langpack),
+ # install the original file instead of the fallback one
+ if [ -h $MOZ_LANGPACKS_DIR/$langpack ]; then
+ langpack=`readlink $MOZ_LANGPACKS_DIR/$langpack`
+ fi
+ ln -s $MOZ_LANGPACKS_DIR/$langpack \
+ $MOZ_EXTENSIONS_PROFILE_DIR/$langpack
+ echo $MOZ_EXTENSIONS_PROFILE_DIR/$langpack > $FEDORA_LANGPACK_CONFIG
+ return 0
+ fi
+ return 1
+ }
+
+ create_langpack_link $MOZLOCALE || create_langpack_link $SHORTMOZLOCALE || true
+fi
+
+# BEAST fix (rhbz#1005611)
+NSS_SSL_CBC_RANDOM_IV=${NSS_SSL_CBC_RANDOM_IV-1}
+export NSS_SSL_CBC_RANDOM_IV
+
+# Prepare command line arguments
+script_args=""
+pass_arg_count=0
+while [ $# -gt $pass_arg_count ]
+do
+ case "$1" in
+ -g | --debug)
+ script_args="$script_args -g"
+ debugging=1
+ shift
+ ;;
+ -d | --debugger)
+ if [ $# -gt 1 ]; then
+ script_args="$script_args -d $2"
+ shift 2
+ else
+ shift
+ fi
+ ;;
+ *)
+ # Move the unrecognized argument to the end of the list.
+ arg="$1"
+ shift
+ set -- "$@" "$arg"
+ pass_arg_count=`expr $pass_arg_count + 1`
+ ;;
+ esac
+done
+
+# Flatpak specific environment variables
+%FLATPAK_ENV_VARS%
+
+# Don't throw "old profile" dialog box.
+export MOZ_ALLOW_DOWNGRADE=1
+
+# Run the browser
+debugging=0
+if [ $debugging = 1 ]
+then
+ echo $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@"
+fi
+
+exec $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@"
diff --git a/firefox.spec b/firefox.spec
new file mode 100644
index 0000000..e1ecc12
--- /dev/null
+++ b/firefox.spec
@@ -0,0 +1,2238 @@
+%define homepage %(grep '^HOME_URL\s*=' /etc/os-release | sed 's/^HOME_URL\s*=//;s/^\s*"//;s/"\s*$//')
+%global disable_toolsets 0
+
+# Produce debug (non-optimized) package build. Suitable for debugging only
+# as the build is *very* slow.
+%global debug_build 0
+# Run Mozilla test suite as a part of compile rpm section. Turn off when
+# building locally and don't want to spend 24 hours waiting for results.
+%global run_firefox_tests 0
+
+%ifarch x86_64 %{ix86}
+%global run_firefox_tests 0
+%endif
+
+%{lua:
+function dist_to_rhel_minor(str, start)
+ match = string.match(str, ".module%+el8.%d+")
+ if match then
+ return string.sub(match, 13)
+ end
+ match = string.match(str, ".el8_%d+")
+ if match then
+ return string.sub(match, 6)
+ end
+ match = string.match(str, ".el8")
+ if match then
+ return 10
+ end
+ match = string.match(str, ".module%+el9.%d+")
+ if match then
+ return string.sub(match, 13)
+ end
+ match = string.match(str, ".el9_%d+")
+ if match then
+ return string.sub(match, 6)
+ end
+ match = string.match(str, ".el9")
+ if match then
+ return 4
+ end
+ return -1
+end}
+
+%global rhel_minor_version %{lua:print(dist_to_rhel_minor(rpm.expand("%dist")))}
+
+# System libraries options
+%global system_nss 1
+%global bundle_nss 0
+
+%if 0%{?rhel} == 8
+ %if %{rhel_minor_version} <= 6
+ %global bundle_nss 1
+ %global system_nss 1
+ %endif
+%endif
+%if 0%{?rhel} == 9
+ %if %{rhel_minor_version} <= 0
+ %global bundle_nss 1
+ %global system_nss 1
+ %endif
+%endif
+
+%global dts_version 10
+%global llvm_version 7.0
+%global nspr_version 4.35
+%global nspr_version_max 4.36
+%global nss_version 3.90
+%global nss_version_max 3.91
+%global rust_version 1.66
+%global system_libvpx 0
+
+# Toolsets setup
+%global use_dts 0
+%global use_gcc_ts 0
+%global use_llvm_ts 0
+%global use_nodejs_scl 0
+%global use_rust_ts 1
+%global use_python3_scl 0
+
+%global nodejs_build_req nodejs
+
+%if 0%{?rhel} >= 8
+ %global use_rust_ts 0
+%endif
+
+%if 0%{?rhel} == 8 && %{rhel_minor_version} < 6
+ %ifarch aarch64
+%global use_gcc_ts 1
+ %endif
+%endif
+
+%if 0%{?rhel} == 7
+ %global use_dts 1
+ %global use_llvm_ts 1
+ %global use_nodejs_scl 1
+ %global nodejs_build_req rh-nodejs10-nodejs
+ %global llvm_version 11.0
+ %global use_python3_scl 1
+%endif
+
+%if 0%{?disable_toolsets}
+%global use_dts 0
+%global use_llvm_ts 0
+%global use_nodejs_scl 0
+%global use_rust_ts 0
+%global use_python3_scl 0
+%endif
+
+%global launch_wayland_compositor 0
+%if 0%{?run_firefox_tests}
+ %global test_on_wayland 1
+ %global launch_wayland_compositor 1
+ %global build_tests 1
+%endif
+
+
+%global mozappdir %{_libdir}/firefox
+%global langpackdir %{mozappdir}/browser/extensions
+%define bundled_install_path %{mozappdir}/bundled
+%global pre_version esr
+# Workaround the dreaded "upstream source file changed content" rpminspect failure.
+# If set to .b2 or .b3 ... the processed source file needs to be renamed before upload, e.g.
+# firefox-102.8.0esr.b2.processed-source.tar.xz
+# When unset use processed source file name as is.
+##global buildnum .b2
+
+%bcond_without langpacks
+
+# Exclude private libraries from autogenerated provides and requires
+%global __provides_exclude_from ^%{mozappdir}
+%global __requires_exclude ^(%%(find %{buildroot}%{mozappdir} -name '*.so' | xargs -n1 basename | sort -u | paste -s -d '|' -))
+
+Summary: Mozilla Firefox Web browser
+Name: firefox
+Version: 115.9.1
+Release: 1%{?dist}
+URL: https://www.mozilla.org/firefox/
+License: MPLv1.1 or GPLv2+ or LGPLv2+
+
+%if 0%{?rhel} == 9
+ExcludeArch: %{ix86}
+%endif
+%if 0%{?rhel} == 8
+ # Started to ship on aarch64 in RHEL 8.2, on s390x in RHEL 8.3
+ %if %{rhel_minor_version} == 1
+ExcludeArch: %{ix86} s390x aarch64
+ %else
+ %if %{rhel_minor_version} == 2
+ExcludeArch: %{ix86} s390x
+ %else
+ExcludeArch: %{ix86}
+ %endif
+ %endif
+%endif
+%if 0%{?rhel} == 7
+ExcludeArch: aarch64 s390 ppc
+%endif
+
+# We can't use the official tarball as it contains some test files that use
+# licenses that are rejected by Red Hat Legal.
+# The official tarball has to be always processed by the process-official-tarball
+# script
+# Link to original tarball: https://archive.mozilla.org/pub/firefox/releases/%%{version}%%{?pre_version}/source/firefox-%%{version}%%{?pre_version}.source.tar.xz
+Source0: firefox-%{version}%{?pre_version}%{?buildnum}.processed-source.tar.xz
+%if %{with langpacks}
+Source1: firefox-langpacks-%{version}%{?pre_version}-20240322.tar.xz
+%endif
+Source2: cbindgen-vendor.tar.xz
+Source3: process-official-tarball
+Source10: firefox-mozconfig
+Source12: firefox-redhat-default-prefs.js
+Source20: firefox.desktop
+Source21: firefox.sh.in
+Source23: firefox.1
+Source24: mozilla-api-key
+Source25: firefox-symbolic.svg
+Source26: distribution.ini
+Source27: google-api-key
+Source30: firefox-x11.sh.in
+Source31: firefox-x11.desktop
+Source32: node-stdout-nonblocking-wrapper
+Source33: firefox.appdata.xml.in
+Source34: firefox-search-provider.ini
+Source35: google-loc-api-key
+Source36: testing.sh
+Source37: mochitest-python.tar.gz
+
+# Bundled libraries
+Source401: nss-setup-flags-env.inc
+Source402: nspr-4.35.0-1.el8_1.src.rpm
+Source403: nss-3.90.0-3.el8_1.src.rpm
+Source404: nss-3.90.0-3.el9_0.src.rpm
+
+# ---- RHEL specific patches ---
+# -- Downstream only --
+Patch01: build-disable-elfhack.patch
+Patch02: firefox-gcc-build.patch
+Patch03: build-big-endian-errors.patch
+Patch05: build-rhel7-lower-node-min-version.patch
+Patch06: build-ppc64-abiv2.patch
+Patch07: build-rhel7-nasm-dwarf.patch
+# Disable PipeWire support for PipeWire 0.2
+Patch08: disable-pipewire.patch
+Patch09: rhbz-2131158-webrtc-nss-fix.patch
+
+# -- Upstreamed patches --
+Patch51: mozilla-bmo1170092.patch
+
+# -- Submitted upstream, not merged --
+Patch101: mozilla-bmo1636168-fscreen.patch
+Patch102: mozilla-bmo1670333.patch
+# Big endian fix
+Patch103: mozilla-bmo1504834-part1.patch
+Patch104: mozilla-bmo1504834-part3.patch
+# Big endian fix
+Patch105: mozilla-bmo849632.patch
+# Big endian fix
+Patch106: mozilla-bmo998749.patch
+# Big endian fix
+Patch107: mozilla-bmo1716707-swizzle.patch
+Patch108: mozilla-bmo1716707-svg.patch
+Patch109: mozilla-bmo1789216-disable-av1.patch
+
+# ---- Fedora specific patches ----
+Patch151: firefox-enable-addons.patch
+Patch152: rhbz-1173156.patch
+Patch153: fedora-shebang-build.patch
+Patch154: firefox-nss-addon-hack.patch
+# ARM run-time patch
+Patch155: rhbz-1354671.patch
+
+# ---- Test patches ----
+# Generate without context by
+# GENDIFF_DIFF_ARGS=-U0 gendiff firefox-xxxx .firefox-tests-xpcshell
+# GENDIFF_DIFF_ARGS=-U0 gendiff firefox-xxxx .firefox-tests-reftest
+Patch201: firefox-tests-xpcshell-freeze.patch
+
+# ---- Security patches ----
+Patch301: CVE-2023-44488-libvpx.patch
+Patch302: expat-CVE-2023-52425.patch
+
+# BUILD REQURES/REQUIRES
+%if %{?system_nss} && !0%{?bundle_nss}
+BuildRequires: pkgconfig(nspr) >= %{nspr_version}
+BuildRequires: pkgconfig(nspr) < %{nspr_version_max}
+BuildRequires: pkgconfig(nss) >= %{nss_version}
+BuildRequires: pkgconfig(nss) < %{nss_version_max}
+BuildRequires: nss-static >= %{nss_version}
+BuildRequires: nss-static < %{nss_version_max}
+%endif
+
+%if %{?system_libvpx}
+BuildRequires: libvpx-devel >= 1.8.2
+%endif
+
+BuildRequires: bzip2-devel
+BuildRequires: dbus-glib-devel
+BuildRequires: desktop-file-utils
+BuildRequires: libappstream-glib
+BuildRequires: libjpeg-devel
+BuildRequires: libstdc++-devel
+BuildRequires: libstdc++-static
+BuildRequires: m4
+BuildRequires: make
+BuildRequires: nasm >= 1.13
+BuildRequires: %{nodejs_build_req} >= 10.21
+BuildRequires: pciutils-libs
+BuildRequires: perl-interpreter
+BuildRequires: pkgconfig(alsa)
+BuildRequires: pkgconfig(dri)
+BuildRequires: pkgconfig(freetype2)
+BuildRequires: pkgconfig(gtk+-3.0)
+BuildRequires: pkgconfig(krb5)
+BuildRequires: pkgconfig(libcurl)
+BuildRequires: pkgconfig(libffi)
+BuildRequires: pkgconfig(libnotify)
+BuildRequires: pkgconfig(libpng)
+BuildRequires: pkgconfig(libpulse)
+BuildRequires: pkgconfig(libstartup-notification-1.0)
+BuildRequires: pkgconfig(pango)
+BuildRequires: pkgconfig(xrender)
+BuildRequires: pkgconfig(xt)
+BuildRequires: pkgconfig(xtst)
+BuildRequires: pkgconfig(zlib)
+BuildRequires: zip
+
+%if 0%{?rhel} == 7
+%if 0%{?use_python3_scl}
+BuildRequires: rh-python38-python-devel
+BuildRequires: rh-python38-python-setuptools
+BuildRequires: scl-utils
+%endif
+BuildRequires: findutils
+%else
+BuildRequires: pipewire-devel
+%endif
+
+%if 0%{?rhel} == 8
+BuildRequires: cargo
+BuildRequires: clang-devel >= %{llvm_version}
+BuildRequires: clang >= %{llvm_version}
+BuildRequires: llvm-devel >= %{llvm_version}
+BuildRequires: llvm >= %{llvm_version}
+ %if 0%{?disable_toolsets} == 0
+BuildRequires: python38-devel
+BuildRequires: python38-setuptools
+ %endif
+BuildRequires: rustfmt >= %{rust_version}
+BuildRequires: rust >= %{rust_version}
+%endif
+
+%if 0%{?rhel} == 9
+BuildRequires: cargo
+BuildRequires: clang clang-libs llvm llvm-devel
+BuildRequires: gcc
+BuildRequires: gcc-c++
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: rust
+%endif
+
+%if 0%{?use_dts}
+BuildRequires: devtoolset-%{dts_version}-gcc
+BuildRequires: devtoolset-%{dts_version}-gcc-c++
+BuildRequires: devtoolset-%{dts_version}-libatomic-devel
+%endif
+
+%if 0%{?use_llvm_ts}
+BuildRequires: llvm-toolset-%{llvm_version}
+BuildRequires: llvm-toolset-%{llvm_version}-clang
+BuildRequires: llvm-toolset-%{llvm_version}-clang-devel
+BuildRequires: llvm-toolset-%{llvm_version}-llvm-devel
+%endif
+
+%if 0%{?use_rust_ts}
+BuildRequires: rust-toolset-%{rust_version}
+%endif
+
+# Bundled nss/nspr requirement
+%if 0%{?bundle_nss}
+BuildRequires: gawk
+BuildRequires: gcc-c++
+BuildRequires: nss-softokn
+BuildRequires: perl-interpreter
+BuildRequires: pkgconfig
+BuildRequires: psmisc
+BuildRequires: sqlite-devel
+BuildRequires: xmlto
+BuildRequires: zlib-devel
+%endif
+
+%if !0%{?flatpak}
+#TODO
+BuildRequires: system-bookmarks
+%endif
+
+%if 0%{?test_on_wayland}
+BuildRequires: dbus-x11
+BuildRequires: gnome-keyring
+BuildRequires: gnome-settings-daemon
+BuildRequires: gsettings-desktop-schemas
+BuildRequires: mesa-dri-drivers
+BuildRequires: mutter
+BuildRequires: xorg-x11-server-Xwayland
+%endif
+
+%if 0%{?run_firefox_tests}
+BuildRequires: abattis-cantarell-fonts
+BuildRequires: dbus-x11
+BuildRequires: dejavu-sans-fonts
+BuildRequires: dejavu-sans-mono-fonts
+BuildRequires: dejavu-serif-fonts
+BuildRequires: gnome-keyring
+BuildRequires: google-carlito-fonts
+BuildRequires: google-droid-sans-fonts
+BuildRequires: google-noto-cjk-fonts-common
+BuildRequires: google-noto-emoji-color-fonts
+BuildRequires: google-noto-fonts-common
+BuildRequires: google-noto-sans-cjk-ttc-fonts
+BuildRequires: google-noto-sans-fonts
+BuildRequires: google-noto-sans-gurmukhi-fonts
+BuildRequires: google-noto-sans-sinhala-vf-fonts
+BuildRequires: jomolhari-fonts
+BuildRequires: khmeros-base-fonts
+BuildRequires: liberation-fonts-common
+BuildRequires: liberation-mono-fonts
+BuildRequires: liberation-sans-fonts
+BuildRequires: liberation-serif-fonts
+BuildRequires: lohit-tamil-fonts
+BuildRequires: lohit-telugu-fonts
+BuildRequires: mesa-dri-drivers
+BuildRequires: nss-tools
+BuildRequires: paktype-naskh-basic-fonts
+BuildRequires: procps-ng
+BuildRequires: pt-sans-fonts
+#BuildRequires: smc-meera-fonts
+BuildRequires: stix-fonts
+BuildRequires: thai-scalable-fonts-common
+BuildRequires: thai-scalable-waree-fonts
+BuildRequires: xorg-x11-fonts-ISO8859-1-100dpi
+BuildRequires: xorg-x11-fonts-misc
+BuildRequires: xorg-x11-server-Xvfb
+%endif
+
+%if 0%{?rhel} == 8 && %{rhel_minor_version} < 6
+ %ifarch aarch64
+BuildRequires: gcc-toolset-12-gcc-plugin-annobin
+ %endif
+%endif
+
+Requires: mozilla-filesystem
+Requires: p11-kit-trust
+Requires: pciutils-libs
+Requires: redhat-indexhtml
+
+%if %{?system_nss} && !0%{?bundle_nss}
+Requires: nspr >= %{nspr_version}
+Requires: nss >= %{nss_version}
+%endif
+
+Obsoletes: mozilla <= 37:1.7.13
+Provides: webclient
+
+# Bundled libraries
+#Provides: bundled(libjxl) it's used only on nightly builds
+Provides: bundled(angle)
+Provides: bundled(aom)
+Provides: bundled(audioipc-2)
+Provides: bundled(bergamot-translator)
+Provides: bundled(brotli)
+Provides: bundled(bsdiff)
+Provides: bundled(cairo)
+Provides: bundled(cfworker)
+Provides: bundled(cld2)
+Provides: bundled(cubeb)
+Provides: bundled(d3.js)
+Provides: bundled(double-conversion)
+Provides: bundled(expat)
+Provides: bundled(fastText)
+Provides: bundled(fathom)
+Provides: bundled(fdlibm)
+Provides: bundled(ffvpx)
+Provides: bundled(freetype2)
+Provides: bundled(function2)
+Provides: bundled(gemmology)
+Provides: bundled(graphite2)
+Provides: bundled(harfbuzz)
+Provides: bundled(highway)
+Provides: bundled(hunspell)
+Provides: bundled(intgemm)
+Provides: bundled(irregexp)
+Provides: bundled(jpeg-xl)
+Provides: bundled(kissfft)
+Provides: bundled(libaom)
+Provides: bundled(libcubeb)
+Provides: bundled(libdav1d)
+Provides: bundled(libdrm)
+Provides: bundled(libepoxy)
+Provides: bundled(libgbm)
+Provides: bundled(libjpeg)
+Provides: bundled(libmar)
+Provides: bundled(libmkv)
+Provides: bundled(libnestegg)
+Provides: bundled(libogg)
+Provides: bundled(libopus)
+Provides: bundled(libpng)
+Provides: bundled(libprio)
+Provides: bundled(libsoundtouch)
+Provides: bundled(libspeex_resampler)
+Provides: bundled(libsrtp)
+Provides: bundled(libtheora)
+Provides: bundled(libtremor)
+Provides: bundled(libvorbis)
+Provides: bundled(libvpx)
+Provides: bundled(libwebp)
+Provides: bundled(libwebrtc)
+Provides: bundled(libyuv)
+Provides: bundled(lit)
+Provides: bundled(mp4parse-rust)
+Provides: bundled(msgpack-c)
+Provides: bundled(mtransport)
+Provides: bundled(nestegg)
+Provides: bundled(nICEr)
+Provides: bundled(nimbus)
+Provides: bundled(openmax_dl)
+Provides: bundled(openmax_il)
+Provides: bundled(ots)
+Provides: bundled(pdf.js)
+Provides: bundled(picosha2)
+Provides: bundled(PKI)
+Provides: bundled(qcms)
+Provides: bundled(rlbox)
+Provides: bundled(rlbox_sandboxing_api)
+Provides: bundled(rlbox_wasm2c_sandbox)
+Provides: bundled(sfntly)
+Provides: bundled(sipcc)
+Provides: bundled(skia)
+Provides: bundled(soundtouch)
+Provides: bundled(sqlite3)
+Provides: bundled(thebes)
+Provides: bundled(theora)
+Provides: bundled(usrsctp)
+Provides: bundled(wabt)
+Provides: bundled(wasm2c)
+Provides: bundled(WebRender)
+Provides: bundled(wgpu)
+Provides: bundled(woff2)
+Provides: bundled(xsimd)
+Provides: bundled(xz-embedded)
+Provides: bundled(ycbcr)
+Provides: bundled(zlib)
+
+%if 0%{?bundle_nss}
+Provides: bundled(nss) = %{nss_version}
+Provides: bundled(nspr) = %{nspr_version}
+%endif
+
+# Rust third parties:
+# List obtained by `get_rust_bundled_provides.sh build.log` script::
+Provides: bundled(crate(aa-stroke)) = 0.1.0
+Provides: bundled(crate(adler)) = 1.0.2
+Provides: bundled(crate(ahash)) = 0.7.6
+Provides: bundled(crate(aho-corasick)) = 0.7.20
+Provides: bundled(crate(alsa)) = 0.7.0
+Provides: bundled(crate(alsa-sys)) = 0.3.1
+Provides: bundled(crate(anyhow)) = 1.0.69
+Provides: bundled(crate(app_services_logger)) = 0.1.0
+Provides: bundled(crate(app_units)) = 0.7.2
+Provides: bundled(crate(arrayref)) = 0.3.6
+Provides: bundled(crate(arrayvec)) = 0.7.2
+Provides: bundled(crate(ash)) = 0.37.2+1.3.238
+Provides: bundled(crate(askama)) = 0.11.1
+Provides: bundled(crate(askama_derive)) = 0.11.2
+Provides: bundled(crate(askama_escape)) = 0.10.3
+Provides: bundled(crate(askama_shared)) = 0.12.2
+Provides: bundled(crate(async-task)) = 4.3.0
+Provides: bundled(crate(async-trait)) = 0.1.64
+Provides: bundled(crate(atomic_refcell)) = 0.1.9
+Provides: bundled(crate(audioipc2)) = 0.5.0
+Provides: bundled(crate(audioipc2-client)) = 0.5.0
+Provides: bundled(crate(audioipc2-server)) = 0.5.0
+Provides: bundled(crate(audio_thread_priority)) = 0.26.1
+Provides: bundled(crate(authenticator)) = 0.4.0-alpha.15
+Provides: bundled(crate(authrs_bridge)) = 0.1.0
+Provides: bundled(crate(autocfg)) = 1.1.0
+Provides: bundled(crate(base64)) = 0.13.999
+Provides: bundled(crate(base64)) = 0.21.0
+Provides: bundled(crate(bhttp)) = 0.3.1
+Provides: bundled(crate(binary_http)) = 0.1.0
+Provides: bundled(crate(bincode)) = 1.3.3
+Provides: bundled(crate(bindgen)) = 0.63.999
+Provides: bundled(crate(bindgen)) = 0.64.0
+Provides: bundled(crate(bitflags)) = 1.3.2
+Provides: bundled(crate(bitflags)) = 2.999.999
+Provides: bundled(crate(bitreader)) = 0.3.6
+Provides: bundled(crate(bit-set)) = 0.5.3
+Provides: bundled(crate(bit-vec)) = 0.6.3
+Provides: bundled(crate(block-buffer)) = 0.10.3
+Provides: bundled(crate(bookmark_sync)) = 0.1.0
+Provides: bundled(crate(build-parallel)) = 0.1.2
+Provides: bundled(crate(builtins-static)) = 0.1.0
+Provides: bundled(crate(byteorder)) = 1.4.3
+Provides: bundled(crate(bytes)) = 1.4.0
+Provides: bundled(crate(cache-padded)) = 1.2.0
+Provides: bundled(crate(camino)) = 1.1.2
+Provides: bundled(crate(cargo_metadata)) = 0.15.3
+Provides: bundled(crate(cargo-platform)) = 0.1.2
+Provides: bundled(crate(cascade_bloom_filter)) = 0.1.0
+Provides: bundled(crate(cc)) = 1.0.73
+Provides: bundled(crate(cert_storage)) = 0.0.1
+Provides: bundled(crate(cexpr)) = 0.6.0
+Provides: bundled(crate(cfg-if)) = 0.1.999
+Provides: bundled(crate(cfg-if)) = 1.0.0
+Provides: bundled(crate(chardetng)) = 0.1.9
+Provides: bundled(crate(chardetng_c)) = 0.1.2
+Provides: bundled(crate(chrono)) = 0.4.19
+Provides: bundled(crate(chunky-vec)) = 0.1.0
+Provides: bundled(crate(clang-sys)) = 1.6.0
+Provides: bundled(crate(cmake)) = 0.1.999
+Provides: bundled(crate(codespan-reporting)) = 0.11.1
+Provides: bundled(crate(cose)) = 0.1.4
+Provides: bundled(crate(cose-c)) = 0.1.5
+Provides: bundled(crate(cpufeatures)) = 0.2.5
+Provides: bundled(crate(crc32fast)) = 1.3.2
+Provides: bundled(crate(crossbeam-channel)) = 0.5.6
+Provides: bundled(crate(crossbeam-deque)) = 0.8.2
+Provides: bundled(crate(crossbeam-epoch)) = 0.9.14
+Provides: bundled(crate(crossbeam-queue)) = 0.3.8
+Provides: bundled(crate(crossbeam-utils)) = 0.8.14
+Provides: bundled(crate(crypto-common)) = 0.1.6
+Provides: bundled(crate(crypto_hash)) = 0.1.0
+Provides: bundled(crate(cssparser)) = 0.31.0
+Provides: bundled(crate(cssparser-macros)) = 0.6.0
+Provides: bundled(crate(cstr)) = 0.2.11
+Provides: bundled(crate(cty)) = 0.2.2
+Provides: bundled(crate(cubeb)) = 0.10.3
+Provides: bundled(crate(cubeb-backend)) = 0.10.3
+Provides: bundled(crate(cubeb-core)) = 0.10.3
+Provides: bundled(crate(cubeb-pulse)) = 0.4.1
+Provides: bundled(crate(cubeb-sys)) = 0.10.3
+Provides: bundled(crate(dap_ffi)) = 0.1.0
+Provides: bundled(crate(darling)) = 0.13.99
+Provides: bundled(crate(darling)) = 0.14.3
+Provides: bundled(crate(darling_core)) = 0.14.3
+Provides: bundled(crate(darling_macro)) = 0.14.3
+Provides: bundled(crate(data-encoding)) = 2.3.3
+Provides: bundled(crate(data-encoding-ffi)) = 0.1.0
+Provides: bundled(crate(dbus)) = 0.6.5
+Provides: bundled(crate(derive_common)) = 0.0.1
+Provides: bundled(crate(derive_more)) = 0.99.17
+Provides: bundled(crate(digest)) = 0.10.6
+Provides: bundled(crate(dirs)) = 4.0.0
+Provides: bundled(crate(dirs-sys)) = 0.3.7
+Provides: bundled(crate(displaydoc)) = 0.2.3
+Provides: bundled(crate(dns-parser)) = 0.8.0
+Provides: bundled(crate(dogear)) = 0.5.0
+Provides: bundled(crate(dom)) = 0.1.0
+Provides: bundled(crate(dtoa)) = 0.4.8
+Provides: bundled(crate(dtoa-short)) = 0.3.3
+Provides: bundled(crate(either)) = 1.8.1
+Provides: bundled(crate(encoding_c)) = 0.9.8
+Provides: bundled(crate(encoding_c_mem)) = 0.2.6
+Provides: bundled(crate(encoding_glue)) = 0.1.0
+Provides: bundled(crate(encoding_rs)) = 0.8.32
+Provides: bundled(crate(enumset)) = 1.0.12
+Provides: bundled(crate(enumset_derive)) = 0.6.1
+Provides: bundled(crate(env_logger)) = 0.10.0
+Provides: bundled(crate(env_logger)) = 0.9.999
+Provides: bundled(crate(error-chain)) = 0.12.4
+Provides: bundled(crate(error-support)) = 0.1.0
+Provides: bundled(crate(error-support-macros)) = 0.1.0
+Provides: bundled(crate(etagere)) = 0.2.7
+Provides: bundled(crate(euclid)) = 0.22.7
+Provides: bundled(crate(fallible_collections)) = 0.4.6
+Provides: bundled(crate(fallible-iterator)) = 0.2.0
+Provides: bundled(crate(fallible-streaming-iterator)) = 0.1.9
+Provides: bundled(crate(fastrand)) = 1.9.0
+Provides: bundled(crate(ffi-support)) = 0.4.4
+Provides: bundled(crate(firefox-on-glean)) = 0.1.0
+Provides: bundled(crate(flate2)) = 1.0.25
+Provides: bundled(crate(fluent)) = 0.16.0
+Provides: bundled(crate(fluent-bundle)) = 0.15.2
+Provides: bundled(crate(fluent-fallback)) = 0.7.0
+Provides: bundled(crate(fluent-ffi)) = 0.1.0
+Provides: bundled(crate(fluent-langneg)) = 0.13.0
+Provides: bundled(crate(fluent-langneg-ffi)) = 0.1.0
+Provides: bundled(crate(fluent-pseudo)) = 0.3.1
+Provides: bundled(crate(fluent-syntax)) = 0.11.0
+Provides: bundled(crate(fnv)) = 1.0.7
+Provides: bundled(crate(fog_control)) = 0.1.0
+Provides: bundled(crate(freetype)) = 0.7.0
+Provides: bundled(crate(fs-err)) = 2.9.0
+Provides: bundled(crate(futures)) = 0.3.26
+Provides: bundled(crate(futures-channel)) = 0.3.26
+Provides: bundled(crate(futures-core)) = 0.3.26
+Provides: bundled(crate(futures-executor)) = 0.3.26
+Provides: bundled(crate(futures-io)) = 0.3.26
+Provides: bundled(crate(futures-macro)) = 0.3.26
+Provides: bundled(crate(futures-sink)) = 0.3.26
+Provides: bundled(crate(futures-task)) = 0.3.26
+Provides: bundled(crate(futures-util)) = 0.3.26
+Provides: bundled(crate(fxhash)) = 0.2.1
+Provides: bundled(crate(gecko_logger)) = 0.1.0
+Provides: bundled(crate(gecko-profiler)) = 0.1.0
+Provides: bundled(crate(geckoservo)) = 0.0.1
+Provides: bundled(crate(generic-array)) = 0.14.6
+Provides: bundled(crate(getrandom)) = 0.2.9
+Provides: bundled(crate(gkrust)) = 0.1.0
+Provides: bundled(crate(gkrust-shared)) = 0.1.0
+Provides: bundled(crate(gkrust_utils)) = 0.1.0
+Provides: bundled(crate(gleam)) = 0.15.0
+Provides: bundled(crate(glean)) = 52.7.0
+Provides: bundled(crate(glean-core)) = 52.7.0
+Provides: bundled(crate(gl_generator)) = 0.14.0
+Provides: bundled(crate(glob)) = 0.3.1
+Provides: bundled(crate(glsl)) = 6.0.2
+Provides: bundled(crate(glslopt)) = 0.1.9
+Provides: bundled(crate(glsl-to-cxx)) = 0.1.0
+Provides: bundled(crate(goblin)) = 0.6.0
+Provides: bundled(crate(golden_gate)) = 0.1.0
+Provides: bundled(crate(gpu-alloc)) = 0.5.3
+Provides: bundled(crate(gpu-alloc-types)) = 0.2.0
+Provides: bundled(crate(gpu-descriptor)) = 0.2.3
+Provides: bundled(crate(gpu-descriptor-types)) = 0.1.1
+Provides: bundled(crate(half)) = 1.8.2
+Provides: bundled(crate(hashbrown)) = 0.12.3
+Provides: bundled(crate(hashlink)) = 0.8.1
+Provides: bundled(crate(heck)) = 0.4.1
+Provides: bundled(crate(hex)) = 0.4.3
+Provides: bundled(crate(hexf-parse)) = 0.2.1
+Provides: bundled(crate(http_sfv)) = 0.1.0
+Provides: bundled(crate(id-arena)) = 2.2.1
+Provides: bundled(crate(ident_case)) = 1.0.1
+Provides: bundled(crate(idna)) = 0.2.3
+Provides: bundled(crate(indexmap)) = 1.9.2
+Provides: bundled(crate(inherent)) = 1.0.4
+Provides: bundled(crate(instant)) = 0.1.12
+Provides: bundled(crate(interrupt-support)) = 0.1.0
+Provides: bundled(crate(intl-memoizer)) = 0.5.1
+Provides: bundled(crate(intl_pluralrules)) = 7.0.2
+Provides: bundled(crate(iovec)) = 0.1.4
+Provides: bundled(crate(ipcclientcerts-static)) = 0.1.0
+Provides: bundled(crate(itertools)) = 0.10.5
+Provides: bundled(crate(itoa)) = 1.0.5
+Provides: bundled(crate(jobserver)) = 0.1.25
+Provides: bundled(crate(jog)) = 0.1.0
+Provides: bundled(crate(jsrust)) = 0.1.0
+Provides: bundled(crate(jsrust_shared)) = 0.1.0
+Provides: bundled(crate(khronos_api)) = 3.1.0
+Provides: bundled(crate(kvstore)) = 0.1.0
+Provides: bundled(crate(l10nregistry)) = 0.3.0
+Provides: bundled(crate(l10nregistry-ffi)) = 0.1.0
+Provides: bundled(crate(lazycell)) = 1.3.0
+Provides: bundled(crate(lazy_static)) = 1.4.0
+Provides: bundled(crate(leb128)) = 0.2.5
+Provides: bundled(crate(libc)) = 0.2.139
+Provides: bundled(crate(libdbus-sys)) = 0.2.2
+Provides: bundled(crate(libloading)) = 0.7.4
+Provides: bundled(crate(libsqlite3-sys)) = 0.25.2
+Provides: bundled(crate(libudev)) = 0.2.0
+Provides: bundled(crate(libudev-sys)) = 0.1.3
+Provides: bundled(crate(lmdb-rkv)) = 0.14.0
+Provides: bundled(crate(lmdb-rkv-sys)) = 0.11.2
+Provides: bundled(crate(localization-ffi)) = 0.1.0
+Provides: bundled(crate(lock_api)) = 0.4.9
+Provides: bundled(crate(log)) = 0.4.17
+Provides: bundled(crate(malloc_size_of)) = 0.0.1
+Provides: bundled(crate(malloc_size_of_derive)) = 0.1.2
+Provides: bundled(crate(mapped_hyph)) = 0.4.3
+Provides: bundled(crate(matches)) = 0.1.10
+Provides: bundled(crate(md-5)) = 0.10.5
+Provides: bundled(crate(mdns_service)) = 0.1.1
+Provides: bundled(crate(memalloc)) = 0.1.0
+Provides: bundled(crate(memchr)) = 2.5.0
+Provides: bundled(crate(memmap2)) = 0.5.9
+Provides: bundled(crate(memoffset)) = 0.8.0
+Provides: bundled(crate(midir)) = 0.7.0
+Provides: bundled(crate(midir_impl)) = 0.1.0
+Provides: bundled(crate(mime)) = 0.3.16
+Provides: bundled(crate(mime_guess)) = 2.0.4
+Provides: bundled(crate(mime-guess-ffi)) = 0.1.0
+Provides: bundled(crate(minimal-lexical)) = 0.2.1
+Provides: bundled(crate(miniz_oxide)) = 0.6.2
+Provides: bundled(crate(mio)) = 0.8.0
+Provides: bundled(crate(moz_asserts)) = 0.1.0
+Provides: bundled(crate(mozbuild)) = 0.1.0
+Provides: bundled(crate(moz_cbor)) = 0.1.2
+Provides: bundled(crate(mozglue-static)) = 0.1.0
+Provides: bundled(crate(mozilla-central-workspace-hack)) = 0.1.0
+Provides: bundled(crate(moz_task)) = 0.1.0
+Provides: bundled(crate(mozurl)) = 0.0.1
+Provides: bundled(crate(mp4parse)) = 0.17.0
+Provides: bundled(crate(mp4parse_capi)) = 0.17.0
+Provides: bundled(crate(murmurhash3)) = 0.0.5
+Provides: bundled(crate(naga)) = 0.12.0
+Provides: bundled(crate(neqo-common)) = 0.6.4
+Provides: bundled(crate(neqo-crypto)) = 0.6.4
+Provides: bundled(crate(neqo_glue)) = 0.1.0
+Provides: bundled(crate(neqo-http3)) = 0.6.4
+Provides: bundled(crate(neqo-qpack)) = 0.6.4
+Provides: bundled(crate(neqo-transport)) = 0.6.4
+Provides: bundled(crate(netwerk_helper)) = 0.0.1
+Provides: bundled(crate(new_debug_unreachable)) = 1.0.4
+Provides: bundled(crate(nix)) = 0.24.99
+Provides: bundled(crate(nix)) = 0.26.2
+Provides: bundled(crate(nom)) = 7.1.3
+Provides: bundled(crate(nserror)) = 0.1.0
+Provides: bundled(crate(nss_build_common)) = 0.1.0
+Provides: bundled(crate(nss-gk-api)) = 0.2.1
+Provides: bundled(crate(nsstring)) = 0.1.0
+Provides: bundled(crate(num_cpus)) = 1.15.0
+Provides: bundled(crate(num-derive)) = 0.3.3
+Provides: bundled(crate(num-integer)) = 0.1.45
+Provides: bundled(crate(num-traits)) = 0.2.15
+Provides: bundled(crate(object)) = 0.30.3
+Provides: bundled(crate(oblivious_http)) = 0.1.0
+Provides: bundled(crate(ohttp)) = 0.3.1
+Provides: bundled(crate(once_cell)) = 1.17.1
+Provides: bundled(crate(ordered-float)) = 3.4.0
+Provides: bundled(crate(origin-trials-ffi)) = 0.1.0
+Provides: bundled(crate(origin-trial-token)) = 0.1.1
+Provides: bundled(crate(owning_ref)) = 0.4.1
+Provides: bundled(crate(parking_lot)) = 0.11.2
+Provides: bundled(crate(parking_lot)) = 0.12.999
+Provides: bundled(crate(parking_lot_core)) = 0.8.6
+Provides: bundled(crate(paste)) = 1.0.11
+Provides: bundled(crate(peeking_take_while)) = 0.1.2
+Provides: bundled(crate(peek-poke)) = 0.3.0
+Provides: bundled(crate(peek-poke-derive)) = 0.3.0
+Provides: bundled(crate(percent-encoding)) = 2.2.0
+Provides: bundled(crate(phf)) = 0.10.1
+Provides: bundled(crate(phf_codegen)) = 0.10.0
+Provides: bundled(crate(phf_generator)) = 0.10.0
+Provides: bundled(crate(phf_macros)) = 0.10.0
+Provides: bundled(crate(phf_shared)) = 0.10.0
+Provides: bundled(crate(pin-project-lite)) = 0.2.9
+Provides: bundled(crate(pin-utils)) = 0.1.0
+Provides: bundled(crate(pkcs11-bindings)) = 0.1.5
+Provides: bundled(crate(pkg-config)) = 0.3.26
+Provides: bundled(crate(plain)) = 0.2.3
+Provides: bundled(crate(plane-split)) = 0.18.0
+Provides: bundled(crate(ppv-lite86)) = 0.2.17
+Provides: bundled(crate(precomputed-hash)) = 0.1.1
+Provides: bundled(crate(prefs_parser)) = 0.0.1
+Provides: bundled(crate(prio)) = 0.9.1
+Provides: bundled(crate(processtools)) = 0.1.0
+Provides: bundled(crate(proc-macro2)) = 1.0.51
+Provides: bundled(crate(proc-macro-hack)) = 0.5.20+deprecated
+Provides: bundled(crate(profiler_helper)) = 0.1.0
+Provides: bundled(crate(profiler-macros)) = 0.1.0
+Provides: bundled(crate(profiling)) = 1.0.7
+Provides: bundled(crate(prost)) = 0.8.0
+Provides: bundled(crate(prost-derive)) = 0.8.0
+Provides: bundled(crate(pulse)) = 0.3.0
+Provides: bundled(crate(pulse-ffi)) = 0.1.0
+Provides: bundled(crate(qcms)) = 0.2.0
+Provides: bundled(crate(qlog)) = 0.4.0
+Provides: bundled(crate(quick-error)) = 1.2.3
+Provides: bundled(crate(quote)) = 1.0.23
+Provides: bundled(crate(rand)) = 0.8.5
+Provides: bundled(crate(rand_chacha)) = 0.3.1
+Provides: bundled(crate(rand_core)) = 0.6.4
+Provides: bundled(crate(raw-window-handle)) = 0.5.0
+Provides: bundled(crate(rayon)) = 1.6.1
+Provides: bundled(crate(rayon-core)) = 1.10.2
+Provides: bundled(crate(regex)) = 1.7.1
+Provides: bundled(crate(regex-syntax)) = 0.6.28
+Provides: bundled(crate(remove_dir_all)) = 0.5.3
+Provides: bundled(crate(replace_with)) = 0.1.7
+Provides: bundled(crate(ringbuf)) = 0.2.8
+Provides: bundled(crate(rkv)) = 0.18.4
+Provides: bundled(crate(ron)) = 0.8.0
+Provides: bundled(crate(rsclientcerts)) = 0.1.0
+Provides: bundled(crate(rsdparsa_capi)) = 0.1.0
+Provides: bundled(crate(runloop)) = 0.1.0
+Provides: bundled(crate(rure)) = 0.2.2
+Provides: bundled(crate(rusqlite)) = 0.28.0
+Provides: bundled(crate(rust_cascade)) = 1.5.0
+Provides: bundled(crate(rustc-demangle)) = 0.1.21
+Provides: bundled(crate(rustc-hash)) = 1.1.0
+Provides: bundled(crate(rustc_version)) = 0.4.0
+Provides: bundled(crate(rust_decimal)) = 1.28.1
+Provides: bundled(crate(ryu)) = 1.0.12
+Provides: bundled(crate(same-file)) = 1.0.6
+Provides: bundled(crate(scopeguard)) = 1.1.0
+Provides: bundled(crate(scroll)) = 0.11.0
+Provides: bundled(crate(scroll_derive)) = 0.11.0
+Provides: bundled(crate(selectors)) = 0.22.0
+Provides: bundled(crate(self_cell)) = 0.10.2
+Provides: bundled(crate(semver)) = 1.0.16
+Provides: bundled(crate(serde)) = 1.0.152
+Provides: bundled(crate(serde_bytes)) = 0.11.9
+Provides: bundled(crate(serde_cbor)) = 0.11.2
+Provides: bundled(crate(serde_derive)) = 1.0.152
+Provides: bundled(crate(serde_json)) = 1.0.93
+Provides: bundled(crate(serde_with)) = 1.14.0
+Provides: bundled(crate(serde_with_macros)) = 1.5.2
+Provides: bundled(crate(servo_arc)) = 0.1.1
+Provides: bundled(crate(sfv)) = 0.9.3
+Provides: bundled(crate(sha1)) = 0.10.5
+Provides: bundled(crate(sha2)) = 0.10.6
+Provides: bundled(crate(shlex)) = 1.1.0
+Provides: bundled(crate(siphasher)) = 0.3.10
+Provides: bundled(crate(slab)) = 0.4.8
+Provides: bundled(crate(smallbitvec)) = 2.5.1
+Provides: bundled(crate(smallvec)) = 1.10.0
+Provides: bundled(crate(socket2)) = 0.4.7
+Provides: bundled(crate(spirv)) = 0.2.0+1.5.4
+Provides: bundled(crate(sql-support)) = 0.1.0
+Provides: bundled(crate(stable_deref_trait)) = 1.2.0
+Provides: bundled(crate(static_assertions)) = 1.1.0
+Provides: bundled(crate(static_prefs)) = 0.1.0
+Provides: bundled(crate(storage)) = 0.1.0
+Provides: bundled(crate(storage_variant)) = 0.1.0
+Provides: bundled(crate(strsim)) = 0.10.0
+Provides: bundled(crate(style)) = 0.0.1
+Provides: bundled(crate(style_derive)) = 0.0.1
+Provides: bundled(crate(style_traits)) = 0.0.1
+Provides: bundled(crate(svg_fmt)) = 0.4.1
+Provides: bundled(crate(swgl)) = 0.1.0
+Provides: bundled(crate(syn)) = 1.0.107
+Provides: bundled(crate(sync15)) = 0.1.0
+Provides: bundled(crate(sync-guid)) = 0.1.0
+Provides: bundled(crate(synstructure)) = 0.12.6
+Provides: bundled(crate(tabs)) = 0.1.0
+Provides: bundled(crate(tempfile)) = 3.3.0
+Provides: bundled(crate(termcolor)) = 1.2.0
+Provides: bundled(crate(thin-vec)) = 0.2.12
+Provides: bundled(crate(thiserror)) = 1.0.38
+Provides: bundled(crate(thiserror-impl)) = 1.0.38
+Provides: bundled(crate(threadbound)) = 0.1.5
+Provides: bundled(crate(time)) = 0.1.45
+Provides: bundled(crate(tinystr)) = 0.7.1
+Provides: bundled(crate(tinyvec)) = 1.999.999
+Provides: bundled(crate(toml)) = 0.5.11
+Provides: bundled(crate(topological-sort)) = 0.1.0
+Provides: bundled(crate(to_shmem)) = 0.0.1
+Provides: bundled(crate(to_shmem_derive)) = 0.0.1
+Provides: bundled(crate(tracy-rs)) = 0.1.2
+Provides: bundled(crate(typed-arena-nomut)) = 0.1.0
+Provides: bundled(crate(type-map)) = 0.4.0
+Provides: bundled(crate(typenum)) = 1.16.0
+Provides: bundled(crate(uluru)) = 3.0.0
+Provides: bundled(crate(unicase)) = 2.6.0
+Provides: bundled(crate(unic-langid)) = 0.9.1
+Provides: bundled(crate(unic-langid-ffi)) = 0.1.0
+Provides: bundled(crate(unic-langid-impl)) = 0.9.1
+Provides: bundled(crate(unicode-bidi)) = 0.3.8
+Provides: bundled(crate(unicode-ident)) = 1.0.6
+Provides: bundled(crate(unicode-normalization)) = 0.1.22
+Provides: bundled(crate(unicode-segmentation)) = 1.10.0
+Provides: bundled(crate(unicode-width)) = 0.1.10
+Provides: bundled(crate(unicode-xid)) = 0.2.4
+Provides: bundled(crate(uniffi)) = 0.23.0
+Provides: bundled(crate(uniffi_bindgen)) = 0.23.0
+Provides: bundled(crate(uniffi_build)) = 0.23.0
+Provides: bundled(crate(uniffi_checksum_derive)) = 0.23.0
+Provides: bundled(crate(uniffi_core)) = 0.23.0
+Provides: bundled(crate(uniffi_macros)) = 0.23.0
+Provides: bundled(crate(uniffi_meta)) = 0.23.0
+Provides: bundled(crate(uniffi_testing)) = 0.23.0
+Provides: bundled(crate(url)) = 2.1.0
+Provides: bundled(crate(uuid)) = 1.3.0
+Provides: bundled(crate(vcpkg)) = 0.2.999
+Provides: bundled(crate(version_check)) = 0.9.4
+Provides: bundled(crate(viaduct)) = 0.1.0
+Provides: bundled(crate(void)) = 1.0.2
+Provides: bundled(crate(walkdir)) = 2.3.2
+Provides: bundled(crate(wasm-encoder)) = 0.25.0
+Provides: bundled(crate(wast)) = 56.0.0
+Provides: bundled(crate(webext-storage)) = 0.1.0
+Provides: bundled(crate(webext_storage_bridge)) = 0.1.0
+Provides: bundled(crate(webrender)) = 0.62.0
+Provides: bundled(crate(webrender_api)) = 0.62.0
+Provides: bundled(crate(webrender_bindings)) = 0.1.0
+Provides: bundled(crate(webrender_build)) = 0.0.2
+Provides: bundled(crate(webrtc-sdp)) = 0.3.10
+Provides: bundled(crate(weedle2)) = 4.0.0
+Provides: bundled(crate(wgpu_bindings)) = 0.1.0
+Provides: bundled(crate(wgpu-core)) = 0.16.0
+Provides: bundled(crate(wgpu-hal)) = 0.16.0
+Provides: bundled(crate(wgpu-types)) = 0.16.0
+Provides: bundled(crate(whatsys)) = 0.3.1
+Provides: bundled(crate(wpf-gpu-raster)) = 0.1.0
+Provides: bundled(crate(wr_glyph_rasterizer)) = 0.1.0
+Provides: bundled(crate(wr_malloc_size_of)) = 0.0.2
+Provides: bundled(crate(xmldecl)) = 0.2.0
+Provides: bundled(crate(xml-rs)) = 0.8.4
+Provides: bundled(crate(xpcom)) = 0.1.0
+Provides: bundled(crate(xpcom_macros)) = 0.1.0
+Provides: bundled(crate(zeitstempel)) = 0.1.1
+
+%description
+Mozilla Firefox is an open-source web browser, designed for standards
+compliance, performance and portability.
+
+%if 0%{?run_firefox_tests}
+%global testsuite_pkg_name %{name}-testresults
+%package -n %{testsuite_pkg_name}
+Summary: Results of testsuite
+%description -n %{testsuite_pkg_name}
+This package contains results of tests executed during build.
+%files -n %{testsuite_pkg_name}
+/%{version}-%{release}/test_results
+/%{version}-%{release}/test_summary.txt
+/%{version}-%{release}/failures-*
+%endif
+
+%if 0%{?rhel} >= 9
+%package x11
+Summary: Firefox X11 launcher.
+Requires: %{name} = %{version}-%{release}
+%description x11
+The firefox-x11 package contains launcher and desktop file
+to run Firefox explicitly on X11.
+%files x11
+%{_bindir}/firefox-x11
+%{_datadir}/applications/firefox-x11.desktop
+%endif
+
+#---------------------------------------------------------------------
+
+%prep
+echo "Build environment"
+echo "--------------------------------------------"
+echo "dist %{?dist}"
+echo "RHEL minor version: %{?rhel_minor_version}"
+echo "bundle_nss %{?bundle_nss}"
+echo "system_nss %{?system_nss}"
+echo "use_rust_ts %{?use_rust_ts}"
+echo "use_dts %{?use_dts}"
+echo "use_nodejs_scl %{?use_nodejs_scl}"
+echo "use_llvm_ts %{?use_llvm_ts}"
+echo "use_python3_scl %{?use_python3_scl}"
+echo "--------------------------------------------"
+%setup -q -n %{name}-%{version}
+
+# ---- RHEL specific patches ---
+# -- Downstream only --
+%patch -P1 -p1 -b .disable-elfhack
+%patch -P2 -p1 -b .firefox-gcc-build
+%patch -P3 -p1 -b .build-big-endian-errors
+%if 0%{?rhel} == 7
+%patch -P5 -p1 -b .build-rhel7-lower-node-min-version
+ %ifarch ppc64
+ # abiv2 version not available in RHEL7 ppc
+ # TODO most likely not needed with system nss
+%patch -P6 -p1 -b .ppc64-abiv2
+ %endif
+ %ifarch %{ix86}
+ # -F dwarf not available in RHEL7's nasm
+%patch -P7 -p1 -b .build-rhel7-nasm-dwarf
+ %endif
+%endif
+%if 0%{?rhel} == 7 || (0%{?rhel} == 8 && %{rhel_minor_version} <= 2)
+%patch -P8 -p1 -b .disable-pipewire
+%endif
+%patch -P9 -p1 -b .rhbz-2131158-webrtc-nss-fix
+
+# -- Upstreamed patches --
+%patch -P51 -p1 -b .mozilla-bmo1170092
+
+# -- Submitted upstream, not merged --
+%patch -P101 -p1 -b .mozilla-bmo1636168-fscreen
+%patch -P102 -p1 -b .mozilla-bmo1670333
+%patch -P103 -p1 -b .mozilla-bmo1504834-part1
+%patch -P104 -p1 -b .mozilla-bmo1504834-part3
+%patch -P105 -p1 -b .mozilla-bmo849632
+%patch -P106 -p1 -b .mozilla-bmo998749
+%patch -P107 -p1 -b .mozilla-bmo1716707-swizzle
+%patch -P108 -p1 -b .mozilla-bmo1716707-svg
+%patch -P109 -p1 -b .mozilla-bmo1789216-disable-av1
+
+# ---- Fedora specific patches ----
+%patch -P151 -p1 -b .addons
+%patch -P152 -p1 -b .rhbz-1173156
+%patch -P153 -p1 -b .fedora-shebang
+%patch -P154 -p1 -b .addons-nss-hack
+# ARM run-time patch
+%ifarch aarch64
+%patch -P155 -p1 -b .rhbz-1354671
+%endif
+
+# ---- Test patches ----
+%patch -P201 -p1 -b .firefox-tests-xpcshell-freeze
+
+# ---- Security patches ----
+cd media/libvpx/libvpx
+%patch -P301 -p1 -b .CVE-2023-44488-libvpx
+cd -
+%patch -P302 -p1 -b .expat-CVE-2023-52425
+
+%{__rm} -f .mozconfig
+%{__cp} %{SOURCE10} .mozconfig
+%{__cp} %{SOURCE24} mozilla-api-key
+%{__cp} %{SOURCE27} google-api-key
+%{__cp} %{SOURCE35} google-loc-api-key
+
+echo "ac_add_options --prefix=\"%{_prefix}\"" >> .mozconfig
+echo "ac_add_options --libdir=\"%{_libdir}\"" >> .mozconfig
+
+%if %{?system_nss}
+echo "ac_add_options --with-system-nspr" >> .mozconfig
+echo "ac_add_options --with-system-nss" >> .mozconfig
+%else
+echo "ac_add_options --without-system-nspr" >> .mozconfig
+echo "ac_add_options --without-system-nss" >> .mozconfig
+%endif
+
+%if %{?debug_build}
+echo "ac_add_options --enable-debug" >> .mozconfig
+echo "ac_add_options --disable-optimize" >> .mozconfig
+%else
+%global optimize_flags "none"
+%ifarch s390x
+%global optimize_flags "-g -O1"
+%endif
+%ifarch ppc64le aarch64
+%global optimize_flags "-g -O2"
+%endif
+%if %{optimize_flags} != "none"
+echo 'ac_add_options --enable-optimize=%{?optimize_flags}' >> .mozconfig
+%else
+echo 'ac_add_options --enable-optimize' >> .mozconfig
+%endif
+echo "ac_add_options --disable-debug" >> .mozconfig
+%endif
+
+# Second arches fail to start with jemalloc enabled
+%ifnarch %{ix86} x86_64
+echo "ac_add_options --disable-jemalloc" >> .mozconfig
+%endif
+
+%if 0%{?build_tests}
+echo "ac_add_options --enable-tests" >> .mozconfig
+%else
+echo "ac_add_options --disable-tests" >> .mozconfig
+%endif
+
+%if %{?system_libvpx}
+echo "ac_add_options --with-system-libvpx" >> .mozconfig
+%else
+echo "ac_add_options --without-system-libvpx" >> .mozconfig
+%endif
+
+%ifarch s390x
+echo "ac_add_options --disable-jit" >> .mozconfig
+%endif
+
+%ifarch ppc64 ppc64le
+echo "ac_add_options --disable-webrtc" >> .mozconfig
+echo "ac_add_options --disable-lto" >> .mozconfig
+%endif
+echo "ac_add_options --disable-lto" >> .mozconfig
+
+# AV1 requires newer nasm that was rebased in 8.4
+%if 0%{?rhel} == 7 || (0%{?rhel} == 8 && %{rhel_minor_version} < 4)
+echo "ac_add_options --disable-av1" >> .mozconfig
+%endif
+
+# api keys full path
+echo "ac_add_options --with-mozilla-api-keyfile=`pwd`/mozilla-api-key" >> .mozconfig
+echo "ac_add_options --with-google-location-service-api-keyfile=`pwd`/google-loc-api-key" >> .mozconfig
+echo "ac_add_options --with-google-safebrowsing-api-keyfile=`pwd`/google-api-key" >> .mozconfig
+
+# May result in empty --with-libclang-path= in earlier versions.
+# So far this is needed only for c8s/c9s.
+%if (0%{?rhel} == 8 && %{rhel_minor_version} >= 10) || (0%{?rhel} == 9 && %{rhel_minor_version} >= 4)
+# Clang 17 upstream's detection fails, tell it where to look.
+echo "ac_add_options --with-libclang-path=`llvm-config --libdir`" >> .mozconfig
+%endif
+
+echo 'export NODEJS="%{_buildrootdir}/bin/node-stdout-nonblocking-wrapper"' >> .mozconfig
+
+# Remove executable bit to make brp-mangle-shebangs happy.
+chmod -x third_party/rust/itertools/src/lib.rs
+chmod a-x third_party/rust/ash/src/extensions/ext/*.rs
+chmod a-x third_party/rust/ash/src/extensions/khr/*.rs
+chmod a-x third_party/rust/ash/src/extensions/nv/*.rs
+
+#---------------------------------------------------------------------
+
+%build
+# TODO: causes SIGSEGV on the webrender compilation, we might remove it with newer rust version
+# Disable LTO to work around rhbz#1883904
+%define _lto_cflags %{nil}
+
+export PATH="%{_buildrootdir}/bin:$PATH"
+# Cleanup buildroot for existing rpms from bundled nss/nspr and other packages
+rm -rf %{_buildrootdir}/*
+
+function install_rpms_to_current_dir() {
+ PACKAGE_RPM=$(eval echo $1)
+ PACKAGE_DIR=%{_rpmdir}
+
+ if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then
+ # Hack for tps tests
+ ARCH_STR=%{_arch}
+ %ifarch %{ix86}
+ ARCH_STR="i?86"
+ %endif
+ PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR"
+ fi
+
+ for package in $(ls $PACKAGE_DIR/$PACKAGE_RPM)
+ do
+ echo "$package"
+ rpm2cpio "$package" | cpio -idu
+ done
+}
+
+%if 0%{?bundle_nss}
+ rpm -ivh %{SOURCE402}
+ rpmbuild --nodeps --define '_prefix %{bundled_install_path}' --without=tests -ba %{_specdir}/nspr.spec
+ pushd %{_buildrootdir}
+ install_rpms_to_current_dir nspr-4*.rpm
+ install_rpms_to_current_dir nspr-devel*.rpm
+ popd
+ echo "Setting nspr flags"
+ # nss-setup-flags-env.inc
+ sed -i 's@%{bundled_install_path}@%{_buildrootdir}%{bundled_install_path}@g' %{_buildrootdir}%{bundled_install_path}/%{_lib}/pkgconfig/nspr*.pc
+ cat %{_buildrootdir}%{bundled_install_path}/%{_lib}/pkgconfig/nspr*.pc
+
+ export LDFLAGS="-L%{_buildrootdir}%{bundled_install_path}/%{_lib} $LDFLAGS"
+ export LDFLAGS="-Wl,-rpath,%{bundled_install_path}/%{_lib} $LDFLAGS"
+ export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{bundled_install_path}/%{_lib} $LDFLAGS"
+ export PKG_CONFIG_PATH=%{_buildrootdir}%{bundled_install_path}/%{_lib}/pkgconfig
+ pkg-config --libs-only-L nspr
+ pkg-config --libs nspr
+ export PATH="%{_buildrootdir}%{bundled_install_path}/bin:$PATH"
+
+ export PATH=%{_buildrootdir}/%{bundled_install_path}/bin:$PATH
+ echo $PKG_CONFIG_PATH
+
+%if 0%{?rhel} == 8
+ rpm -ivh %{SOURCE403}
+%else
+ rpm -ivh %{SOURCE404}
+%endif
+ rpmbuild --nodeps --define '_prefix %{bundled_install_path}' --without=tests -ba %{_specdir}/nss.spec
+ pushd %{_buildrootdir}
+ #cleanup
+ install_rpms_to_current_dir nss-3*.rpm
+ install_rpms_to_current_dir nss-devel*.rpm
+ install_rpms_to_current_dir nss-pkcs11-devel*.rpm
+ install_rpms_to_current_dir nss-softokn-3*.rpm
+ install_rpms_to_current_dir nss-softokn-devel*.rpm
+ install_rpms_to_current_dir nss-softokn-freebl-3*.rpm
+ install_rpms_to_current_dir nss-softokn-freebl-devel*.rpm
+ install_rpms_to_current_dir nss-util-3*.rpm
+ install_rpms_to_current_dir nss-util-devel*.rpm
+ popd
+ %filter_provides_in %{bundled_install_path}/%{_lib}
+ %filter_requires_in %{bundled_install_path}/%{_lib}
+ %filter_from_requires /libnss3.so.*/d
+ %filter_from_requires /libsmime3.so.*/d
+ %filter_from_requires /libssl3.so.*/d
+ %filter_from_requires /libnssutil3.so.*/d
+ %filter_from_requires /libnspr4.so.*/d
+ find %{_buildrootdir}
+%endif
+
+# Enable toolsets
+set +e
+%if 0%{?rhel} == 8 && %{rhel_minor_version} < 6
+ %ifarch aarch64
+source scl_source enable gcc-toolset-12
+ %endif
+%endif
+%if 0%{?use_dts}
+source scl_source enable devtoolset-%{dts_version}
+%endif
+%if 0%{?use_rust_ts}
+source scl_source enable rust-toolset-%{rust_version}
+%endif
+%if 0%{?use_nodejs_scl}
+source scl_source enable rh-nodejs10
+%endif
+%if 0%{?use_llvm_ts}
+source scl_source enable llvm-toolset-%{llvm_version}
+%endif
+%if 0%{?use_python3_scl}
+source scl_source enable rh-python38
+%endif
+
+set -e
+env
+which gcc
+which c++
+which g++
+which ld
+which nasm
+which node
+which python3
+# Bundled cbindgen
+mkdir -p my_rust_vendor
+cd my_rust_vendor
+%{__tar} xf %{SOURCE2}
+mkdir -p .cargo
+cat > .cargo/config <<EOL
+[source.crates-io]
+replace-with = "vendored-sources"
+
+[source.vendored-sources]
+directory = "`pwd`"
+EOL
+
+%ifarch aarch64
+#export RUSTFLAGS="-Cdebuginfo=0 -Clinker=/opt/rh/gcc-toolset-12/root/usr/bin/gcc"
+%endif
+
+env CARGO_HOME=.cargo cargo install cbindgen
+export PATH=`pwd`/.cargo/bin:$PATH
+cd -
+
+# end of Bundled cbindgen
+
+mkdir %{_buildrootdir}/bin || :
+cp %{SOURCE32} %{_buildrootdir}/bin || :
+
+# Update the various config.guess to upstream release for aarch64 support
+# Do not update config.guess in the ./third_party/rust because that would break checksums
+find ./ -path ./third_party/rust -prune -o -name config.guess -exec cp /usr/lib/rpm/config.guess {} ';'
+
+MOZ_OPT_FLAGS=$(echo "%{optflags}" | %{__sed} -e 's/-Wall//')
+#rhbz#1037063
+# -Werror=format-security causes build failures when -Wno-format is explicitly given
+# for some sources
+# Explicitly force the hardening flags for Firefox so it passes the checksec test;
+# See also https://fedoraproject.org/wiki/Changes/Harden_All_Packages
+%if 0%{?fedora} < 30
+MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -Wformat-security -Wformat -Werror=format-security"
+%else
+# Workaround for mozbz#1531309
+MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-Werror=format-security//')
+%endif
+
+%if 0%{?fedora} > 30
+MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -fpermissive"
+%endif
+
+MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -fPIC -Wl,-z,relro -Wl,-z,now"
+%if %{?debug_build}
+MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-O2//')
+%endif
+
+%ifarch %{ix86}
+MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-g/-g0/')
+export MOZ_DEBUG_FLAGS=" "
+%endif
+
+%ifarch s390x aarch64 %{ix86}
+MOZ_LINK_FLAGS="-Wl,--no-keep-memory -Wl,--reduce-memory-overheads"
+%endif
+
+%if 0%{?flatpak}
+# Make sure the linker can find libraries in /app/lib64 as we don't use
+# __global_ldflags that normally sets this.
+MOZ_LINK_FLAGS="$MOZ_LINK_FLAGS -L%{_libdir}"
+%endif
+%ifarch %{ix86} %{s390x}
+export RUSTFLAGS="-Cdebuginfo=0"
+echo 'export RUSTFLAGS="-Cdebuginfo=0"' >> .mozconfig
+%endif
+
+%if 0%{?bundle_nss}
+ mkdir -p %{_buildrootdir}%{bundled_install_path}/%{_lib}
+ MOZ_LINK_FLAGS="-L%{_buildrootdir}%{bundled_install_path}/%{_lib} $MOZ_LINK_FLAGS"
+ MOZ_LINK_FLAGS="-Wl,-rpath,%{bundled_install_path}/%{_lib} $MOZ_LINK_FLAGS"
+ MOZ_LINK_FLAGS="-Wl,-rpath-link,%{_buildrootdir}%{bundled_install_path}/%{_lib} $MOZ_LINK_FLAGS"
+%endif
+
+# We don't wantfirefox to use CK_GCM_PARAMS_V3 in nss
+MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -DNSS_PKCS11_3_0_STRICT"
+
+echo "export CFLAGS=\"$MOZ_OPT_FLAGS\"" >> .mozconfig
+echo "export CXXFLAGS=\"$MOZ_OPT_FLAGS\"" >> .mozconfig
+echo "export LDFLAGS=\"$MOZ_LINK_FLAGS\"" >> .mozconfig
+echo "export CC=gcc" >> .mozconfig
+echo "export CXX=g++" >> .mozconfig
+echo "export AR=\"gcc-ar\"" >> .mozconfig
+echo "export NM=\"gcc-nm\"" >> .mozconfig
+echo "export RANLIB=\"gcc-ranlib\"" >> .mozconfig
+
+MOZ_SMP_FLAGS=-j1
+# On x86_64 architectures, Mozilla can build up to 4 jobs at once in parallel,
+# however builds tend to fail on other arches when building in parallel.
+#%ifarch %{ix86} s390x aarch64 ppc64le
+#[ -z "$RPM_BUILD_NCPUS" ] && \
+# RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
+#[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2
+#%endif
+#%ifarch x86_64 ppc ppc64 ppc64le
+[ -z "$RPM_BUILD_NCPUS" ] && \
+ RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
+[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2
+[ "$RPM_BUILD_NCPUS" -ge 4 ] && MOZ_SMP_FLAGS=-j4
+[ "$RPM_BUILD_NCPUS" -ge 8 ] && MOZ_SMP_FLAGS=-j8
+[ "$RPM_BUILD_NCPUS" -ge 16 ] && MOZ_SMP_FLAGS=-j16
+#%endif
+
+echo "mk_add_options MOZ_MAKE_FLAGS=\"$MOZ_SMP_FLAGS\"" >> .mozconfig
+echo "mk_add_options MOZ_SERVICES_SYNC=1" >> .mozconfig
+echo "export STRIP=/bin/true" >> .mozconfig
+
+%if %{launch_wayland_compositor}
+cp %{SOURCE36} .
+. ./testing.sh run_wayland_compositor
+%endif
+
+# We could use %%include, but in %%files, %%post and other sections, but in these
+# sections it could lead to syntax errors about unclosed %%if. Work around it by
+# using the following macro
+%define include_file() %{expand:%(cat '%1')}
+
+%if 0%{?bundle_nss}
+ echo "Setting nss flags"
+ # nss-setup-flags-env.inc
+ %include_file %{SOURCE401}
+ export PATH=%{_buildrootdir}/%{bundled_install_path}/bin:$PATH
+ echo $PKG_CONFIG_PATH
+%endif
+
+./mach build -v 2>&1 || exit 1
+
+#---------------------------------------------------------------------
+%install
+export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
+function install_rpms_to_current_dir() {
+ PACKAGE_RPM=$(eval echo $1)
+ PACKAGE_DIR=%{_rpmdir}
+
+ if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then
+ # Hack for tps tests
+ ARCH_STR=%{_arch}
+ %ifarch %{ix86}
+ ARCH_STR="i?86"
+ %endif
+ PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR"
+ fi
+
+ for package in $(ls $PACKAGE_DIR/$PACKAGE_RPM)
+ do
+ echo "$package"
+ rpm2cpio "$package" | cpio -idu
+ done
+}
+
+%if 0%{?bundle_nss}
+ pushd %{buildroot}
+ install_rpms_to_current_dir nspr-4*.rpm
+ install_rpms_to_current_dir nss-3*.rpm
+ install_rpms_to_current_dir nss-softokn-3*.rpm
+ install_rpms_to_current_dir nss-softokn-freebl-3*.rpm
+ install_rpms_to_current_dir nss-util-3*.rpm
+
+ # cleanup unecessary nss files
+ rm -rf %{buildroot}/%{bundled_install_path}/lib/dracut
+ rm -rf %{buildroot}/%{bundled_install_path}/%{_lib}/nss
+ rm -rf %{buildroot}/%{bundled_install_path}/%{_lib}/share
+ rm -rf %{buildroot}/%{bundled_install_path}/share
+ rm -rf %{buildroot}/etc/pki
+ rm -rf %{buildroot}/usr/lib/.build-id
+ rm -rf %{buildroot}/etc/crypto-policies
+ popd
+%endif
+
+# run Firefox test suite
+%if %{launch_wayland_compositor}
+cp %{SOURCE36} .
+. ./testing.sh run_wayland_compositor
+%endif
+
+%if 0%{?run_firefox_tests}
+ mkdir -p objdir/_virtualenvs/init_py3
+ %{__cat} > objdir/_virtualenvs/init_py3/pip.conf << EOF
+[global]
+find-links=`pwd`/mochitest-python
+no-index=true
+EOF
+ tar xf %{SOURCE37}
+ cp %{SOURCE36} .
+ mkdir -p test_results
+ %if %{?test_on_wayland}
+ ./testing.sh run_tests_wayland || true
+ %else
+ ./testing.sh run_tests_x11 || true
+ %endif
+ ./testing.sh print_results > test_summary.txt 2>&1 || true
+ ./testing.sh print_failures || true
+%endif
+
+# set up our default bookmarks
+%if !0%{?flatpak}
+ %global default_bookmarks_file /usr/share/bookmarks/default-bookmarks.html
+ %{__cp} -p %{default_bookmarks_file} objdir/dist/bin/browser/chrome/browser/content/browser/default-bookmarks.html
+%endif
+
+# Make sure locale works for langpacks
+%{__cat} > objdir/dist/bin/browser/defaults/preferences/firefox-l10n.js << EOF
+pref("general.useragent.locale", "chrome://global/locale/intl.properties");
+EOF
+
+DESTDIR=%{buildroot} make -C objdir install
+
+%{__mkdir_p} %{buildroot}{%{_libdir},%{_bindir},%{_datadir}/applications}
+
+desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE20}
+%if 0%{?rhel} >= 9
+desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE31}
+%endif
+
+# set up the firefox start script
+%{__rm} -rf %{buildroot}%{_bindir}/firefox
+%{__sed} -e 's,/__PREFIX__,%{_prefix},g' %{SOURCE21} > %{buildroot}%{_bindir}/firefox
+%{__chmod} 755 %{buildroot}%{_bindir}/firefox
+
+%if 0%{?flatpak}
+sed -i -e 's|%FLATPAK_ENV_VARS%|export TMPDIR="$XDG_CACHE_HOME/tmp"|' %{buildroot}%{_bindir}/firefox
+%else
+sed -i -e 's|%FLATPAK_ENV_VARS%||' %{buildroot}%{_bindir}/firefox
+%endif
+
+# Run firefox under wayland only on RHEL9 and newer
+%if 0%{?rhel} < 9
+sed -i -e 's|%DISABLE_WAYLAND_PLACEHOLDER%|export MOZ_DISABLE_WAYLAND=1|' %{buildroot}%{_bindir}/firefox
+%else
+sed -i -e 's|%DISABLE_WAYLAND_PLACEHOLDER%||' %{buildroot}%{_bindir}/firefox
+# firefox-x11 launch script for RHEL9 only
+%{__sed} -e 's,/__PREFIX__,%{_prefix},g' %{SOURCE30} > %{buildroot}%{_bindir}/firefox-x11
+%{__chmod} 755 %{buildroot}%{_bindir}/firefox-x11
+%endif
+
+%{__install} -p -D -m 644 %{SOURCE23} %{buildroot}%{_mandir}/man1/firefox.1
+
+%{__rm} -f %{buildroot}/%{mozappdir}/firefox-config
+%{__rm} -f %{buildroot}/%{mozappdir}/update-settings.ini
+
+for s in 16 22 24 32 48 256; do
+ %{__mkdir_p} %{buildroot}%{_datadir}/icons/hicolor/${s}x${s}/apps
+ %{__cp} -p browser/branding/official/default${s}.png \
+ %{buildroot}%{_datadir}/icons/hicolor/${s}x${s}/apps/firefox.png
+done
+
+# Install hight contrast icon
+%{__mkdir_p} %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps
+%{__cp} -p %{SOURCE25} \
+ %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps
+
+echo > %{name}.lang
+%if %{with langpacks}
+# Extract langpacks, make any mods needed, repack the langpack, and install it.
+%{__mkdir_p} %{buildroot}%{langpackdir}
+%{__tar} xf %{SOURCE1}
+for langpack in `ls firefox-langpacks/*.xpi`; do
+ language=`basename $langpack .xpi`
+ extensionID=langpack-$language@firefox.mozilla.org
+ %{__mkdir_p} $extensionID
+ unzip -qq $langpack -d $extensionID
+ find $extensionID -type f | xargs chmod 644
+
+ cd $extensionID
+ zip -qq -r9mX ../${extensionID}.xpi *
+ cd -
+
+ %{__install} -m 644 ${extensionID}.xpi %{buildroot}%{langpackdir}
+ language=`echo $language | sed -e 's/-/_/g'`
+%if 0%{?flatpak}
+ echo "%{langpackdir}/${extensionID}.xpi" >> %{name}.lang
+%else
+ echo "%%lang($language) %{langpackdir}/${extensionID}.xpi" >> %{name}.lang
+%endif
+done
+%{__rm} -rf firefox-langpacks
+
+# Install langpack workaround (see #707100, #821169)
+function create_default_langpack() {
+language_long=$1
+language_short=$2
+cd %{buildroot}%{langpackdir}
+ln -s langpack-$language_long@firefox.mozilla.org.xpi langpack-$language_short@firefox.mozilla.org.xpi
+cd -
+echo "%%lang($language_short) %{langpackdir}/langpack-$language_short@firefox.mozilla.org.xpi" >> %{name}.lang
+}
+
+# Table of fallbacks for each language
+# please file a bug at bugzilla.redhat.com if the assignment is incorrect
+#create_default_langpack "bn-IN" "bn"
+create_default_langpack "es-AR" "es"
+create_default_langpack "fy-NL" "fy"
+create_default_langpack "ga-IE" "ga"
+create_default_langpack "gu-IN" "gu"
+create_default_langpack "hi-IN" "hi"
+create_default_langpack "hy-AM" "hy"
+create_default_langpack "nb-NO" "nb"
+create_default_langpack "nn-NO" "nn"
+create_default_langpack "pa-IN" "pa"
+create_default_langpack "pt-PT" "pt"
+create_default_langpack "sv-SE" "sv"
+create_default_langpack "zh-TW" "zh"
+%endif
+
+# Keep compatibility with the old preference location.
+%{__mkdir_p} %{buildroot}%{mozappdir}/defaults/preferences
+%{__mkdir_p} %{buildroot}%{mozappdir}/browser/defaults
+ln -s %{mozappdir}/defaults/preferences $RPM_BUILD_ROOT/%{mozappdir}/browser/defaults/preferences
+# Default preferences
+%{__cp} %{SOURCE12} %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js
+sed -i -e 's|%PREFIX%|%{_prefix}|' %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js
+sed -i -e 's|%HOMEPAGE%|%{homepage}|' %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js
+# Enable modern crypto for the key export on the RHEL9 only (rhbz#1764205)
+%if 0%{?rhel} == 9
+ echo 'pref("security.pki.use_modern_crypto_with_pkcs12", true);' >> %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js
+%endif
+
+%ifarch s390x
+ echo 'pref("gfx.webrender.force-disabled", true);' >> %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js
+%endif
+
+%ifarch s390x ppc64
+ echo 'pref("gfx.webrender.force-disabled", true);' >> %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js
+%endif
+
+# System config dir
+%{__mkdir_p} %{buildroot}/%{_sysconfdir}/%{name}/pref
+
+# System extensions
+%global firefox_app_id \{ec8030f7-c20a-464f-9b0e-13a3a9e97384\}
+%{__mkdir_p} %{buildroot}%{_datadir}/mozilla/extensions/%{firefox_app_id}
+%{__mkdir_p} %{buildroot}%{_libdir}/mozilla/extensions/%{firefox_app_id}
+
+# Copy over the LICENSE
+%{__install} -p -c -m 644 LICENSE %{buildroot}/%{mozappdir}
+
+# Use the system hunspell dictionaries
+%{__rm} -rf %{buildroot}%{mozappdir}/dictionaries
+ln -s %{_datadir}/myspell %{buildroot}%{mozappdir}/dictionaries
+
+%if 0%{?run_firefox_tests}
+%{__mkdir_p} %{buildroot}/%{version}-%{release}/test_results
+%{__cp} test_results/* %{buildroot}/%{version}-%{release}/test_results
+%{__cp} test_summary.txt %{buildroot}/%{version}-%{release}/
+%{__cp} failures-* %{buildroot}/%{version}-%{release}/ || true
+%endif
+
+# Copy over run-mozilla.sh
+%{__cp} build/unix/run-mozilla.sh %{buildroot}%{mozappdir}
+
+# Add distribution.ini
+%{__mkdir_p} %{buildroot}%{mozappdir}/distribution
+%{__cp} %{SOURCE26} %{buildroot}%{mozappdir}/distribution
+
+# Install appdata file
+mkdir -p %{buildroot}%{_datadir}/metainfo
+%{__sed} -e "s/__VERSION__/%{version}/" \
+ -e "s/__DATE__/$(date '+%Y-%m-%d')/" \
+ %{SOURCE33} > %{buildroot}%{_datadir}/metainfo/firefox.appdata.xml
+
+# Install Gnome search provider files
+mkdir -p %{buildroot}%{_datadir}/gnome-shell/search-providers
+%{__cp} %{SOURCE34} %{buildroot}%{_datadir}/gnome-shell/search-providers
+
+# Remove gtk2 support as flash plugin is no longer supported
+rm -rf %{buildroot}%{mozappdir}/gtk2/
+
+# Create a symlink to replace libnssckbi.so with p11-kit-client.so
+# instead of p11-kit-trust.so, so that Firefox can see the system
+# trust store on the host through the p11-kit RPC protocol. A symlink
+# to libnss3.so is also needed, because Firefox tries to load
+# libnssckbi.so from the same directory where libnss3.so is loaded (as
+# of Firefox 89).
+%if 0%{?flatpak}
+ln -sf /usr/lib64/libnss3.so %{buildroot}%{_libdir}/libnss3.so
+ln -sf /usr/lib64/pkcs11/p11-kit-client.so %{buildroot}%{_libdir}/libnssckbi.so
+%endif
+
+# clean the created bundled rpms if there are any
+rm -rf %{_srcrpmdir}/libffi*.src.rpm
+find %{_rpmdir} -name "libffi*.rpm" -delete
+rm -rf %{_srcrpmdir}/openssl*.src.rpm
+find %{_rpmdir} -name "openssl*.rpm" -delete
+rm -rf %{_srcrpmdir}/nss*.src.rpm
+find %{_rpmdir} -name "nss*.rpm" -delete
+rm -rf %{_srcrpmdir}/nspr*.src.rpm
+find %{_rpmdir} -name "nspr*.rpm" -delete
+
+#---------------------------------------------------------------------
+
+%check
+appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/*.appdata.xml
+
+%preun
+# is it a final removal?
+if [ $1 -eq 0 ]; then
+ %{__rm} -rf %{mozappdir}/components
+ %{__rm} -rf %{mozappdir}/extensions
+ %{__rm} -rf %{mozappdir}/plugins
+fi
+
+%post
+update-desktop-database &> /dev/null || :
+touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
+
+%postun
+update-desktop-database &> /dev/null || :
+if [ $1 -eq 0 ] ; then
+ touch --no-create %{_datadir}/icons/hicolor &>/dev/null
+ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+ %{__rm} -rf %{langpackdir}
+fi
+
+%posttrans
+gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+
+%files -f %{name}.lang
+%{_bindir}/firefox
+%{mozappdir}/firefox
+%{mozappdir}/firefox-bin
+%doc %{_mandir}/man1/*
+%dir %{_sysconfdir}/%{name}
+%dir %{_sysconfdir}/%{name}/*
+%dir %{_datadir}/mozilla/extensions/*
+%dir %{_libdir}/mozilla/extensions/*
+%{_datadir}/applications/%{name}.desktop
+%{_datadir}/metainfo/*.appdata.xml
+%{_datadir}/gnome-shell/search-providers/*.ini
+%dir %{mozappdir}
+%license %{mozappdir}/LICENSE
+%{mozappdir}/browser/chrome
+%{mozappdir}/defaults/preferences/*
+%{mozappdir}/browser/defaults/preferences
+%{mozappdir}/browser/features/*.xpi
+%{mozappdir}/distribution/distribution.ini
+# That's Windows only
+%ghost %{mozappdir}/browser/features/aushelper@mozilla.org.xpi
+%if %{with langpacks}
+%dir %{langpackdir}
+%endif
+%{mozappdir}/browser/omni.ja
+%{mozappdir}/run-mozilla.sh
+%{mozappdir}/application.ini
+%{mozappdir}/pingsender
+%exclude %{mozappdir}/removed-files
+%if 0%{?flatpak}
+%{_libdir}/libnss3.so
+%{_libdir}/libnssckbi.so
+%endif
+%{_datadir}/icons/hicolor/16x16/apps/firefox.png
+%{_datadir}/icons/hicolor/22x22/apps/firefox.png
+%{_datadir}/icons/hicolor/24x24/apps/firefox.png
+%{_datadir}/icons/hicolor/256x256/apps/firefox.png
+%{_datadir}/icons/hicolor/32x32/apps/firefox.png
+%{_datadir}/icons/hicolor/48x48/apps/firefox.png
+%{_datadir}/icons/hicolor/symbolic/apps/firefox-symbolic.svg
+%{mozappdir}/*.so
+%{mozappdir}/defaults/pref/channel-prefs.js
+%{mozappdir}/dependentlibs.list
+%{mozappdir}/dictionaries
+%{mozappdir}/omni.ja
+%{mozappdir}/platform.ini
+%{mozappdir}/plugin-container
+%{mozappdir}/gmp-clearkey
+%{mozappdir}/fonts/TwemojiMozilla.ttf
+%{mozappdir}/glxtest
+%{mozappdir}/vaapitest
+
+%if !%{?system_nss}
+%exclude %{mozappdir}/libnssckbi.so
+%endif
+
+%if 0%{?bundle_nss}
+%{mozappdir}/bundled/%{_lib}/libfreebl*
+%{mozappdir}/bundled/%{_lib}/libnss*
+%{mozappdir}/bundled/%{_lib}/libsmime3*
+%{mozappdir}/bundled/%{_lib}/libsoftokn*
+%{mozappdir}/bundled/%{_lib}/libssl3*
+%{mozappdir}/bundled/%{_lib}/libnspr4.so
+%{mozappdir}/bundled/%{_lib}/libplc4.so
+%{mozappdir}/bundled/%{_lib}/libplds4.so
+%endif
+
+#---------------------------------------------------------------------
+
+%changelog
+* Fri Mar 22 2024 Eike Rathke <erack@redhat.com> - 115.9.1-1
+- Update to 115.9.1
+
+* Fri Mar 15 2024 Eike Rathke <erack@redhat.com> - 115.9.0-2
+- Update to 115.9.0 build2
+
+* Tue Mar 12 2024 Eike Rathke <erack@redhat.com> - 115.9.0-1
+- Update to 115.9.0 build1
+- Fix expat CVE-2023-52425
+
+* Tue Feb 13 2024 Eike Rathke <erack@redhat.com> - 115.8.0-1
+- Update to 115.8.0 build1
+
+* Tue Jan 16 2024 Eike Rathke <erack@redhat.com> - 115.7.0-1
+- Update to 115.7.0 build1
+
+* Tue Dec 12 2023 Eike Rathke <erack@redhat.com> - 115.6.0-1
+- Update to 115.6.0 build1
+
+* Tue Nov 14 2023 Eike Rathke <erack@redhat.com> - 115.5.0-1
+- Update to 115.5.0 build1
+
+* Tue Oct 17 2023 Eike Rathke <erack@redhat.com> - 115.4.0-1
+- Update to 115.4.0 build1
+- Add fix for CVE-2023-44488
+- Set homepage from os-release HOME_URL
+
+* Fri Sep 29 2023 Eike Rathke <erack@redhat.com> - 115.3.1-1
+- Update to 115.3.1
+
+* Thu Sep 21 2023 Jan Horak <jhorak@redhat.com> - 115.3.0-1
+- Update to 115.3.0 ESR
+
+* Mon Sep 4 2023 Jan Horak <jhorak@redhat.com> - 115.2.0-3
+- Update to 115.2.0 ESR
+
+* Wed Aug 2 2023 Jan Horak <jhorak@redhat.com> - 115.1.0-1
+- Update to 115.1.0 ESR
+
+* Mon Jul 17 2023 Jan Horak <jhorak@redhat.com> - 115.0.2-1
+- Update to 115.0.2 ESR
+
+* Wed Jun 21 2023 Jan Horak <jhorak@redhat.com> - 115.0b8-1
+- Update to 115.0b8
+
+* Thu May 04 2023 Eike Rathke <erack@redhat.com> - 102.11.0-2
+- Update to 102.11.0 build2
+
+* Tue May 02 2023 Eike Rathke <erack@redhat.com> - 102.11.0-1
+- Update to 102.11.0 build1
+
+* Tue Apr 04 2023 Eike Rathke <erack@redhat.com> - 102.10.0-1
+- Update to 102.10.0 build1
+
+* Fri Mar 10 2023 Eike Rathke <erack@redhat.com> - 102.9.0-4
+- Update to 102.9.0 build2
+
+* Thu Mar 09 2023 Jan Horak <jhorak@redhat.com> - 102.9.0-2
+- removed disable-openh264-download
+
+* Tue Mar 07 2023 Eike Rathke <erack@redhat.com> - 102.9.0-1
+- Update to 102.9.0 build1
+
+* Tue Feb 14 2023 Eike Rathke <erack@redhat.com> - 102.8.0-2
+- Update to 102.8.0 build2
+
+* Tue Feb 07 2023 Eike Rathke <erack@redhat.com> - 102.8.0-1
+- Update to 102.8.0 build1
+
+* Tue Jan 10 2023 Eike Rathke <erack@redhat.com> - 102.7.0-1
+- Update to 102.7.0 build1
+
+* Mon Jan 02 2023 Jan Horak <jhorak@redhat.com> - 102.6.0-2
+- Add firefox-x11 subpackage to allow explicit run of firefox under x11 on RHEL9
+
+* Tue Dec 06 2022 Eike Rathke <erack@redhat.com> - 102.6.0-1
+- Update to 102.6.0 build1
+
+* Fri Nov 25 2022 Jan Horak <jhorak@redhat.com> - 102.5.0-2
+- Added libwebrtc screencast patch for newer features
+
+* Wed Nov 09 2022 Eike Rathke <erack@redhat.com> - 102.5.0-1
+- Update to 102.5.0 build1
+
+* Wed Oct 12 2022 Eike Rathke <erack@redhat.com> - 102.4.0-1
+- Update to 102.4.0 build1
+
+* Tue Oct 11 2022 Jan Horak <jhorak@redhat.com> - 102.3.0-7
+- Fix for expat CVE-2022-40674 and non functional webrtc
+
+* Tue Sep 13 2022 Jan Horak <jhorak@redhat.com> - 102.3.0-6
+- Update to 102.3.0 build1
+
+* Thu Jul 21 2022 Eike Rathke <erack@redhat.com> - 91.12.0-1
+- Update to 91.12.0 build1
+
+* Thu Jun 23 2022 Eike Rathke <erack@redhat.com> - 91.11.0-2
+- Update to 91.11.0 build2
+
+* Tue Jun 21 2022 Eike Rathke <erack@redhat.com> - 91.11.0-1
+- Update to 91.11.0 build1
+
+* Tue May 24 2022 Eike Rathke <erack@redhat.com> - 91.10.0-1
+- Update to 91.10.0 build1
+
+* Fri May 20 2022 Jan Horak <jhorak@redhat.com> - 91.9.1-1
+- Update to 91.9.1 build1
+
+* Tue Apr 26 2022 Eike Rathke <erack@redhat.com> - 91.9.0-1
+- Update to 91.9.0
+
+* Tue Apr 05 2022 Eike Rathke <erack@redhat.com> - 91.8.0-1
+- Update to 91.8.0
+
+* Mon Mar 07 2022 Eike Rathke <erack@redhat.com> - 91.7.0-3
+- Update to 91.7.0 build3
+
+* Wed Mar 02 2022 Jan Horak <jhorak@redhat.com> - 91.7.0-2
+- Added expat backports of CVE-2022-25235, CVE-2022-25236 and CVE-2022-25315
+
+* Tue Mar 01 2022 Eike Rathke <erack@redhat.com> - 91.7.0-1
+- Update to 91.7.0 build2
+
+* Fri Feb 25 2022 Jan Horak <jhorak@redhat.com> - 91.6.0-2
+- Install langpacks to the browser/extensions to make them available in UI:
+ rhbz#2030190
+
+* Wed Feb 02 2022 Eike Rathke <erack@redhat.com> - 91.6.0-1
+- Update to 91.6.0 build1
+
+* Wed Feb 02 2022 Jan Horak <jhorak@redhat.com> - 91.5.0-2
+- Use default update channel to fix non working enterprise policies:
+ rhbz#2044667
+
+* Thu Jan 06 2022 Eike Rathke <erack@redhat.com> - 91.5.0-1
+- Update to 91.5.0 build1
+
+* Mon Dec 13 2021 Jan Horak <jhorak@redhat.com> - 91.4.0-2
+- Added fix for failing addons signatures.
+
+* Wed Dec 01 2021 Eike Rathke <erack@redhat.com> - 91.4.0-1
+- Update to 91.4.0 build1
+
+* Mon Nov 01 2021 Eike Rathke <erack@redhat.com> - 91.3.0-1
+- Update to 91.3.0 build1
+
+* Thu Oct 21 2021 Jan Horak <jhorak@redhat.com> - 91.2.0-5
+- Fixed crashes when FIPS is enabled.
+
+* Mon Oct 04 2021 Jan Horak <jhorak@redhat.com> - 91.2.0-4
+- Disable webrender on the s390x due to wrong colors: rhbz#2009503
+
+* Wed Sep 29 2021 Jan Horak <jhorak@redhat.com> - 91.2.0-3
+- Update to 91.2.0 build1
+
+* Wed Sep 15 2021 Jan Horak <jhorak@redhat.com> - 91.1.0-1
+- Update to 91.1.0 build1
+
+* Tue Aug 17 2021 Jan Horak <jhorak@redhat.com>
+- Update to 91.0.1 build1
+
+* Tue Aug 10 2021 Jan Horak <jhorak@redhat.com> - 91.0-1
+- Update to 91.0 ESR
+
+* Thu Jul 29 2021 Jan Horak <jhorak@redhat.com> - 91.0-1
+- Update to 91.0b8
+
+* Fri Jul 16 2021 Jan Horak <jhorak@redhat.com> - 78.12.0-2
+- Rebuild to pickup older nss
+
+* Wed Jul 07 2021 Eike Rathke <erack@redhat.com> - 78.12.0-1
+- Update to 78.12.0 build1
+
+* Mon May 31 2021 Eike Rathke <erack@redhat.com> - 78.11.0-3
+- Update to 78.11.0 build2 (release)
+
+* Thu May 27 2021 Eike Rathke <erack@redhat.com> - 78.11.0-2
+- Fix rhel_minor_version for dist .el8_4 and .el8
+
+* Tue May 25 2021 Eike Rathke <erack@redhat.com> - 78.11.0-1
+- Update to 78.11.0 build1
+
+* Tue Apr 20 2021 Eike Rathke <erack@redhat.com> - 78.10.0-1
+- Update to 78.10.0
+
+* Wed Mar 17 2021 Eike Rathke <erack@redhat.com> - 78.9.0-1
+- Update to 78.9.0 build1
+
+* Wed Feb 17 2021 Eike Rathke <erack@redhat.com> - 78.8.0-1
+- Update to 78.8.0 build2
+
+* Tue Feb 09 2021 Eike Rathke <erack@redhat.com> - 78.7.1-1
+- Update to 78.7.1
+
+* Tue Feb 09 2021 Jan Horak <jhorak@redhat.com> - 78.7.0-3
+- Fixing install prefix for the homepage
+
+* Fri Jan 22 2021 Eike Rathke <erack@redhat.com> - 78.7.0-2
+- Update to 78.7.0 build2
+
+* Wed Jan 20 2021 Eike Rathke <erack@redhat.com> - 78.7.0-1
+- Update to 78.7.0 build1
+
+* Wed Jan 6 2021 Eike Rathke <erack@redhat.com> - 78.6.1-1
+- Update to 78.6.1 build1
+
+* Thu Dec 10 2020 Jan Horak <jhorak@redhat.com> - 78.6.0-1
+- Update to 78.6.0 build1
+
+* Wed Nov 18 2020 Jan Horak <jhorak@redhat.com> - 78.5.0-1
+- Update to 78.5.0 build1
+
+* Tue Nov 10 2020 erack@redhat.com - 78.4.1-1
+- Update to 78.4.1
+
+* Tue Nov 10 2020 Jan Horak <jhorak@redhat.com> - 78.4.0-3
+- Fixing flatpak build, fixing firefox.sh.in to not disable langpacks loading
+
+* Thu Oct 29 2020 Jan Horak <jhorak@redhat.com> - 78.4.0-2
+- Enable addon sideloading
+
+* Fri Oct 16 2020 Jan Horak <jhorak@redhat.com> - 78.4.0-1
+- Update to 78.4.0 build2
+
+* Fri Sep 18 2020 Jan Horak <jhorak@redhat.com>
+- Update to 78.3.0 build1
+
+* Tue Aug 18 2020 Jan Horak <jhorak@redhat.com> - 78.2.0-3
+- Update to 78.2.0 build1
+
+* Fri Jul 24 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.11.0 build1
+
+* Fri Jun 26 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.10.0 build1
+
+* Fri May 29 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.9.0 build1
+- Added patch for pipewire 0.3
+
+* Mon May 11 2020 Jan Horak <jhorak@redhat.com>
+- Added s390x specific patches
+
+* Wed Apr 29 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.8.0 build1
+
+* Thu Apr 23 2020 Martin Stransky <stransky@redhat.com> - 68.7.0-3
+- Added fix for rhbz#1821418
+
+* Tue Apr 07 2020 Jan Horak <jhorak@redhat.com> - 68.7.0-2
+- Update to 68.7.0 build3
+
+* Mon Apr 6 2020 Jan Horak <jhorak@redhat.com> - 68.6.1-1
+- Update to 68.6.1 ESR
+
+* Wed Mar 04 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.6.0 build1
+
+* Mon Feb 24 2020 Martin Stransky <stransky@redhat.com> - 68.5.0-3
+- Added fix for rhbz#1805667
+- Enabled mzbz@1170092 - Firefox prefs at /etc
+
+* Fri Feb 07 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.5.0 build2
+
+* Wed Feb 05 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.5.0 build1
+
+* Wed Jan 08 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.4.1esr build1
+
+* Fri Jan 03 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.4.0esr build1
+
+* Wed Dec 18 2019 Jan Horak <jhorak@redhat.com>
+- Fix for wrong intl.accept_lang when using non en-us langpack
+
+* Wed Nov 27 2019 Martin Stransky <stransky@redhat.com> - 68.3.0-1
+- Update to 68.3.0 ESR
+
+* Thu Oct 24 2019 Martin Stransky <stransky@redhat.com> - 68.2.0-4
+- Added patch for TLS 1.3 support.
+
+* Wed Oct 23 2019 Martin Stransky <stransky@redhat.com> - 68.2.0-3
+- Rebuild
+
+* Mon Oct 21 2019 Martin Stransky <stransky@redhat.com> - 68.2.0-2
+- Rebuild
+
+* Thu Oct 17 2019 Martin Stransky <stransky@redhat.com> - 68.2.0-1
+- Update to 68.2.0 ESR
+
+* Thu Oct 10 2019 Martin Stransky <stransky@redhat.com> - 68.1.0-6
+- Enable system nss on RHEL6
+
+* Thu Sep 5 2019 Jan Horak <jhorak@redhat.com> - 68.1.0-2
+- Enable building langpacks
+
+* Wed Aug 28 2019 Jan Horak <jhorak@redhat.com> - 68.1.0-1
+- Update to 68.1.0 ESR
+
+* Mon Aug 5 2019 Martin Stransky <stransky@redhat.com> - 68.0.1-4
+- Enable system nss
+
+* Mon Jul 29 2019 Martin Stransky <stransky@redhat.com> - 68.0.1-3
+- Enable official branding
+
+* Fri Jul 26 2019 Martin Stransky <stransky@redhat.com> - 68.0.1-2
+- Enabled PipeWire on RHEL8
+
+* Fri Jul 26 2019 Martin Stransky <stransky@redhat.com> - 68.0.1-1
+- Updated to 68.0.1 ESR
+
+* Tue Jul 16 2019 Jan Horak <jhorak@redhat.com> - 68.0-0.11
+- Update to 68.0 ESR
+
+* Tue Jun 25 2019 Martin Stransky <stransky@redhat.com> - 68.0-0.10
+- Updated to 68.0 alpha 13
+- Enabled second arches
+
+* Fri Mar 22 2019 Martin Stransky <stransky@redhat.com> - 68.0-0.1
+- Updated to 68.0 alpha
+
+* Fri Mar 15 2019 Martin Stransky <stransky@redhat.com> - 60.6.0-3
+- Added Google API keys (mozbz#1531176)
+
+* Thu Mar 14 2019 Martin Stransky <stransky@redhat.com> - 60.6.0-2
+- Update to 60.6.0 ESR (Build 2)
+
+* Wed Mar 13 2019 Martin Stransky <stransky@redhat.com> - 60.6.0-1
+- Update to 60.6.0 ESR (Build 1)
+
+* Wed Feb 13 2019 Jan Horak <jhorak@redhat.com> - 60.5.1-1
+- Update to 60.5.1 ESR
+
+* Wed Feb 6 2019 Martin Stransky <stransky@redhat.com> - 60.5.0-3
+- Added fix for rhbz#1672424 - Firefox crashes on NFS drives.
+
+* Fri Jan 25 2019 Martin Stransky <stransky@redhat.com> - 60.5.0-2
+- Updated to 60.5.0 ESR build2
+
+* Tue Jan 22 2019 Martin Stransky <stransky@redhat.com> - 60.5.0-1
+- Updated to 60.5.0 ESR build1
+
+* Thu Jan 10 2019 Jan Horak <jhorak@redhat.com> - 60.4.0-3
+- Fixing fontconfig warnings (rhbz#1601475)
+
+* Wed Jan 9 2019 Jan Horak <jhorak@redhat.com> - 60.4.0-2
+- Added pipewire patch from Tomas Popela (rhbz#1664270)
+
+* Wed Dec 5 2018 Jan Horak <jhorak@redhat.com> - 60.4.0-1
+- Update to 60.4.0 ESR
+
+* Tue Dec 4 2018 Jan Horak <jhorak@redhat.com> - 60.3.0-2
+- Added firefox-gnome-shell-extension
+
+* Fri Oct 19 2018 Jan Horak <jhorak@redhat.com> - 60.3.0-1
+- Update to 60.3.0 ESR
+
+* Wed Oct 10 2018 Jan Horak <jhorak@redhat.com> - 60.2.2-2
+- Added patch for rhbz#1633932
+
+* Tue Oct 2 2018 Jan Horak <jhorak@redhat.com> - 60.2.2-1
+- Update to 60.2.2 ESR
+
+* Mon Sep 24 2018 Jan Horak <jhorak@redhat.com> - 60.2.1-1
+- Update to 60.2.1 ESR
+
+* Fri Aug 31 2018 Jan Horak <jhorak@redhat.com> - 60.2.0-1
+- Update to 60.2.0 ESR
+
+* Tue Aug 28 2018 Jan Horak <jhorak@redhat.com> - 60.1.0-9
+- Do not set user agent (rhbz#1608065)
+- GTK dialogs are localized now (rhbz#1619373)
+- JNLP association works again (rhbz#1607457)
+
+* Thu Aug 16 2018 Jan Horak <jhorak@redhat.com> - 60.1.0-8
+- Fixed homepage and bookmarks (rhbz#1606778)
+- Fixed missing file associations in RHEL6 (rhbz#1613565)
+
+* Thu Jul 12 2018 Jan Horak <jhorak@redhat.com> - 60.1.0-7
+- Run at-spi-bus if not running already (for the bundled gtk3)
+
+* Mon Jul 9 2018 Jan Horak <jhorak@redhat.com> - 60.1.0-6
+- Fix for missing schemes for bundled gtk3
+
+* Mon Jun 25 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-5
+- Added mesa-libEGL dependency to gtk3/rhel6
+
+* Sun Jun 24 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-4
+- Disabled jemalloc on all second arches
+
+* Fri Jun 22 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-3
+- Updated to 60.1.0 ESR build2
+
+* Thu Jun 21 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-2
+- Disabled jemalloc on second arches
+
+* Wed Jun 20 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-1
+- Updated to 60.1.0 ESR
+
+* Wed Jun 13 2018 Jan Horak <jhorak@redhat.com> - 60.0-12
+- Fixing bundled libffi issues
+- Readded some requirements
+
+* Mon Jun 11 2018 Martin Stransky <stransky@redhat.com> - 60.0-10
+- Added fix for mozilla BZ#1436242 - IPC crashes.
+
+* Mon Jun 11 2018 Jan Horak <jhorak@redhat.com> - 60.0-9
+- Bundling libffi for the sec-arches
+- Added openssl-devel for the Python
+- Fixing bundled gtk3
+
+* Fri May 18 2018 Martin Stransky <stransky@redhat.com> - 60.0-8
+- Added fix for mozilla BZ#1458492
+
+* Wed May 16 2018 Martin Stransky <stransky@redhat.com> - 60.0-7
+- Added patch from rhbz#1498561 to fix ppc64(le) crashes.
+
+* Wed May 16 2018 Martin Stransky <stransky@redhat.com> - 60.0-6
+- Disabled jemalloc on second arches
+
+* Sun May 6 2018 Jan Horak <jhorak@redhat.com> - 60.0-4
+- Update to 60.0 ESR
+
+* Thu Mar 8 2018 Jan Horak <jhorak@redhat.com> - 52.7.0-1
+- Update to 52.7.0 ESR
+
+* Mon Jan 29 2018 Martin Stransky <stransky@redhat.com> - 52.6.0-2
+- Build Firefox for desktop arches only (x86_64 and ppc64le)
+
+* Thu Jan 18 2018 Martin Stransky <stransky@redhat.com> - 52.6.0-1
+- Update to 52.6.0 ESR
+
+* Thu Nov 9 2017 Jan Horak <jhorak@redhat.com> - 52.5.0-1
+- Update to 52.5.0 ESR
+
+* Mon Sep 25 2017 Jan Horak <jhorak@redhat.com> - 52.4.0-1
+- Update to 52.4.0 ESR
+
+* Thu Aug 3 2017 Jan Horak <jhorak@redhat.com> - 52.3.0-3
+- Update to 52.3.0 ESR (b2)
+- Require correct nss version
+
+* Tue Jun 13 2017 Jan Horak <jhorak@redhat.com> - 52.2.0-1
+- Update to 52.2.0 ESR
+
+* Wed May 24 2017 Jan Horak <jhorak@redhat.com> - 52.1.2-1
+- Update to 52.1.2 ESR
+
+* Wed May 24 2017 Jan Horak <jhorak@redhat.com> - 52.0-7
+- Added fix for accept language (rhbz#1454322)
+
+* Wed Mar 22 2017 Jan Horak <jhorak@redhat.com> - 52.0-6
+- Removing patch required for older NSS from RHEL 7.3
+- Added patch for rhbz#1414564
+
+* Fri Mar 17 2017 Martin Stransky <stransky@redhat.com> - 52.0-5
+- Added fix for mozbz#1348168/CVE-2017-5428
+
+* Mon Mar 6 2017 Jan Horak <jhorak@redhat.com> - 52.0-4
+- Update to 52.0 ESR (b4)
+
+* Thu Mar 2 2017 Martin Stransky <stransky@redhat.com> - 52.0-3
+- Added fix for rhbz#1423012 - ppc64 gfx crashes
+
+* Wed Mar 1 2017 Jan Horak <jhorak@redhat.com> - 52.0-2
+- Enable system nss
+
+* Tue Feb 28 2017 Martin Stransky <stransky@redhat.com> - 52.0-1
+- Update to 52.0ESR (B1)
+- Build RHEL7 package for Gtk3
+
+* Mon Feb 27 2017 Martin Stransky <stransky@redhat.com> - 52.0-0.13
+- Added fix for rhbz#1414535
+
+* Tue Feb 21 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.12
+- Update to 52.0b8
+
+* Tue Feb 7 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.11
+- Readded addons patch
+
+* Mon Feb 6 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.10
+- Update to 52.0b3
+
+* Tue Jan 31 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.9
+- Update to 52.0b2
+
+* Fri Jan 27 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.8
+- Update to 52.0b1
+
+* Thu Dec 8 2016 Jan Horak <jhorak@redhat.com> - 52.0-0.5
+- Firefox Aurora 52 testing build
+
diff --git a/google-api-key b/google-api-key
new file mode 100644
index 0000000..b95d189
--- /dev/null
+++ b/google-api-key
@@ -0,0 +1 @@
+AIzaSyBPGXa4AYD4FC3HJK7LnIKxm4fDusVuuco
diff --git a/google-loc-api-key b/google-loc-api-key
new file mode 100644
index 0000000..f40090d
--- /dev/null
+++ b/google-loc-api-key
@@ -0,0 +1 @@
+AIzaSyB2h2OuRcUgy5N-5hsZqiPW6sH3n_rptiQ
diff --git a/mozilla-api-key b/mozilla-api-key
new file mode 100644
index 0000000..81877bc
--- /dev/null
+++ b/mozilla-api-key
@@ -0,0 +1 @@
+9008bb7e-1e22-4038-94fe-047dd48ccc0b
diff --git a/mozilla-bmo1170092.patch b/mozilla-bmo1170092.patch
new file mode 100644
index 0000000..36d2b00
--- /dev/null
+++ b/mozilla-bmo1170092.patch
@@ -0,0 +1,95 @@
+diff -up firefox-115.0.2/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 firefox-115.0.2/extensions/pref/autoconfig/src/nsReadConfig.cpp
+--- firefox-115.0.2/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 2023-07-10 21:08:53.000000000 +0200
++++ firefox-115.0.2/extensions/pref/autoconfig/src/nsReadConfig.cpp 2023-07-17 10:33:23.443355156 +0200
+@@ -263,8 +263,20 @@ nsresult nsReadConfig::openAndEvaluateJS
+ if (NS_FAILED(rv)) return rv;
+
+ rv = NS_NewLocalFileInputStream(getter_AddRefs(inStr), jsFile);
+- if (NS_FAILED(rv)) return rv;
++ if (NS_FAILED(rv)) {
++ // Look for cfg file in /etc/<application>/pref
++ rv = NS_GetSpecialDirectory(NS_APP_PREFS_SYSTEM_CONFIG_DIR,
++ getter_AddRefs(jsFile));
++ NS_ENSURE_SUCCESS(rv, rv);
++
++ rv = jsFile->AppendNative(nsLiteralCString("pref"));
++ NS_ENSURE_SUCCESS(rv, rv);
++ rv = jsFile->AppendNative(nsDependentCString(aFileName));
++ NS_ENSURE_SUCCESS(rv, rv);
+
++ rv = NS_NewLocalFileInputStream(getter_AddRefs(inStr), jsFile);
++ NS_ENSURE_SUCCESS(rv, rv);
++ }
+ } else {
+ nsAutoCString location("resource://gre/defaults/autoconfig/");
+ location += aFileName;
+diff -up firefox-115.0.2/modules/libpref/Preferences.cpp.1170092 firefox-115.0.2/modules/libpref/Preferences.cpp
+--- firefox-115.0.2/modules/libpref/Preferences.cpp.1170092 2023-07-10 21:09:00.000000000 +0200
++++ firefox-115.0.2/modules/libpref/Preferences.cpp 2023-07-17 10:33:23.444355156 +0200
+@@ -4825,6 +4825,9 @@ nsresult Preferences::InitInitialObjects
+ //
+ // Thus, in the omni.jar case, we always load app-specific default
+ // preferences from omni.jar, whether or not `$app == $gre`.
++ //
++ // At very end load configuration from system config location:
++ // - /etc/firefox/pref/*.js
+
+ nsresult rv = NS_ERROR_FAILURE;
+ UniquePtr<nsZipFind> find;
+diff -up firefox-115.0.2/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-115.0.2/toolkit/xre/nsXREDirProvider.cpp
+--- firefox-115.0.2/toolkit/xre/nsXREDirProvider.cpp.1170092 2023-07-10 22:57:20.000000000 +0200
++++ firefox-115.0.2/toolkit/xre/nsXREDirProvider.cpp 2023-07-17 10:56:25.309692121 +0200
+@@ -72,6 +72,7 @@
+ #endif
+ #ifdef XP_UNIX
+ # include <ctype.h>
++# include "nsIXULAppInfo.h"
+ #endif
+ #ifdef XP_IOS
+ # include "UIKitDirProvider.h"
+@@ -478,6 +479,17 @@ nsXREDirProvider::GetFile(const char* aP
+ rv = file->AppendNative(nsLiteralCString(PREF_OVERRIDE_DIRNAME));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = EnsureDirectoryExists(file);
++ } else if (!strcmp(aProperty, NS_APP_PREFS_SYSTEM_CONFIG_DIR)) {
++ nsCString sysConfigDir = nsLiteralCString("/etc/");
++ nsCOMPtr<nsIXULAppInfo> appInfo = do_GetService("@mozilla.org/xre/app-info;1");
++ if (!appInfo)
++ return NS_ERROR_NOT_AVAILABLE;
++ nsCString appName;
++ appInfo->GetName(appName);
++ ToLowerCase(appName);
++ sysConfigDir.Append(appName);
++ NS_NewNativeLocalFile(sysConfigDir, false, getter_AddRefs(file));
++ rv = EnsureDirectoryExists(file);
+ } else {
+ // We don't know anything about this property. Fail without warning, because
+ // otherwise we'll get too much warning spam due to
+@@ -694,6 +706,16 @@ nsXREDirProvider::GetFiles(const char* a
+ }
+ #endif
+
++ // Add /etc/<application>/pref/ directory if it exists
++ nsCOMPtr<nsIFile> systemPrefDir;
++ rv = NS_GetSpecialDirectory(NS_APP_PREFS_SYSTEM_CONFIG_DIR,
++ getter_AddRefs(systemPrefDir));
++ if (NS_SUCCEEDED(rv)) {
++ rv = systemPrefDir->AppendNative(nsLiteralCString("pref"));
++ if (NS_SUCCEEDED(rv))
++ directories.AppendObject(systemPrefDir);
++ }
++
+ rv = NS_NewArrayEnumerator(aResult, directories, NS_GET_IID(nsIFile));
+ } else if (!strcmp(aProperty, NS_APP_CHROME_DIR_LIST)) {
+ // NS_APP_CHROME_DIR_LIST is only used to get default (native) icons
+diff -up firefox-115.0.2/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 firefox-115.0.2/xpcom/io/nsAppDirectoryServiceDefs.h
+--- firefox-115.0.2/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 2023-07-10 21:09:13.000000000 +0200
++++ firefox-115.0.2/xpcom/io/nsAppDirectoryServiceDefs.h 2023-07-17 10:33:23.444355156 +0200
+@@ -58,6 +58,7 @@
+ #define NS_APP_PREFS_DEFAULTS_DIR_LIST "PrefDL"
+ #define NS_APP_PREFS_OVERRIDE_DIR \
+ "PrefDOverride" // Directory for per-profile defaults
++#define NS_APP_PREFS_SYSTEM_CONFIG_DIR "PrefSysConf" // Directory with system-wide configuration
+
+ #define NS_APP_USER_PROFILE_50_DIR "ProfD"
+ #define NS_APP_USER_PROFILE_LOCAL_50_DIR "ProfLD"
diff --git a/mozilla-bmo1504834-part1.patch b/mozilla-bmo1504834-part1.patch
new file mode 100644
index 0000000..5246c5a
--- /dev/null
+++ b/mozilla-bmo1504834-part1.patch
@@ -0,0 +1,86 @@
+diff -up firefox-115.2.0/gfx/2d/DrawTargetSkia.cpp.mozilla-bmo1504834-part1 firefox-115.2.0/gfx/2d/DrawTargetSkia.cpp
+--- firefox-115.2.0/gfx/2d/DrawTargetSkia.cpp.mozilla-bmo1504834-part1 2023-09-20 22:15:11.850172571 +0200
++++ firefox-115.2.0/gfx/2d/DrawTargetSkia.cpp 2023-09-20 22:16:10.446147737 +0200
+@@ -156,8 +156,8 @@ static IntRect CalculateSurfaceBounds(co
+ }
+
+ static const int kARGBAlphaOffset =
+- SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0;
+-
++ 0; // Skia is always BGRA SurfaceFormat::A8R8G8B8_UINT32 ==
++ // SurfaceFormat::B8G8R8A8 ? 3 : 0;
+ static bool VerifyRGBXFormat(uint8_t* aData, const IntSize& aSize,
+ const int32_t aStride, SurfaceFormat aFormat) {
+ if (aFormat != SurfaceFormat::B8G8R8X8 || aSize.IsEmpty()) {
+diff -up firefox-115.2.0/gfx/2d/Types.h.mozilla-bmo1504834-part1 firefox-115.2.0/gfx/2d/Types.h
+--- firefox-115.2.0/gfx/2d/Types.h.mozilla-bmo1504834-part1 2023-08-21 15:43:23.000000000 +0200
++++ firefox-115.2.0/gfx/2d/Types.h 2023-09-20 22:15:11.850172571 +0200
+@@ -89,18 +89,11 @@ enum class SurfaceFormat : int8_t {
+ // This represents the unknown format.
+ UNKNOWN, // TODO: Replace uses with Maybe<SurfaceFormat>.
+
+-// The following values are endian-independent synonyms. The _UINT32 suffix
+-// indicates that the name reflects the layout when viewed as a uint32_t
+-// value.
+-#if MOZ_LITTLE_ENDIAN()
++ // The following values are endian-independent synonyms. The _UINT32 suffix
++ // indicates that the name reflects the layout when viewed as a uint32_t
++ // value.
+ A8R8G8B8_UINT32 = B8G8R8A8, // 0xAARRGGBB
+ X8R8G8B8_UINT32 = B8G8R8X8, // 0x00RRGGBB
+-#elif MOZ_BIG_ENDIAN()
+- A8R8G8B8_UINT32 = A8R8G8B8, // 0xAARRGGBB
+- X8R8G8B8_UINT32 = X8R8G8B8, // 0x00RRGGBB
+-#else
+-# error "bad endianness"
+-#endif
+
+ // The following values are OS and endian-independent synonyms.
+ //
+diff -up firefox-115.2.0/gfx/skia/skia/modules/skcms/skcms.cc.mozilla-bmo1504834-part1 firefox-115.2.0/gfx/skia/skia/modules/skcms/skcms.cc
+--- firefox-115.2.0/gfx/skia/skia/modules/skcms/skcms.cc.mozilla-bmo1504834-part1 2023-08-21 15:43:23.000000000 +0200
++++ firefox-115.2.0/gfx/skia/skia/modules/skcms/skcms.cc 2023-09-20 22:15:11.851172570 +0200
+@@ -30,6 +30,8 @@
+ #include <avx512fintrin.h>
+ #include <avx512dqintrin.h>
+ #endif
++#else
++ #define SKCMS_PORTABLE
+ #endif
+
+ static bool runtime_cpu_detection = true;
+@@ -324,20 +326,28 @@ enum {
+ static uint16_t read_big_u16(const uint8_t* ptr) {
+ uint16_t be;
+ memcpy(&be, ptr, sizeof(be));
+-#if defined(_MSC_VER)
+- return _byteswap_ushort(be);
++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
++ return be;
+ #else
+- return __builtin_bswap16(be);
++ #if defined(_MSC_VER)
++ return _byteswap_ushort(be);
++ #else
++ return __builtin_bswap16(be);
++ #endif
+ #endif
+ }
+
+ static uint32_t read_big_u32(const uint8_t* ptr) {
+ uint32_t be;
+ memcpy(&be, ptr, sizeof(be));
+-#if defined(_MSC_VER)
+- return _byteswap_ulong(be);
++#if __BYTE_ORDER == __ORDER_BIG_ENDIAN__
++ return be;
+ #else
+- return __builtin_bswap32(be);
++ #if defined(_MSC_VER)
++ return _byteswap_ulong(be);
++ #else
++ return __builtin_bswap32(be);
++ #endif
+ #endif
+ }
+
diff --git a/mozilla-bmo1504834-part3.patch b/mozilla-bmo1504834-part3.patch
new file mode 100644
index 0000000..9c2ece0
--- /dev/null
+++ b/mozilla-bmo1504834-part3.patch
@@ -0,0 +1,17 @@
+# HG changeset patch
+# Parent 09cd4ac2cc607e85aa572425b824fbab386af607
+For FF68, AntiAliasing of XULTexts seem to be broken on big endian (s390x). Text and icons of the sandwich-menu to the
+right of the address bar, as well as plugin-windows appears transparant, which usually means unreadable (white on white).
+
+diff --git a/gfx/skia/skia/src/opts/SkBlitMask_opts.h b/gfx/skia/skia/src/opts/SkBlitMask_opts.h
+--- a/gfx/skia/skia/src/opts/SkBlitMask_opts.h
++++ b/gfx/skia/skia/src/opts/SkBlitMask_opts.h
+@@ -210,6 +210,8 @@ namespace SK_OPTS_NS {
+ // ~~~>
+ // a = 1*aa + d(1-1*aa) = aa + d(1-aa)
+ // c = 0*aa + d(1-1*aa) = d(1-aa)
++ // TODO: Check this for endian-issues!
++ // Do we need to switch 255 to the front for all of those tuples?
+ return (aa & Sk4px(skvx::byte16{0,0,0,255, 0,0,0,255, 0,0,0,255, 0,0,0,255}))
+ + d.approxMulDiv255(aa.inv());
+ };
diff --git a/mozilla-bmo1636168-fscreen.patch b/mozilla-bmo1636168-fscreen.patch
new file mode 100644
index 0000000..e8bb310
--- /dev/null
+++ b/mozilla-bmo1636168-fscreen.patch
@@ -0,0 +1,82 @@
+diff -up firefox-114.0/widget/gtk/nsWindow.cpp.D110204-fscreen.diff firefox-114.0/widget/gtk/nsWindow.cpp
+--- firefox-114.0/widget/gtk/nsWindow.cpp.D110204-fscreen.diff 2023-05-17 10:43:02.000000000 +0200
++++ firefox-114.0/widget/gtk/nsWindow.cpp 2023-05-17 13:53:54.000443278 +0200
+@@ -100,6 +100,7 @@
+ #include "ScreenHelperGTK.h"
+ #include "SystemTimeConverter.h"
+ #include "WidgetUtilsGtk.h"
++#include "nsIBrowserHandler.h"
+
+ #ifdef ACCESSIBILITY
+ # include "mozilla/a11y/LocalAccessible.h"
+@@ -173,7 +174,8 @@ const gint kEvents = GDK_TOUCHPAD_GESTUR
+ GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+ GDK_SMOOTH_SCROLL_MASK | GDK_TOUCH_MASK | GDK_SCROLL_MASK |
+- GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK;
++ GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK |
++ GDK_FOCUS_CHANGE_MASK;
+
+ /* utility functions */
+ static bool is_mouse_in_window(GdkWindow* aWindow, gdouble aMouseX,
+@@ -433,7 +435,8 @@ nsWindow::nsWindow()
+ mResizedAfterMoveToRect(false),
+ mConfiguredClearColor(false),
+ mGotNonBlankPaint(false),
+- mNeedsToRetryCapturingMouse(false) {
++ mNeedsToRetryCapturingMouse(false),
++ mPendingFullscreen(false) {
+ mWindowType = WindowType::Child;
+ mSizeConstraints.mMaxSize = GetSafeWindowSize(mSizeConstraints.mMaxSize);
+
+@@ -5263,6 +5266,19 @@ void nsWindow::OnWindowStateEvent(GtkWid
+ ClearTransparencyBitmap();
+ }
+ }
++
++ // Hack to ensure window switched to fullscreen - avoid to fail when starting
++ // in kiosk mode
++ if (mPendingFullscreen &&
++ !(aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
++ LOG(
++ " Window should be fullscreen, but it's not, retrying set to "
++ "fullscreen.\n");
++ MakeFullScreen(true);
++ } else {
++ LOG(" Window successfully switched to fullscreen, happy now\n");
++ mPendingFullscreen = false;
++ }
+ }
+
+ void nsWindow::OnDPIChanged() {
+@@ -7409,6 +7425,19 @@ nsresult nsWindow::MakeFullScreen(bool a
+ }
+ }
+
++ // if in kiosk, ensure the fullscreen is called
++ nsCOMPtr<nsIBrowserHandler> browserHandler =
++ do_GetService("@mozilla.org/browser/clh;1");
++ if (browserHandler) {
++ bool isKiosk;
++ browserHandler->GetKiosk(&isKiosk);
++ if (isKiosk) {
++ LOG(" is kiosk, ensure the window switch to fullscreen\n");
++ mPendingFullscreen = true;
++ }
++ } else {
++ LOG(" Cannot find the browserHandler service.\n");
++ }
+ gtk_window_fullscreen(GTK_WINDOW(mShell));
+ } else {
+ gtk_window_unfullscreen(GTK_WINDOW(mShell));
+diff -up firefox-114.0/widget/gtk/nsWindow.h.D110204-fscreen.diff firefox-114.0/widget/gtk/nsWindow.h
+--- firefox-114.0/widget/gtk/nsWindow.h.D110204-fscreen.diff 2023-05-17 08:46:16.000000000 +0200
++++ firefox-114.0/widget/gtk/nsWindow.h 2023-05-17 13:51:29.502159247 +0200
+@@ -752,6 +752,7 @@ class nsWindow final : public nsBaseWidg
+ * move-to-rect callback we set mMovedAfterMoveToRect/mResizedAfterMoveToRect.
+ */
+ bool mWaitingForMoveToRectCallback : 1;
++ bool mPendingFullscreen : 1;
+ bool mMovedAfterMoveToRect : 1;
+ bool mResizedAfterMoveToRect : 1;
+
diff --git a/mozilla-bmo1670333.patch b/mozilla-bmo1670333.patch
new file mode 100644
index 0000000..7126d43
--- /dev/null
+++ b/mozilla-bmo1670333.patch
@@ -0,0 +1,69 @@
+diff -up firefox-115.0/dom/media/mp4/MP4Demuxer.cpp.1670333 firefox-115.0/dom/media/mp4/MP4Demuxer.cpp
+--- firefox-115.0/dom/media/mp4/MP4Demuxer.cpp.1670333 2023-06-06 23:14:43.000000000 +0200
++++ firefox-115.0/dom/media/mp4/MP4Demuxer.cpp 2023-06-08 08:15:48.214109403 +0200
+@@ -32,6 +32,8 @@ mozilla::LogModule* GetDemuxerLog() { re
+ DDMOZ_LOG(gMediaDemuxerLog, mozilla::LogLevel::Debug, "::%s: " arg, \
+ __func__, ##__VA_ARGS__)
+
++extern bool gUseKeyframeFromContainer;
++
+ namespace mozilla {
+
+ using TimeUnit = media::TimeUnit;
+@@ -404,6 +406,12 @@ already_AddRefed<MediaRawData> MP4TrackD
+ [[fallthrough]];
+ case H264::FrameType::OTHER: {
+ bool keyframe = type == H264::FrameType::I_FRAME;
++ if (gUseKeyframeFromContainer) {
++ if (sample->mKeyframe && sample->mKeyframe != keyframe) {
++ sample->mKeyframe = keyframe;
++ }
++ break;
++ }
+ if (sample->mKeyframe != keyframe) {
+ NS_WARNING(nsPrintfCString("Frame incorrectly marked as %skeyframe "
+ "@ pts:%" PRId64 " dur:%" PRId64
+diff -up firefox-115.0/dom/media/platforms/PDMFactory.cpp.1670333 firefox-115.0/dom/media/platforms/PDMFactory.cpp
+--- firefox-115.0/dom/media/platforms/PDMFactory.cpp.1670333 2023-06-06 23:14:44.000000000 +0200
++++ firefox-115.0/dom/media/platforms/PDMFactory.cpp 2023-06-08 08:09:33.145289602 +0200
+@@ -67,6 +67,8 @@
+
+ #include <functional>
+
++bool gUseKeyframeFromContainer = false;
++
+ using DecodeSupport = mozilla::media::DecodeSupport;
+ using DecodeSupportSet = mozilla::media::DecodeSupportSet;
+ using MediaCodec = mozilla::media::MediaCodec;
+@@ -562,7 +564,7 @@ void PDMFactory::CreateRddPDMs() {
+ #ifdef MOZ_FFMPEG
+ if (StaticPrefs::media_ffmpeg_enabled() &&
+ StaticPrefs::media_rdd_ffmpeg_enabled() &&
+- !CreateAndStartupPDM<FFmpegRuntimeLinker>()) {
++ !(mFFmpegUsed = CreateAndStartupPDM<FFmpegRuntimeLinker>())) {
+ mFailureFlags += GetFailureFlagBasedOnFFmpegStatus(
+ FFmpegRuntimeLinker::LinkStatusCode());
+ }
+@@ -738,9 +740,10 @@ void PDMFactory::CreateDefaultPDMs() {
+
+ CreateAndStartupPDM<AgnosticDecoderModule>();
+
+- if (StaticPrefs::media_gmp_decoder_enabled() &&
++ if (StaticPrefs::media_gmp_decoder_enabled() && !mFFmpegUsed &&
+ !StartupPDM(GMPDecoderModule::Create(),
+ StaticPrefs::media_gmp_decoder_preferred())) {
++ gUseKeyframeFromContainer = true;
+ mFailureFlags += DecoderDoctorDiagnostics::Flags::GMPPDMFailedToStartup;
+ }
+ }
+diff -up firefox-115.0/dom/media/platforms/PDMFactory.h.1670333 firefox-115.0/dom/media/platforms/PDMFactory.h
+--- firefox-115.0/dom/media/platforms/PDMFactory.h.1670333 2023-06-06 23:14:42.000000000 +0200
++++ firefox-115.0/dom/media/platforms/PDMFactory.h 2023-06-08 08:09:33.145289602 +0200
+@@ -103,6 +103,7 @@ class PDMFactory final {
+ RefPtr<PlatformDecoderModule> mNullPDM;
+
+ DecoderDoctorDiagnostics::FlagsSet mFailureFlags;
++ bool mFFmpegUsed = false;
+
+ friend class RemoteVideoDecoderParent;
+ static void EnsureInit();
diff --git a/mozilla-bmo1716707-svg.patch b/mozilla-bmo1716707-svg.patch
new file mode 100644
index 0000000..9c0559c
--- /dev/null
+++ b/mozilla-bmo1716707-svg.patch
@@ -0,0 +1,29 @@
+# HG changeset patch
+# User M. Sirringhaus <msirringhaus@suse.de>
+# Date 1645518286 -3600
+# Tue Feb 22 09:24:46 2022 +0100
+# Node ID 81832d035e101471dcf52dd91de287268add7a91
+# Parent 66f7ce16eb4965108687280e5443edd610631efb
+imported patch svg-rendering.patch
+
+diff --git a/image/imgFrame.cpp b/image/imgFrame.cpp
+--- a/image/imgFrame.cpp
++++ b/image/imgFrame.cpp
+@@ -372,6 +372,17 @@ nsresult imgFrame::InitWithDrawable(gfxD
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+
++#if MOZ_BIG_ENDIAN()
++ if (aBackend == gfx::BackendType::SKIA && canUseDataSurface) {
++ // SKIA is lying about what format it returns on big endian
++ for (int ii=0; ii < mRawSurface->GetSize().Height()*mRawSurface->Stride() / 4; ++ii) {
++ uint32_t *vals = (uint32_t*)(mRawSurface->GetData());
++ uint32_t val = ((vals[ii] << 8) & 0xFF00FF00 ) | ((vals[ii] >> 8) & 0xFF00FF );
++ vals[ii] = (val << 16) | (val >> 16);
++ }
++ }
++#endif
++
+ if (!canUseDataSurface) {
+ // We used an offscreen surface, which is an "optimized" surface from
+ // imgFrame's perspective.
diff --git a/mozilla-bmo1716707-swizzle.patch b/mozilla-bmo1716707-swizzle.patch
new file mode 100644
index 0000000..bb37560
--- /dev/null
+++ b/mozilla-bmo1716707-swizzle.patch
@@ -0,0 +1,34 @@
+# HG changeset patch
+# User M. Sirringhaus <msirringhaus@suse.de>
+# Date 1645518286 -3600
+# Tue Feb 22 09:24:46 2022 +0100
+# Node ID 494640792b4677f6462e95b90a54a4e22aeb738b
+# Parent 81832d035e101471dcf52dd91de287268add7a91
+imported patch one_swizzle_to_rule_them_all.patch
+
+Index: firefox-102.0/gfx/webrender_bindings/RenderCompositorSWGL.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/webrender_bindings/RenderCompositorSWGL.cpp
++++ firefox-102.0/gfx/webrender_bindings/RenderCompositorSWGL.cpp
+@@ -7,6 +7,7 @@
+ #include "RenderCompositorSWGL.h"
+
+ #include "mozilla/gfx/Logging.h"
++#include "mozilla/gfx/Swizzle.h"
+ #include "mozilla/widget/CompositorWidget.h"
+
+ #ifdef MOZ_WIDGET_GTK
+@@ -235,6 +237,13 @@ void RenderCompositorSWGL::CommitMappedB
+ }
+ mDT->Flush();
+
++#if MOZ_BIG_ENDIAN()
++ // One swizzle to rule them all.
++ gfx::SwizzleData(mMappedData, mMappedStride, gfx::SurfaceFormat::B8G8R8A8,
++ mMappedData, mMappedStride, gfx::SurfaceFormat::A8R8G8B8,
++ mDT->GetSize());
++#endif
++
+ // Done with the DT. Hand it back to the widget and clear out any trace of it.
+ mWidget->EndRemoteDrawingInRegion(mDT, mDirtyRegion);
+ mDirtyRegion.SetEmpty();
diff --git a/mozilla-bmo1789216-disable-av1.patch b/mozilla-bmo1789216-disable-av1.patch
new file mode 100644
index 0000000..ce91a12
--- /dev/null
+++ b/mozilla-bmo1789216-disable-av1.patch
@@ -0,0 +1,89 @@
+diff --git a/media/ffvpx/libavcodec/allcodecs.c b/media/ffvpx/libavcodec/allcodecs.c
+--- a/media/ffvpx/libavcodec/allcodecs.c
++++ b/media/ffvpx/libavcodec/allcodecs.c
+@@ -755,12 +755,15 @@
+ extern FFCodec ff_libaom_av1_encoder;
+ extern const FFCodec ff_libaribb24_decoder;
+ extern const FFCodec ff_libcelt_decoder;
+ extern const FFCodec ff_libcodec2_encoder;
+ extern const FFCodec ff_libcodec2_decoder;
++#if CONFIG_MOZ_AV1
+ extern const FFCodec ff_libdav1d_decoder;
+ extern const FFCodec ff_libdavs2_decoder;
++extern const FFCodec ff_libuavs3d_decoder;
++#endif
+ extern const FFCodec ff_libfdk_aac_encoder;
+ extern const FFCodec ff_libfdk_aac_decoder;
+ extern const FFCodec ff_libgsm_encoder;
+ extern const FFCodec ff_libgsm_decoder;
+ extern const FFCodec ff_libgsm_ms_encoder;
+@@ -783,11 +786,10 @@
+ extern const FFCodec ff_libspeex_encoder;
+ extern const FFCodec ff_libspeex_decoder;
+ extern const FFCodec ff_libsvtav1_encoder;
+ extern const FFCodec ff_libtheora_encoder;
+ extern const FFCodec ff_libtwolame_encoder;
+-extern const FFCodec ff_libuavs3d_decoder;
+ extern const FFCodec ff_libvo_amrwbenc_encoder;
+ extern const FFCodec ff_libvorbis_encoder;
+ extern const FFCodec ff_libvorbis_decoder;
+ extern const FFCodec ff_libvpx_vp8_encoder;
+ extern const FFCodec ff_libvpx_vp8_decoder;
+diff --git a/media/ffvpx/libavcodec/codec_list.c b/media/ffvpx/libavcodec/codec_list.c
+--- a/media/ffvpx/libavcodec/codec_list.c
++++ b/media/ffvpx/libavcodec/codec_list.c
+@@ -9,12 +9,14 @@
+ &ff_flac_decoder,
+ #endif
+ #if CONFIG_MP3_DECODER
+ &ff_mp3_decoder,
+ #endif
++#if CONFIG_MOZ_AV1
+ #if CONFIG_LIBDAV1D
+ &ff_libdav1d_decoder,
+ #endif
+ #if CONFIG_AV1_DECODER
+ &ff_av1_decoder,
+ #endif
++#endif
+ NULL };
+diff --git a/media/ffvpx/libavcodec/moz.build b/media/ffvpx/libavcodec/moz.build
+--- a/media/ffvpx/libavcodec/moz.build
++++ b/media/ffvpx/libavcodec/moz.build
+@@ -84,11 +84,10 @@
+ 'cbs.c',
+ 'cbs_av1.c',
+ 'golomb.c',
+ 'h264pred.c',
+ 'imgconvert.c',
+- 'libdav1d.c',
+ 'mathtables.c',
+ 'qsv_api.c',
+ 'raw.c',
+ 'videodsp.c',
+ 'vp8.c',
+@@ -107,14 +106,19 @@
+ 'vp9mvs.c',
+ 'vp9prob.c',
+ 'vp9recon.c',
+ 'vpx_rac.c',
+ ]
+- USE_LIBS += [
+- 'dav1d',
+- 'media_libdav1d_asm',
+- ]
++ if CONFIG['MOZ_AV1']:
++ USE_LIBS += [
++ 'dav1d',
++ 'media_libdav1d_asm',
++ ]
++ SOURCES += [
++ 'libdav1d.c',
++ ]
++
+ if CONFIG['MOZ_WAYLAND']:
+ LOCAL_INCLUDES += ['/media/mozva']
+ SOURCES += [
+ 'vaapi_av1.c',
+ 'vaapi_decode.c',
+
diff --git a/mozilla-bmo849632.patch b/mozilla-bmo849632.patch
new file mode 100644
index 0000000..913d6bc
--- /dev/null
+++ b/mozilla-bmo849632.patch
@@ -0,0 +1,26 @@
+# HG changeset patch
+# Parent 3de59fe1b8708c01e134ce698c4232b8a854f617
+Problem: webGL sites are displayed in the wrong color (usually blue-ish)
+Solution: Problem is with skia once again. Output of webgl seems endian-correct, but skia only
+ knows how to deal with little endian.
+ So we swizzle the output of webgl after reading it from readpixels()
+Note: This does not fix all webGL sites, but is a step in the right direction
+
+Index: firefox-115.0/gfx/gl/GLContext.h
+===================================================================
+--- firefox-115.0.orig/gfx/gl/GLContext.h
++++ firefox-115.0/gfx/gl/GLContext.h
+@@ -1560,6 +1560,13 @@ class GLContext : public GenericAtomicRe
+ BEFORE_GL_CALL;
+ mSymbols.fReadPixels(x, y, width, height, format, type, pixels);
+ OnSyncCall();
++#if MOZ_BIG_ENDIAN()
++ uint8_t* itr = (uint8_t*)pixels;
++ for (GLsizei i = 0; i < width * height; i++) {
++ NativeEndian::swapToLittleEndianInPlace((uint32_t*)itr, 1);
++ itr += 4;
++ }
++#endif
+ AFTER_GL_CALL;
+ mHeavyGLCallsSinceLastFlush = true;
+ }
diff --git a/mozilla-bmo998749.patch b/mozilla-bmo998749.patch
new file mode 100644
index 0000000..50e22b5
--- /dev/null
+++ b/mozilla-bmo998749.patch
@@ -0,0 +1,29 @@
+# HG changeset patch
+# User msirringhaus@suse.de
+# Date 1583738770 -3600
+# Mon Mar 09 08:26:10 2020 +0100
+# Node ID 34676feac1a542e409e22acf5b98735f8313b1ce
+# Parent 506857dace0a08d1c9685e3ac264646590b3e27f
+[mq]: mozilla-bmo998749.patch
+
+diff -r 506857dace0a -r 34676feac1a5 gfx/2d/FilterProcessing.h
+--- a/gfx/2d/FilterProcessing.h Fri Feb 28 12:31:51 2020 +0100
++++ b/gfx/2d/FilterProcessing.h Mon Mar 09 08:26:10 2020 +0100
+@@ -13,10 +13,17 @@
+ namespace mozilla {
+ namespace gfx {
+
++#if MOZ_BIG_ENDIAN()
++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_B = 3;
++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_G = 2;
++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_R = 1;
++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_A = 0;
++#else
+ const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_B = 0;
+ const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_G = 1;
+ const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_R = 2;
+ const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_A = 3;
++#endif
+
+ class FilterProcessing {
+ public:
diff --git a/node-stdout-nonblocking-wrapper b/node-stdout-nonblocking-wrapper
new file mode 100755
index 0000000..7dfb513
--- /dev/null
+++ b/node-stdout-nonblocking-wrapper
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec node "$@" 2>&1 | cat -
diff --git a/nss-setup-flags-env.inc b/nss-setup-flags-env.inc
new file mode 100644
index 0000000..45f6e79
--- /dev/null
+++ b/nss-setup-flags-env.inc
@@ -0,0 +1,7 @@
+sed -i 's@%{bundled_install_path}@%{_buildrootdir}%{bundled_install_path}@g' %{_buildrootdir}%{bundled_install_path}/%{_lib}/pkgconfig/nss*.pc
+
+export LDFLAGS="-L%{_buildrootdir}%{bundled_install_path}/%{_lib} $LDFLAGS"
+export LDFLAGS="-Wl,-rpath,%{bundled_install_path}/%{_lib} $LDFLAGS"
+export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{bundled_install_path}/%{_lib} $LDFLAGS"
+export PKG_CONFIG_PATH=%{_buildrootdir}%{bundled_install_path}/%{_lib}/pkgconfig
+export PATH="{_buildrootdir}%{bundled_install_path}/bin:$PATH"
diff --git a/process-official-tarball b/process-official-tarball
new file mode 100755
index 0000000..449e7bb
--- /dev/null
+++ b/process-official-tarball
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+rm -rf ./process-tarball-dir
+mkdir ./process-tarball-dir
+tar -xJf $1 --directory process-tarball-dir
+
+rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfa/0030-isvalid.html
+rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfa/0008-isvalid.html
+rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfalite/0030-isvalid.html
+rm -vf ./process-tarball-dir/*/testing/web-platform/tests/css/css-ui/support/cursors/woolly-64.svg
+rm -vf ./process-tarball-dir/*/testing/web-platform/tests/css/css-ui/support/cursors/woolly.svg
+rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfa/0230-novalid.html
+rm -vf ./process-tarball-dir/*/testing/web-platform/tests/conformance-checkers/html-rdfa/0231-isvalid.html
+rm -vf ./process-tarball-dir/*/layout/inspector/tests/chrome/test_fontVariationsAPI.css
+
+processed_tarball=${1/source/processed-source}
+
+cd ./process-tarball-dir
+tar -cf - ./* | xz -9 -T 0 -f > $processed_tarball
+mv $processed_tarball ..
+cd ..
+
+rm -rf ./process-tarball-dir
diff --git a/rhbz-1173156.patch b/rhbz-1173156.patch
new file mode 100644
index 0000000..c35d901
--- /dev/null
+++ b/rhbz-1173156.patch
@@ -0,0 +1,12 @@
+diff -up firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp.rhbz-1173156 firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp
+--- firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp.rhbz-1173156 2019-01-22 10:36:09.284069020 +0100
++++ firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp 2019-01-22 10:37:12.669757744 +0100
+@@ -161,7 +161,7 @@ nsresult nsAuthSambaNTLM::SpawnNTLMAuthH
+ const char* username = PR_GetEnv("USER");
+ if (!username) return NS_ERROR_FAILURE;
+
+- const char* const args[] = {"ntlm_auth",
++ const char* const args[] = {"/usr/bin/ntlm_auth",
+ "--helper-protocol",
+ "ntlmssp-client-1",
+ "--use-cached-creds",
diff --git a/rhbz-1354671.patch b/rhbz-1354671.patch
new file mode 100644
index 0000000..b6e8bbd
--- /dev/null
+++ b/rhbz-1354671.patch
@@ -0,0 +1,12 @@
+diff -up firefox-70.0/layout/base/PresShell.h.1354671 firefox-70.0/layout/base/PresShell.h
+--- firefox-70.0/layout/base/PresShell.h.1354671 2019-10-22 12:33:12.987775587 +0200
++++ firefox-70.0/layout/base/PresShell.h 2019-10-22 12:36:39.999366086 +0200
+@@ -257,7 +257,7 @@ class PresShell final : public nsStubDoc
+ * to the same aSize value. AllocateFrame is infallible and will abort
+ * on out-of-memory.
+ */
+- void* AllocateFrame(nsQueryFrame::FrameIID aID, size_t aSize) {
++ void* __attribute__((optimize("no-lifetime-dse"))) AllocateFrame(nsQueryFrame::FrameIID aID, size_t aSize) {
+ #define FRAME_ID(classname, ...) \
+ static_assert(size_t(nsQueryFrame::FrameIID::classname##_id) == \
+ size_t(eArenaObjectID_##classname), \
diff --git a/rhbz-2131158-webrtc-nss-fix.patch b/rhbz-2131158-webrtc-nss-fix.patch
new file mode 100644
index 0000000..78b458d
--- /dev/null
+++ b/rhbz-2131158-webrtc-nss-fix.patch
@@ -0,0 +1,25 @@
+diff -up firefox-102.3.0/third_party/libsrtp/src/crypto/cipher/aes_gcm_nss.c.webrtc-fix firefox-102.3.0/third_party/libsrtp/src/crypto/cipher/aes_gcm_nss.c
+--- firefox-102.3.0/third_party/libsrtp/src/crypto/cipher/aes_gcm_nss.c.webrtc-fix 2022-10-04 18:58:30.563683229 +0200
++++ firefox-102.3.0/third_party/libsrtp/src/crypto/cipher/aes_gcm_nss.c 2022-10-04 18:58:44.583652963 +0200
+@@ -293,7 +293,7 @@ static srtp_err_status_t srtp_aes_gcm_ns
+
+ int rv;
+ SECItem param = { siBuffer, (unsigned char *)&c->params,
+- sizeof(CK_GCM_PARAMS) };
++ sizeof(CK_NSS_GCM_PARAMS) };
+ if (encrypt) {
+ rv = PK11_Encrypt(c->key, CKM_AES_GCM, &param, buf, enc_len,
+ *enc_len + 16, buf, *enc_len);
+diff -up firefox-102.3.0/third_party/libsrtp/src/crypto/include/aes_gcm.h.webrtc-fix firefox-102.3.0/third_party/libsrtp/src/crypto/include/aes_gcm.h
+--- firefox-102.3.0/third_party/libsrtp/src/crypto/include/aes_gcm.h.webrtc-fix 2022-10-04 18:59:16.635583764 +0200
++++ firefox-102.3.0/third_party/libsrtp/src/crypto/include/aes_gcm.h 2022-10-04 18:59:31.848550924 +0200
+@@ -101,7 +101,7 @@ typedef struct {
+ uint8_t iv[12];
+ uint8_t aad[MAX_AD_SIZE];
+ int aad_size;
+- CK_GCM_PARAMS params;
++ CK_NSS_GCM_PARAMS params;
+ uint8_t tag[16];
+ } srtp_aes_gcm_ctx_t;
+
+diff -up firefox-102.3.0/third_party/prio/prio/encrypt.c.webrtc-fix firefox-102.3.0/third_party/prio/prio/encrypt.c
diff --git a/sources b/sources
new file mode 100644
index 0000000..1f60720
--- /dev/null
+++ b/sources
@@ -0,0 +1,7 @@
+9b999bdcf031e29a4d8ce2b6f17e778e cbindgen-vendor.tar.xz
+f8d70e8faa74832cd977276ed62f0da7 firefox-115.9.1esr.processed-source.tar.xz
+9b817573c3243076706ea91ece79cb9c firefox-langpacks-115.9.1esr-20240322.tar.xz
+b3c1d2ea615cb0195f4f62b005773262 mochitest-python.tar.gz
+7b35b9a003996b1f1dbc3cd936a609f2 nspr-4.35.0-1.el8_1.src.rpm
+3fdd30cefe44a98c424cb3aeca73f2b3 nss-3.90.0-3.el8_1.src.rpm
+5c2f6d790957733c5f0d06f8caea3b0d nss-3.90.0-3.el9_0.src.rpm
diff --git a/testing.sh b/testing.sh
new file mode 100755
index 0000000..ef868ec
--- /dev/null
+++ b/testing.sh
@@ -0,0 +1,260 @@
+#!/usr/bin/bash
+
+
+function run_tests_wayland {
+ # usage: run-tests-wayland [test flavour]
+
+ set -x
+
+ RUN_XPCSHELL_TEST=1
+ RUN_REFTEST=1
+ RUN_MOCHITEST=1
+ RUN_CRASHTEST=1
+
+ while (( "$#" )); do
+ SELECTED_TEST=$1
+ if [ "$SELECTED_TEST" = "xpcshell" ] ; then
+ RUN_XPCSHELL_TEST=1
+ elif [ "$SELECTED_TEST" = "reftest" ] ; then
+ RUN_REFTEST=1
+ elif [ "$SELECTED_TEST" = "mochitest" ] ; then
+ RUN_MOCHITEST=1
+ elif [ "$SELECTED_TEST" = "crashtest" ] ; then
+ RUN_CRASHTEST=1
+ fi
+ shift
+ done
+
+ export MACH_USE_SYSTEM_PYTHON=1
+ export MOZ_NODE_PATH=/usr/bin/node
+
+ MOCHITEST_PARAMS="--timeout 1 --chunk-by-dir 4"
+ TEST_DIR="test_results"
+ mkdir $TEST_DIR
+
+ env | grep "DISPLAY"
+
+ # Fix for system nss
+ ln -s /usr/bin/certutil objdir/dist/bin/certutil
+ ln -s /usr/bin/pk12util objdir/dist/bin/pk12util
+
+ NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
+
+ export MOZ_ENABLE_WAYLAND=1
+
+ if [ $RUN_XPCSHELL_TEST -ne 0 ] ; then
+ # ./mach xpcshell-test 2>&1 | cat - | tee $TEST_DIR/xpcshell
+ ./mach xpcshell-test --enable-webrender 2>&1 | cat - | tee $TEST_DIR/xpcshell-wr
+ sleep 60
+ fi
+
+ # Basic render testing
+ export TEST_PARAMS="--setpref reftest.ignoreWindowSize=true --setpref widget.wayland.test-workarounds.enabled=true"
+ #export TEST_FLAVOUR=""
+ #if [ $RUN_REFTEST -ne 0 ] ; then
+ # ./mach reftest --marionette localhost:$(($(($RANDOM))+2000)) $TEST_PARAMS 2>&1 | tee $TEST_DIR/reftest$TEST_FLAVOUR
+ #fi
+ #if [ $RUN_CRASHTEST -ne 0 ] ; then
+ # ./mach crashtest --marionette localhost:$(($(($RANDOM))+2000)) $TEST_PARAMS 2>&1 | tee $TEST_DIR/crashtest$TEST_FLAVOUR
+ #fi
+ #if [ $RUN_MOCHITEST -ne 0 ] ; then
+ # ./mach mochitest --marionette localhost:$(($(($RANDOM))+2000)) $MOCHITEST_PARAMS $TEST_PARAMS 2>&1 | tee $TEST_DIR/mochitest$TEST_FLAVOUR
+ #fi
+
+ # WebRender testing
+ export TEST_PARAMS="--enable-webrender $TEST_PARAMS"
+ export TEST_FLAVOUR="-wr"
+ # Use dom/base/test or dom/base/test/chrome for short version
+ export MOCHITEST_DIR='dom'
+ if [ $RUN_REFTEST -ne 0 ] ; then
+ ./mach reftest $TEST_PARAMS 2>&1 | tee $TEST_DIR/reftest$TEST_FLAVOUR
+ sleep 60
+ fi
+ if [ $RUN_CRASHTEST -ne 0 ] ; then
+ ./mach crashtest $TEST_PARAMS 2>&1 | tee $TEST_DIR/crashtest$TEST_FLAVOUR
+ sleep 60
+ fi
+ if [ $RUN_MOCHITEST -ne 0 ] ; then
+ ./mach mochitest $MOCHITEST_DIR $MOCHITEST_PARAMS $TEST_PARAMS 2>&1 | tee $TEST_DIR/mochitest$TEST_FLAVOUR
+ sleep 60
+ fi
+
+ rm -f objdir/dist/bin/certutil
+ rm -f objdir/dist/bin/pk12util
+}
+
+function run_tests_x11() {
+ set -x
+
+ export MACH_USE_SYSTEM_PYTHON=1
+ export MOZ_NODE_PATH=/usr/bin/node
+ export X_PARAMS="-screen 0 1600x1200x24"
+ export MOCHITEST_PARAMS="--timeout 1 --chunk-by-dir 4"
+ export TEST_DIR="test_results"
+
+ # Fix for system nss
+ ln -s /usr/bin/certutil objdir/dist/bin/certutil
+ ln -s /usr/bin/pk12util objdir/dist/bin/pk12util
+
+ NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
+
+ # Basic render testing
+ export TEST_PARAMS=""
+ export TEST_FLAVOUR=""
+ #xvfb-run -s "$X_PARAMS" -n 91 ./mach xpcshell-test --sequential $TEST_PARAMS 2>&1 | cat - | tee $TEST_DIR/xpcshell
+ #xvfb-run -s "$X_PARAMS" -n 92 ./mach reftest --marionette localhost:$(($(($RANDOM))+2000)) $TEST_PARAMS 2>&1 | tee $TEST_DIR/reftest$TEST_FLAVOUR
+ #xvfb-run -s "$X_PARAMS" -n 93 ./mach crashtest --marionette localhost:$(($(($RANDOM))+2000)) $TEST_PARAMS 2>&1 | tee $TEST_DIR/crashtest$TEST_FLAVOUR
+ #xvfb-run -s "$X_PARAMS" -n 94 ./mach mochitest --marionette localhost:$(($(($RANDOM))+2000)) $MOCHITEST_PARAMS $TEST_PARAMS 2>&1 | tee $TEST_DIR/mochitest$TEST_FLAVOUR
+
+ # WebRender testing
+ export TEST_PARAMS="--enable-webrender $TEST_PARAMS"
+ export TEST_FLAVOUR="-wr"
+ #xvfb-run -s "$X_PARAMS" -n 95 ./mach xpcshell-test --sequential $TEST_PARAMS 2>&1 | cat - | tee $TEST_DIR/xpcshell-wr
+ #sleep 60
+ #xvfb-run -s "$X_PARAMS" -n 96 ./mach reftest $TEST_PARAMS 2>&1 | tee $TEST_DIR/reftest$TEST_FLAVOUR
+ #sleep 60
+ #xvfb-run -s "$X_PARAMS" -n 97 ./mach crashtest $TEST_PARAMS 2>&1 | tee $TEST_DIR/crashtest$TEST_FLAVOUR
+ #sleep 60
+ #export DISPLAY=:0
+ #./mach mochitest dom/base/test/ $MOCHITEST_PARAMS $TEST_PARAMS 2>&1 | tee $TEST_DIR/mochitest$TEST_FLAVOUR
+ export DISPLAY=:98
+ xvfb-run -s "$X_PARAMS" -n 98 ./mach mochitest dom/base/test/ $MOCHITEST_PARAMS $TEST_PARAMS 2>&1 | tee $TEST_DIR/mochitest$TEST_FLAVOUR
+
+ rm -f objdir/dist/bin/certutil
+ rm -f objdir/dist/bin/pk12util
+}
+
+function run_wayland_compositor() {
+ # Run wayland compositor and set WAYLAND_DISPLAY env variable
+ set -x
+
+ echo export DESKTOP_SESSION=gnome > $HOME/.xsessionrc
+ echo export XDG_CURRENT_DESKTOP=GNOME > $HOME/.xsessionrc
+ echo export XDG_SESSION_TYPE=wayland >> $HOME/.xsessionrc
+
+ # Turn off the screen saver and screen locking
+ gsettings set org.gnome.desktop.screensaver idle-activation-enabled false
+ gsettings set org.gnome.desktop.screensaver lock-enabled false
+ gsettings set org.gnome.desktop.screensaver lock-delay 3600
+
+ # Disable the screen saver
+ # This starts the gnome-keyring-daemon with an unlocked login keyring. libsecret uses this to
+ # store secrets. Firefox uses libsecret to store a key that protects sensitive information like
+ # credit card numbers.
+ if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
+ # if not found, launch a new one
+ eval `dbus-launch --sh-syntax`
+ fi
+ eval `echo '' | /usr/bin/gnome-keyring-daemon -r -d --unlock --components=secrets`
+
+ if [ -z "$XDG_RUNTIME_DIR" ]; then
+ export XDG_RUNTIME_DIR=$HOME
+ fi
+
+ . xvfb-run -s "-screen 0 1600x1200x24" -n 80 mutter --display=:80 --wayland --nested &
+ export DISPLAY=:80
+
+ if [ -z "$WAYLAND_DISPLAY" ] ; then
+ export WAYLAND_DISPLAY=wayland-0
+ else
+ export WAYLAND_DISPLAY=wayland-1
+ fi
+ sleep 10
+ retry_count=0
+ max_retries=5
+ until [ $retry_count -gt $max_retries ]; do
+ if [ -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ]; then
+ retry_count=$(($max_retries + 1))
+ else
+ retry_count=$(($retry_count + 1))
+ echo "Waiting for Mutter, retry: $retry_count"
+ sleep 2
+ fi
+ done
+
+ env | grep "DISPLAY"
+}
+
+function print_error_reftest() {
+ # Print reftest failures and compose them to html
+
+ TEST_DIR="$1"
+ TEST_FLAVOUR="$2"
+ OUTPUT_FILE="failures-reftest$TEST_FLAVOUR.html"
+
+ grep --text -e "REFTEST TEST-UNEXPECTED-PASS" -e "REFTEST TEST-UNEXPECTED-FAIL" -e "IMAGE 1 (TEST):" -e "IMAGE 2 (REFERENCE):" $TEST_DIR/reftest$TEST_FLAVOUR 2>&1 > $OUTPUT_FILE
+ sed -i '/REFTEST IMAGE 1/a ">' $OUTPUT_FILE
+ sed -i '/REFTEST IMAGE 2/a "><BR><BR>' $OUTPUT_FILE
+ sed -i '/REFTEST TEST/a <BR>' $OUTPUT_FILE
+ sed -i -e 's/^REFTEST IMAGE 1 (TEST): /<img border=2 src="/' $OUTPUT_FILE
+ sed -i -e 's/^REFTEST IMAGE 2 (REFERENCE): /<img border=2 src="/' $OUTPUT_FILE
+}
+
+function print_errors() {
+ #!/usr/bin/bash
+ # Print failed tests
+
+ TEST_DIR=$1
+ TEST_FLAVOUR=$2
+
+ grep "TEST-UNEXPECTED-FAIL" $TEST_DIR/mochitest$TEST_FLAVOUR 2>&1 > failures-mochitest$TEST_FLAVOUR.txt
+ grep --text -e " FAIL " -e " TIMEOUT " $TEST_DIR/xpcshell$TEST_FLAVOUR 2>&1 > failures-xpcshell$TEST_FLAVOUR.txt
+ grep --text -e "REFTEST TEST-UNEXPECTED-PASS" -e "REFTEST TEST-UNEXPECTED-FAIL" $TEST_DIR/reftest$TEST_FLAVOUR 2>&1 > failures-reftest$TEST_FLAVOUR.txt
+}
+
+function print_failures() {
+ #!/usr/bin/bash
+ # Analyze and print test failures
+
+ export TEST_DIR="test_results"
+
+ #./print-errors $TEST_DIR ""
+ print_errors $TEST_DIR "-wr"
+ #./print-error-reftest $TEST_DIR ""
+ print_error_reftest $TEST_DIR "-wr"
+}
+
+function psummary() {
+ #!/usr/bin/bash
+ # Analyze and print specialized (basic/webrender) test results
+
+ TEST_DIR=$1
+ TEST_FLAVOUR=$2
+
+ MPASS=`grep "TEST_END: Test OK" $TEST_DIR/mochitest$TEST_FLAVOUR | wc -l`
+ MERR=`grep "TEST_END: Test ERROR" $TEST_DIR/mochitest$TEST_FLAVOUR | wc -l`
+ MUNEX=`grep "TEST-UNEXPECTED-FAIL" $TEST_DIR/mochitest$TEST_FLAVOUR | wc -l`
+ echo "Mochitest PASSED: $MPASS FAILED: $MERR UNEXPECTED-FAILURES: $MUNEX"
+
+ XPCPASS=`grep --text "Expected results:" $TEST_DIR/xpcshell$TEST_FLAVOUR | cut -d ' ' -f 3`
+ XPCFAIL=`grep --text "Unexpected results:" $TEST_DIR/xpcshell$TEST_FLAVOUR | cut -d ' ' -f 3`
+ echo "XPCShell: PASSED: $XPCPASS FAILED: $XPCFAIL"
+
+ CRPASS=`grep "REFTEST INFO | Successful:" $TEST_DIR/crashtest$TEST_FLAVOUR | cut -d ' ' -f 5`
+ CRFAIL=`grep "^REFTEST INFO | Unexpected:" $TEST_DIR/crashtest$TEST_FLAVOUR | cut -d ' ' -f 5`
+ echo "Crashtest: PASSED: $CRPASS FAILED: $CRFAIL"
+
+ RFPASS=`grep --text "REFTEST INFO | Successful:" $TEST_DIR/reftest$TEST_FLAVOUR | cut -d ' ' -f 5`
+ RFUN=`grep --text "^REFTEST INFO | Unexpected:" $TEST_DIR/reftest$TEST_FLAVOUR | cut -d ' ' -f 5`
+ RFKNOWN=`grep --text "REFTEST INFO | Known problems:" $TEST_DIR/reftest$TEST_FLAVOUR | cut -d ' ' -f 6`
+ echo "Reftest: PASSED: $RFPASS FAILED: $RFUN Known issues: $RFKNOWN"
+}
+
+function print_results() {
+ #!/usr/bin/bash
+ # Analyze and print general test results
+
+ export TEST_DIR="test_results"
+
+ echo "Test results"
+ #echo "Basic compositor"
+ #./psummary $TEST_DIR ""
+ echo "WebRender"
+ psummary $TEST_DIR "-wr"
+}
+
+set -x
+first=$1
+shift
+$first $*
+