diff --git a/.firefox.metadata b/.firefox.metadata new file mode 100644 index 0000000..f33918f --- /dev/null +++ b/.firefox.metadata @@ -0,0 +1,9 @@ +18a8f30a0356c751b8d0ea6f76e764cab13ee046 SOURCES/Python-2.7.13.tar.xz +e86c38c48960b95353503b78e1de9ddca1ed34d7 SOURCES/cbindgen-vendor.tar.xz +ee6406ec1280afc24d4a90c392ff09ff5060686e SOURCES/firefox-68.9.0esr.source.tar.xz +cbb1c23ae26fc81578036403dbceef7cd10fc98b SOURCES/firefox-langpacks-68.9.0esr-20200529.tar.xz +0de63f863b158454b9429234b52ed28a397ec45c SOURCES/gtk3-private-3.22.26-1.el6.src.rpm +e188ab1a444697bc649e223c28389d82ca94c472 SOURCES/libffi-3.0.13-18.el7_3.src.rpm +4f8d3bf2483d95261ff90742ecec82d6a899eca3 SOURCES/nodejs-8.11.4-1.3.fc27.src.rpm +a379070abf5000cde61411c97af7e733b267a4d3 SOURCES/openssl-1.0.2k-19.6.bundle.el7_7.src.rpm +77fd30f7ebc12a629a31c1e252cec06af55a71fe SOURCES/yasm-1.2.0-3.el5.src.rpm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..94cbab6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +SOURCES/Python-2.7.13.tar.xz +SOURCES/cbindgen-vendor.tar.xz +SOURCES/firefox-68.9.0esr.source.tar.xz +SOURCES/firefox-langpacks-68.9.0esr-20200529.tar.xz +SOURCES/gtk3-private-3.22.26-1.el6.src.rpm +SOURCES/libffi-3.0.13-18.el7_3.src.rpm +SOURCES/nodejs-8.11.4-1.3.fc27.src.rpm +SOURCES/openssl-1.0.2k-19.6.bundle.el7_7.src.rpm +SOURCES/yasm-1.2.0-3.el5.src.rpm diff --git a/SOURCES/build-debug-qcms.patch b/SOURCES/build-debug-qcms.patch new file mode 100644 index 0000000..a65223a --- /dev/null +++ b/SOURCES/build-debug-qcms.patch @@ -0,0 +1,12 @@ +diff -up firefox-60.0/gfx/qcms/transform-altivec.c.debug firefox-60.0/gfx/qcms/transform-altivec.c +--- firefox-60.0/gfx/qcms/transform-altivec.c.debug 2018-05-15 09:26:43.603043100 +0200 ++++ firefox-60.0/gfx/qcms/transform-altivec.c 2018-05-15 09:28:57.302385632 +0200 +@@ -30,7 +30,7 @@ + static const ALIGN float floatScaleX4 = FLOATSCALE; + static const ALIGN float clampMaxValueX4 = CLAMPMAXVAL; + +-inline vector float load_aligned_float(float *dataPtr) ++static vector float load_aligned_float(float *dataPtr) + { + vector float data = vec_lde(0, dataPtr); + vector unsigned char moveToStart = vec_lvsl(0, dataPtr); diff --git a/SOURCES/build-icu-big-endian.patch b/SOURCES/build-icu-big-endian.patch new file mode 100644 index 0000000..ee5fd6a --- /dev/null +++ b/SOURCES/build-icu-big-endian.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.0/build/autoconf/icu.m4.icu firefox-68.0/build/autoconf/icu.m4 +--- firefox-68.0/build/autoconf/icu.m4.icu 2019-06-25 21:25:25.394425654 +0200 ++++ firefox-68.0/build/autoconf/icu.m4 2019-06-25 21:26:23.544210474 +0200 +@@ -78,7 +78,7 @@ if test -n "$USE_ICU"; then + # TODO: the l is actually endian-dependent + # We could make this set as 'l' or 'b' for little or big, respectively, + # but we'd need to check in a big-endian version of the file. +- ICU_DATA_FILE="icudt${version}l.dat" ++ ICU_DATA_FILE="icudt${version}b.dat" + fi + + AC_SUBST(MOZ_ICU_VERSION) + diff --git a/SOURCES/build-icu-make.patch b/SOURCES/build-icu-make.patch new file mode 100644 index 0000000..6a04091 --- /dev/null +++ b/SOURCES/build-icu-make.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.8.0/intl/icu_sources_data.py.icu-makefile firefox-68.8.0/intl/icu_sources_data.py +--- firefox-68.8.0/intl/icu_sources_data.py.icu-makefile 2020-05-11 17:00:03.642605718 +0200 ++++ firefox-68.8.0/intl/icu_sources_data.py 2020-05-11 17:00:37.774642749 +0200 +@@ -246,8 +246,7 @@ def update_data_file(topsrcdir): + if not try_run( + 'icu-make', + ['make', +- '--jobs=%d' % multiprocessing.cpu_count(), +- '--output-sync'], ++ '--jobs=1'], + cwd=objdir): + return False + print('Copying ICU data file...') diff --git a/SOURCES/build-mozconfig-fix.patch b/SOURCES/build-mozconfig-fix.patch new file mode 100644 index 0000000..91dffb1 --- /dev/null +++ b/SOURCES/build-mozconfig-fix.patch @@ -0,0 +1,12 @@ +diff -up mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py.mozconfig-fix mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py +--- mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py.mozconfig-fix 2018-03-13 17:22:19.018466884 +0100 ++++ mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py 2018-03-13 17:23:57.379559640 +0100 +@@ -446,7 +446,7 @@ class MozconfigLoader(object): + value = value[1:] + + # Lines with a quote not ending in a quote are multi-line. +- if has_quote and not value.endswith("'"): ++ if has_quote and not value.endswith(("'", ";")): + in_variable = name + current.append(value) + continue diff --git a/SOURCES/build-nss-version.patch b/SOURCES/build-nss-version.patch new file mode 100644 index 0000000..7847090 --- /dev/null +++ b/SOURCES/build-nss-version.patch @@ -0,0 +1,12 @@ +diff -up firefox-68.3.0/old-configure.in.nss-version firefox-68.3.0/old-configure.in +--- firefox-68.3.0/old-configure.in.nss-version 2019-11-27 19:48:01.045677621 +0100 ++++ firefox-68.3.0/old-configure.in 2019-11-27 19:59:52.856894047 +0100 +@@ -1537,7 +1537,7 @@ MOZ_ARG_WITH_BOOL(system-nss, + _USE_SYSTEM_NSS=1 ) + + if test -n "$_USE_SYSTEM_NSS"; then +- AM_PATH_NSS(3.44.4, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) ++ AM_PATH_NSS(3.44.0, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])]) + fi + + NSS_CFLAGS="$NSS_CFLAGS -I${DIST}/include/nss" diff --git a/SOURCES/build-ppc64le-inline.patch b/SOURCES/build-ppc64le-inline.patch new file mode 100644 index 0000000..de0f6d9 --- /dev/null +++ b/SOURCES/build-ppc64le-inline.patch @@ -0,0 +1,27 @@ +diff -up firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp.ppc64le-inline firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp +--- firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp.ppc64le-inline 2019-08-26 18:52:28.000000000 +0200 ++++ firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp 2019-08-29 08:49:57.695687874 +0200 +@@ -1092,7 +1092,11 @@ class MOZ_STACK_CLASS CallMethodHelper f + MOZ_ALWAYS_INLINE bool GetOutParamSource(uint8_t paramIndex, + MutableHandleValue srcp) const; + ++#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN) ++ bool GatherAndConvertResults(); ++#else + MOZ_ALWAYS_INLINE bool GatherAndConvertResults(); ++#endif + + MOZ_ALWAYS_INLINE bool QueryInterfaceFastPath(); + +@@ -1139,7 +1143,11 @@ class MOZ_STACK_CLASS CallMethodHelper f + + ~CallMethodHelper(); + ++#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN) ++ bool Call(); ++#else + MOZ_ALWAYS_INLINE bool Call(); ++#endif + + // Trace implementation so we can put our CallMethodHelper in a Rooted. + void trace(JSTracer* aTrc); diff --git a/SOURCES/distribution.ini b/SOURCES/distribution.ini new file mode 100644 index 0000000..8bf461e --- /dev/null +++ b/SOURCES/distribution.ini @@ -0,0 +1,9 @@ +[Global] +id=redhat +version=1.0 +about=Mozilla Firefox for Red Hat Enterprise Linux + +[Preferences] +app.distributor=redhat +app.distributor.channel=redhat +app.partner.fedora=redhat diff --git a/SOURCES/firefox-debugedits-error.patch b/SOURCES/firefox-debugedits-error.patch new file mode 100644 index 0000000..a4b005f --- /dev/null +++ b/SOURCES/firefox-debugedits-error.patch @@ -0,0 +1,50 @@ +diff -up firefox-68.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old firefox-68.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium +diff -up firefox-68.0/media/webrtc/trunk/Makefile.old firefox-68.0/media/webrtc/trunk/Makefile +diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc.old firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc +--- firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc.old 2019-06-12 08:17:02.673268442 +0200 ++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc 2019-06-12 08:17:13.582328073 +0200 +@@ -21,7 +21,7 @@ + * be found in the AUTHORS file in the root of the source tree. + */ + +-#include "modules/audio_processing//utility/ooura_fft.h" ++#include "modules/audio_processing/utility/ooura_fft.h" + + #include + +diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc.old firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc +--- firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc.old 2019-06-12 08:17:36.671454285 +0200 ++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc 2019-06-12 08:17:46.989510679 +0200 +@@ -8,7 +8,7 @@ + * be found in the AUTHORS file in the root of the source tree. + */ + +-#include "modules/audio_processing//utility/ooura_fft.h" ++#include "modules/audio_processing/utility/ooura_fft.h" + + #include + +diff -up firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c.old firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c +--- firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c.old 2019-06-12 08:16:15.673011534 +0200 ++++ firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c 2019-06-12 08:16:22.602049410 +0200 +@@ -17,7 +17,7 @@ + #include "aom_dsp/blend.h" + #include "aom/aom_integer.h" + #include "aom_dsp/x86/synonyms.h" +-#include "aom_dsp/x86//masked_sad_intrin_ssse3.h" ++#include "aom_dsp/x86/masked_sad_intrin_ssse3.h" + + static INLINE unsigned int masked_sad32xh_avx2( + const uint8_t *src_ptr, int src_stride, const uint8_t *a_ptr, int a_stride, +diff -up firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c.old firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c +--- firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c.old 2019-06-12 08:16:35.404119384 +0200 ++++ firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c 2019-06-12 08:16:43.415163174 +0200 +@@ -19,7 +19,7 @@ + #include "aom/aom_integer.h" + #include "aom_dsp/x86/synonyms.h" + +-#include "aom_dsp/x86//masked_sad_intrin_ssse3.h" ++#include "aom_dsp/x86/masked_sad_intrin_ssse3.h" + + // For width a multiple of 16 + static INLINE unsigned int masked_sad_ssse3(const uint8_t *src_ptr, diff --git a/SOURCES/firefox-dont-check-binary.patch b/SOURCES/firefox-dont-check-binary.patch new file mode 100644 index 0000000..c498034 --- /dev/null +++ b/SOURCES/firefox-dont-check-binary.patch @@ -0,0 +1,47 @@ +diff -up firefox-68.0/config/rules.mk.old firefox-68.0/config/rules.mk +--- firefox-68.0/config/rules.mk.old 2019-06-26 09:36:58.537034443 +0200 ++++ firefox-68.0/config/rules.mk 2019-06-26 09:37:38.004970573 +0200 +@@ -569,7 +569,6 @@ ifdef MOZ_PROFILE_GENERATE + endif + else # !WINNT || GNU_CC + $(call EXPAND_CC_OR_CXX,$@) -o $@ $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) $($(notdir $@)_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(RUST_STATIC_LIB) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS) +- $(call py_action,check_binary,--target $@) + endif # WINNT && !GNU_CC + + ifdef ENABLE_STRIP +@@ -604,9 +603,6 @@ else + $(HOST_CC) -o $@ $(HOST_C_LDFLAGS) $(HOST_LDFLAGS) $($(notdir $@)_OBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS) + endif # HOST_CPP_PROG_LINK + endif +-ifndef CROSS_COMPILE +- $(call py_action,check_binary,--host $@) +-endif + + # + # This is an attempt to support generation of multiple binaries +@@ -630,7 +626,6 @@ ifdef MSMANIFEST_TOOL + endif # MSVC with manifest tool + else + $(call EXPAND_CC_OR_CXX,$@) $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) -o $@ $($@_$(OBJS_VAR_SUFFIX)) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS) +- $(call py_action,check_binary,--target $@) + endif # WINNT && !GNU_CC + + ifdef ENABLE_STRIP +@@ -651,9 +646,6 @@ else + $(HOST_CC) $(HOST_OUTOPTION)$@ $(HOST_C_LDFLAGS) $($(notdir $@)_OBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS) + endif + endif +-ifndef CROSS_COMPILE +- $(call py_action,check_binary,--host $@) +-endif + + $(LIBRARY): $(OBJS) $(STATIC_LIBS) $(EXTRA_DEPS) $(GLOBAL_DEPS) + $(REPORT_BUILD) +@@ -691,7 +683,6 @@ ifndef INCREMENTAL_LINKER + $(RM) $@ + endif + $(MKSHLIB) $($@_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(LDFLAGS) $(STATIC_LIBS) $(RUST_STATIC_LIB) $(SHARED_LIBS) $(EXTRA_DSO_LDOPTS) $(MOZ_GLUE_LDFLAGS) $(OS_LIBS) +- $(call py_action,check_binary,--target $@) + + ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH)) + ifdef MSMANIFEST_TOOL diff --git a/SOURCES/firefox-enable-addons.patch b/SOURCES/firefox-enable-addons.patch new file mode 100644 index 0000000..15d0707 --- /dev/null +++ b/SOURCES/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/SOURCES/firefox-mozconfig b/SOURCES/firefox-mozconfig new file mode 100644 index 0000000..5585559 --- /dev/null +++ b/SOURCES/firefox-mozconfig @@ -0,0 +1,28 @@ +. $topsrcdir/browser/config/mozconfig + +ac_add_options --enable-default-toolkit=cairo-gtk3 + +ac_add_options --prefix="$PREFIX" +ac_add_options --libdir="$LIBDIR" +ac_add_options --with-system-zlib +ac_add_options --with-system-bz2 +ac_add_options --disable-strip +ac_add_options --disable-tests +#ac_add_options --enable-libnotify +ac_add_options --enable-necko-wifi +ac_add_options --enable-startup-notification +ac_add_options --disable-updater +ac_add_options --enable-chrome-format=omni +ac_add_options --enable-pulseaudio +ac_add_options --with-system-icu +ac_add_options --with-mozilla-api-keyfile=../mozilla-api-key +ac_add_options --with-google-location-service-api-keyfile=../google-api-key +ac_add_options --with-google-safebrowsing-api-keyfile=../google-api-key +ac_add_options --disable-av1 + +export BUILD_OFFICIAL=1 +export MOZILLA_OFFICIAL=1 +export MOZ_TELEMETRY_REPORTING=1 +mk_add_options BUILD_OFFICIAL=1 +mk_add_options MOZILLA_OFFICIAL=1 +mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir diff --git a/SOURCES/firefox-pipewire-0-3.patch b/SOURCES/firefox-pipewire-0-3.patch new file mode 100644 index 0000000..7aa06b9 --- /dev/null +++ b/SOURCES/firefox-pipewire-0-3.patch @@ -0,0 +1,821 @@ +diff --git a/config/system-headers.mozbuild b/config/system-headers.mozbuild +index 2081d0c683a4..641133bf1ea4 100644 +--- a/config/system-headers.mozbuild ++++ b/config/system-headers.mozbuild +@@ -314,6 +314,7 @@ system_headers = [ + 'Gestalt.h', + 'getopt.h', + 'gio/gio.h', ++ 'gio/gunixfdlist.h', + 'glibconfig.h', + 'glib.h', + 'glib-object.h', +@@ -607,6 +608,7 @@ system_headers = [ + 'Pgenerr.h', + 'PGenErr.h', + 'Ph.h', ++ 'pipewire/pipewire.h', + 'pixman.h', + 'pk11func.h', + 'pk11pqg.h', +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build +index 90b40431c7e4..d844aa79d591 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build +@@ -194,6 +194,30 @@ if CONFIG["OS_TARGET"] == "Linux": + "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc" + ] + ++# PipeWire specific files ++if CONFIG["OS_TARGET"] == "Linux": ++ ++ DEFINES["WEBRTC_USE_PIPEWIRE"] = "1" ++ ++ OS_LIBS += [ ++ "rt", ++ "pipewire-0.3", ++ "glib-2.0", ++ "gio-2.0", ++ "gobject-2.0" ++ ] ++ ++ CXXFLAGS += CONFIG['TK_CFLAGS'] ++ CXXFLAGS += [ "-I/usr/include/pipewire-0.3" ] ++ CXXFLAGS += [ "-I/usr/include/spa-0.2" ] ++ ++ UNIFIED_SOURCES += [ ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc", ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc", ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc" ++ ] ++ ++ + if CONFIG["OS_TARGET"] == "NetBSD": + + DEFINES["USE_X11"] = "1" +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h +index 1eb8ead26efa..316468eed1fc 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h +@@ -141,7 +141,7 @@ class DesktopCaptureOptions { + bool disable_effects_ = true; + bool detect_updated_region_ = false; + #if defined(WEBRTC_USE_PIPEWIRE) +- bool allow_pipewire_ = false; ++ bool allow_pipewire_ = true; + #endif + }; + +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +index 379341c833de..53e2683df2e8 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc +@@ -15,8 +15,11 @@ + + #include + #include +-#include +-#include ++ ++#include ++#include ++#include ++#include + + #include + #include +@@ -36,31 +39,36 @@ const char kSessionInterfaceName[] = "org.freedesktop.portal.Session"; + const char kRequestInterfaceName[] = "org.freedesktop.portal.Request"; + const char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast"; + +-// static +-void BaseCapturerPipeWire::OnStateChanged(void* data, +- pw_remote_state old_state, +- pw_remote_state state, +- const char* error_message) { +- BaseCapturerPipeWire* that = static_cast(data); +- RTC_DCHECK(that); + +- switch (state) { +- case PW_REMOTE_STATE_ERROR: +- RTC_LOG(LS_ERROR) << "PipeWire remote state error: " << error_message; +- break; +- case PW_REMOTE_STATE_CONNECTED: +- RTC_LOG(LS_INFO) << "PipeWire remote state: connected."; +- that->CreateReceivingStream(); +- break; +- case PW_REMOTE_STATE_CONNECTING: +- RTC_LOG(LS_INFO) << "PipeWire remote state: connecting."; ++// static ++void BaseCapturerPipeWire::SyncDmaBuf(int fd, uint64_t start_or_end) { ++ struct dma_buf_sync sync = { 0 }; ++ ++ sync.flags = start_or_end | DMA_BUF_SYNC_READ; ++ ++ while(true) { ++ int ret; ++ ret = ioctl (fd, DMA_BUF_IOCTL_SYNC, &sync); ++ if (ret == -1 && errno == EINTR) { ++ continue; ++ } else if (ret == -1) { ++ RTC_LOG(LS_ERROR) << "Failed to synchronize DMA buffer: " << g_strerror(errno); + break; +- case PW_REMOTE_STATE_UNCONNECTED: +- RTC_LOG(LS_INFO) << "PipeWire remote state: unconnected."; ++ } else { + break; ++ } + } + } + ++// static ++void BaseCapturerPipeWire::OnCoreError(void *data, ++ uint32_t id, ++ int seq, ++ int res, ++ const char *message) { ++ RTC_LOG(LS_ERROR) << "core error: " << message; ++} ++ + // static + void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + pw_stream_state old_state, +@@ -73,76 +81,54 @@ void BaseCapturerPipeWire::OnStreamStateChanged(void* data, + case PW_STREAM_STATE_ERROR: + RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message; + break; +- case PW_STREAM_STATE_CONFIGURE: +- pw_stream_set_active(that->pw_stream_, true); +- break; +- case PW_STREAM_STATE_UNCONNECTED: +- case PW_STREAM_STATE_CONNECTING: +- case PW_STREAM_STATE_READY: + case PW_STREAM_STATE_PAUSED: + case PW_STREAM_STATE_STREAMING: ++ case PW_STREAM_STATE_UNCONNECTED: ++ case PW_STREAM_STATE_CONNECTING: + break; + } + } + + // static +-void BaseCapturerPipeWire::OnStreamFormatChanged(void* data, +- const struct spa_pod* format) { ++void BaseCapturerPipeWire::OnStreamParamChanged(void *data, uint32_t id, ++ const struct spa_pod *format) { + BaseCapturerPipeWire* that = static_cast(data); + RTC_DCHECK(that); + +- RTC_LOG(LS_INFO) << "PipeWire stream format changed."; ++ RTC_LOG(LS_INFO) << "PipeWire stream param changed."; + +- if (!format) { +- pw_stream_finish_format(that->pw_stream_, /*res=*/0, /*params=*/nullptr, +- /*n_params=*/0); ++ if (!format || id != SPA_PARAM_Format) { + return; + } + +- that->spa_video_format_ = new spa_video_info_raw(); +- spa_format_video_raw_parse(format, that->spa_video_format_, +- &that->pw_type_->format_video); ++ spa_format_video_raw_parse(format, &that->spa_video_format_); + +- auto width = that->spa_video_format_->size.width; +- auto height = that->spa_video_format_->size.height; ++ auto width = that->spa_video_format_.size.width; ++ auto height = that->spa_video_format_.size.height; + auto stride = SPA_ROUND_UP_N(width * kBytesPerPixel, 4); + auto size = height * stride; + ++ that->desktop_size_ = DesktopSize(width, height); ++ + uint8_t buffer[1024] = {}; + auto builder = spa_pod_builder{buffer, sizeof(buffer)}; + + // Setup buffers and meta header for new format. +- const struct spa_pod* params[2]; +- params[0] = reinterpret_cast(spa_pod_builder_object( +- &builder, +- // id to enumerate buffer requirements +- that->pw_core_type_->param.idBuffers, +- that->pw_core_type_->param_buffers.Buffers, +- // Size: specified as integer (i) and set to specified size +- ":", that->pw_core_type_->param_buffers.size, "i", size, +- // Stride: specified as integer (i) and set to specified stride +- ":", that->pw_core_type_->param_buffers.stride, "i", stride, +- // Buffers: specifies how many buffers we want to deal with, set as +- // integer (i) where preferred number is 8, then allowed number is defined +- // as range (r) from min and max values and it is undecided (u) to allow +- // negotiation +- ":", that->pw_core_type_->param_buffers.buffers, "iru", 8, +- SPA_POD_PROP_MIN_MAX(1, 32), +- // Align: memory alignment of the buffer, set as integer (i) to specified +- // value +- ":", that->pw_core_type_->param_buffers.align, "i", 16)); +- params[1] = reinterpret_cast(spa_pod_builder_object( +- &builder, +- // id to enumerate supported metadata +- that->pw_core_type_->param.idMeta, that->pw_core_type_->param_meta.Meta, +- // Type: specified as id or enum (I) +- ":", that->pw_core_type_->param_meta.type, "I", +- that->pw_core_type_->meta.Header, +- // Size: size of the metadata, specified as integer (i) +- ":", that->pw_core_type_->param_meta.size, "i", +- sizeof(struct spa_meta_header))); +- +- pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/2); ++ const struct spa_pod* params[3]; ++ params[0] = reinterpret_cast(spa_pod_builder_add_object(&builder, ++ SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers, ++ SPA_PARAM_BUFFERS_size, SPA_POD_Int(size), ++ SPA_PARAM_BUFFERS_stride, SPA_POD_Int(stride), ++ SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 1, 32))); ++ params[1] = reinterpret_cast(spa_pod_builder_add_object(&builder, ++ SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, ++ SPA_PARAM_META_type, SPA_POD_Id(SPA_META_Header), ++ SPA_PARAM_META_size, SPA_POD_Int(sizeof(struct spa_meta_header)))); ++ params[2] = reinterpret_cast(spa_pod_builder_add_object(&builder, ++ SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, ++ SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop), ++ SPA_PARAM_META_size, SPA_POD_Int (sizeof(struct spa_meta_region)))); ++ pw_stream_update_params(that->pw_stream_, params, 3); + } + + // static +@@ -150,15 +136,25 @@ void BaseCapturerPipeWire::OnStreamProcess(void* data) { + BaseCapturerPipeWire* that = static_cast(data); + RTC_DCHECK(that); + +- pw_buffer* buf = nullptr; ++ struct pw_buffer *next_buffer; ++ struct pw_buffer *buffer = nullptr; + +- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) { ++ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); ++ while (next_buffer) { ++ buffer = next_buffer; ++ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_); ++ ++ if (next_buffer) ++ pw_stream_queue_buffer (that->pw_stream_, buffer); ++ } ++ ++ if (!buffer) { + return; + } + +- that->HandleBuffer(buf); ++ that->HandleBuffer(buffer); + +- pw_stream_queue_buffer(that->pw_stream_, buf); ++ pw_stream_queue_buffer(that->pw_stream_, buffer); + } + + BaseCapturerPipeWire::BaseCapturerPipeWire(CaptureSourceType source_type) +@@ -169,38 +165,22 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() { + pw_thread_loop_stop(pw_main_loop_); + } + +- if (pw_type_) { +- delete pw_type_; +- } +- +- if (spa_video_format_) { +- delete spa_video_format_; +- } +- + if (pw_stream_) { + pw_stream_destroy(pw_stream_); + } + +- if (pw_remote_) { +- pw_remote_destroy(pw_remote_); ++ if (pw_core_) { ++ pw_core_disconnect(pw_core_); + } + +- if (pw_core_) { +- pw_core_destroy(pw_core_); ++ if (pw_context_) { ++ pw_context_destroy(pw_context_); + } + + if (pw_main_loop_) { + pw_thread_loop_destroy(pw_main_loop_); + } + +- if (pw_loop_) { +- pw_loop_destroy(pw_loop_); +- } +- +- if (current_frame_) { +- free(current_frame_); +- } +- + if (start_request_signal_id_) { + g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_); + } +@@ -250,27 +230,35 @@ void BaseCapturerPipeWire::InitPortal() { + void BaseCapturerPipeWire::InitPipeWire() { + pw_init(/*argc=*/nullptr, /*argc=*/nullptr); + +- pw_loop_ = pw_loop_new(/*properties=*/nullptr); +- pw_main_loop_ = pw_thread_loop_new(pw_loop_, "pipewire-main-loop"); +- +- pw_core_ = pw_core_new(pw_loop_, /*properties=*/nullptr); +- pw_core_type_ = pw_core_get_type(pw_core_); +- pw_remote_ = pw_remote_new(pw_core_, nullptr, /*user_data_size=*/0); ++ pw_main_loop_ = pw_thread_loop_new("pipewire-main-loop", nullptr); ++ pw_context_ = pw_context_new(pw_thread_loop_get_loop(pw_main_loop_), nullptr, 0); ++ if (!pw_context_) { ++ RTC_LOG(LS_ERROR) << "Failed to create PipeWire context"; ++ return; ++ } + +- InitPipeWireTypes(); ++ pw_core_ = pw_context_connect(pw_context_, nullptr, 0); ++ if (!pw_core_) { ++ RTC_LOG(LS_ERROR) << "Failed to connect PipeWire context"; ++ return; ++ } + + // Initialize event handlers, remote end and stream-related. +- pw_remote_events_.version = PW_VERSION_REMOTE_EVENTS; +- pw_remote_events_.state_changed = &OnStateChanged; ++ pw_core_events_.version = PW_VERSION_CORE_EVENTS; ++ pw_core_events_.error = &OnCoreError; + + pw_stream_events_.version = PW_VERSION_STREAM_EVENTS; + pw_stream_events_.state_changed = &OnStreamStateChanged; +- pw_stream_events_.format_changed = &OnStreamFormatChanged; ++ pw_stream_events_.param_changed = &OnStreamParamChanged; + pw_stream_events_.process = &OnStreamProcess; + +- pw_remote_add_listener(pw_remote_, &spa_remote_listener_, &pw_remote_events_, +- this); +- pw_remote_connect_fd(pw_remote_, pw_fd_); ++ pw_core_add_listener(pw_core_, &spa_core_listener_, &pw_core_events_, this); ++ ++ pw_stream_ = CreateReceivingStream(); ++ if (!pw_stream_) { ++ RTC_LOG(LS_ERROR) << "Failed to create PipeWire stream"; ++ return; ++ } + + if (pw_thread_loop_start(pw_main_loop_) < 0) { + RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop"; +@@ -278,81 +266,120 @@ void BaseCapturerPipeWire::InitPipeWire() { + } + } + +-void BaseCapturerPipeWire::InitPipeWireTypes() { +- spa_type_map* map = pw_core_type_->map; +- pw_type_ = new PipeWireType(); +- +- spa_type_media_type_map(map, &pw_type_->media_type); +- spa_type_media_subtype_map(map, &pw_type_->media_subtype); +- spa_type_format_video_map(map, &pw_type_->format_video); +- spa_type_video_format_map(map, &pw_type_->video_format); +-} +- +-void BaseCapturerPipeWire::CreateReceivingStream() { ++pw_stream* BaseCapturerPipeWire::CreateReceivingStream() { + spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1}; +- spa_rectangle pwScreenBounds = +- spa_rectangle{static_cast(desktop_size_.width()), +- static_cast(desktop_size_.height())}; ++ spa_rectangle pwMaxScreenBounds = spa_rectangle{INT32_MAX, INT32_MAX}; + +- spa_fraction pwFrameRateMin = spa_fraction{0, 1}; +- spa_fraction pwFrameRateMax = spa_fraction{60, 1}; ++ auto stream = pw_stream_new(pw_core_, "webrtc-pipewire-stream", nullptr); + +- pw_properties* reuseProps = pw_properties_new("pipewire.client.reuse", "1", +- /*end of varargs*/ nullptr); +- pw_stream_ = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps); ++ if (!stream) { ++ RTC_LOG(LS_ERROR) << "Could not create receiving stream."; ++ return nullptr; ++ } + + uint8_t buffer[1024] = {}; +- const spa_pod* params[1]; +- spa_pod_builder builder = spa_pod_builder{buffer, sizeof(buffer)}; +- params[0] = reinterpret_cast(spa_pod_builder_object( +- &builder, +- // id to enumerate formats +- pw_core_type_->param.idEnumFormat, pw_core_type_->spa_format, "I", +- pw_type_->media_type.video, "I", pw_type_->media_subtype.raw, +- // Video format: specified as id or enum (I), preferred format is BGRx, +- // then allowed formats are enumerated (e) and the format is undecided (u) +- // to allow negotiation +- ":", pw_type_->format_video.format, "Ieu", pw_type_->video_format.BGRx, +- SPA_POD_PROP_ENUM(2, pw_type_->video_format.RGBx, +- pw_type_->video_format.BGRx), +- // Video size: specified as rectangle (R), preferred size is specified as +- // first parameter, then allowed size is defined as range (r) from min and +- // max values and the format is undecided (u) to allow negotiation +- ":", pw_type_->format_video.size, "Rru", &pwScreenBounds, 2, +- &pwMinScreenBounds, &pwScreenBounds, +- // Frame rate: specified as fraction (F) and set to minimum frame rate +- // value +- ":", pw_type_->format_video.framerate, "F", &pwFrameRateMin, +- // Max frame rate: specified as fraction (F), preferred frame rate is set +- // to maximum value, then allowed frame rate is defined as range (r) from +- // min and max values and it is undecided (u) to allow negotiation +- ":", pw_type_->format_video.max_framerate, "Fru", &pwFrameRateMax, 2, +- &pwFrameRateMin, &pwFrameRateMax)); +- +- pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_, +- this); ++ const spa_pod* params[2]; ++ spa_pod_builder builder = SPA_POD_BUILDER_INIT(buffer, sizeof (buffer)); ++ ++ params[0] = reinterpret_cast(spa_pod_builder_add_object(&builder, ++ SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat, ++ SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_video), ++ SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), ++ SPA_FORMAT_VIDEO_format, SPA_POD_CHOICE_ENUM_Id(5, SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_RGBx, SPA_VIDEO_FORMAT_RGBA, ++ SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_BGRA), ++ SPA_FORMAT_VIDEO_size, SPA_POD_CHOICE_RANGE_Rectangle(&pwMinScreenBounds, ++ &pwMinScreenBounds, ++ &pwMaxScreenBounds), ++ 0)); ++ pw_stream_add_listener(stream, &spa_stream_listener_, &pw_stream_events_, this); ++ + pw_stream_flags flags = static_cast( +- PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE | +- PW_STREAM_FLAG_MAP_BUFFERS); +- if (pw_stream_connect(pw_stream_, PW_DIRECTION_INPUT, /*port_path=*/nullptr, +- flags, params, +- /*n_params=*/1) != 0) { ++ PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE); ++ ++ if (pw_stream_connect(stream, PW_DIRECTION_INPUT, pw_stream_node_id_, PW_STREAM_FLAG_AUTOCONNECT, params, 1) != 0) { + RTC_LOG(LS_ERROR) << "Could not connect receiving stream."; + portal_init_failed_ = true; +- return; + } ++ ++ return stream; + } + + void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) { ++ struct spa_meta_region* video_crop; + spa_buffer* spaBuffer = buffer->buffer; +- void* src = nullptr; ++ uint8_t *map = nullptr; ++ uint8_t* src = nullptr; ++ uint8_t* dst = nullptr; ++ ++ if (spaBuffer->datas[0].chunk->size == 0) { ++ map = nullptr; ++ src = nullptr; ++ } else if (spaBuffer->datas[0].type == SPA_DATA_MemFd) { ++ map = static_cast(mmap( ++ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, ++ PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0)); ++ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t); ++ } else if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { ++ int fd; ++ fd = spaBuffer->datas[0].fd; ++ ++ map = static_cast(mmap( ++ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset, ++ PROT_READ, MAP_PRIVATE, fd, 0)); ++ SyncDmaBuf(fd, DMA_BUF_SYNC_START); ++ ++ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t); ++ } else if (spaBuffer->datas[0].type == SPA_DATA_MemPtr) { ++ map = nullptr; ++ src = static_cast(spaBuffer->datas[0].data); ++ } else { ++ return; ++ } + +- if (!(src = spaBuffer->datas[0].data)) { ++ if (!src) { + return; + } + +- uint32_t maxSize = spaBuffer->datas[0].maxsize; +- int32_t srcStride = spaBuffer->datas[0].chunk->stride; ++ DesktopSize prev_crop_size = DesktopSize(0, 0); ++ if (video_crop_size_initialized_) { ++ prev_crop_size = video_crop_size_; ++ } ++ ++ if ((video_crop = static_cast( ++ spa_buffer_find_meta_data(spaBuffer, SPA_META_VideoCrop, sizeof(*video_crop))))) { ++ RTC_DCHECK(video_crop->region.size.width <= desktop_size_.width() && ++ video_crop->region.size.height <= desktop_size_.height()); ++ if ((video_crop->region.size.width != desktop_size_.width() || ++ video_crop->region.size.height != desktop_size_.height()) && video_crop->region.size.width && video_crop->region.size.height) { ++ video_crop_size_ = DesktopSize(video_crop->region.size.width, video_crop->region.size.height); ++ video_crop_size_initialized_ = true; ++ } else { ++ video_crop_size_initialized_ = false; ++ } ++ } else { ++ video_crop_size_initialized_ = false; ++ } ++ ++ size_t frame_size; ++ if (video_crop_size_initialized_) { ++ frame_size = ++ video_crop_size_.width() * video_crop_size_.height() * kBytesPerPixel; ++ } else { ++ frame_size = ++ desktop_size_.width() * desktop_size_.height() * kBytesPerPixel; ++ } ++ ++ if (!current_frame_ || ++ (video_crop_size_initialized_ && !video_crop_size_.equals(prev_crop_size))) { ++ current_frame_ = std::make_unique(frame_size); ++ } ++ RTC_DCHECK(current_frame_ != nullptr); ++ ++ const int32_t dstStride = video_crop_size_initialized_ ++ ? video_crop_size_.width() * kBytesPerPixel ++ : desktop_size_.width() * kBytesPerPixel; ++ const int32_t srcStride = spaBuffer->datas[0].chunk->stride; ++ + if (srcStride != (desktop_size_.width() * kBytesPerPixel)) { + RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: " + << srcStride +@@ -361,21 +388,40 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) { + return; + } + +- if (!current_frame_) { +- current_frame_ = static_cast(malloc(maxSize)); ++ dst = current_frame_.get(); ++ ++ // Adjust source content based on crop video position ++ if (video_crop_size_initialized_ && ++ (video_crop->region.position.y + video_crop_size_.height() <= desktop_size_.height())) { ++ for (int i = 0; i < video_crop->region.position.y; ++i) { ++ src += srcStride; ++ } ++ } ++ const int xOffset = ++ video_crop_size_initialized_ && (video_crop->region.position.x + video_crop_size_.width() <= ++ desktop_size_.width()) ++ ? video_crop->region.position.x * kBytesPerPixel ++ : 0; ++ const int height = video_crop_size_initialized_ ? video_crop_size_.height() : desktop_size_.height(); ++ for (int i = 0; i < height; ++i) { ++ // Adjust source content based on crop video position if needed ++ src += xOffset; ++ std::memcpy(dst, src, dstStride); ++ // If both sides decided to go with the RGBx format we need to convert it to ++ // BGRx to match color format expected by WebRTC. ++ if (spa_video_format_.format == SPA_VIDEO_FORMAT_RGBx || ++ spa_video_format_.format == SPA_VIDEO_FORMAT_RGBA) { ++ ConvertRGBxToBGRx(dst, dstStride); ++ } ++ src += srcStride - xOffset; ++ dst += dstStride; + } +- RTC_DCHECK(current_frame_ != nullptr); + +- // If both sides decided to go with the RGBx format we need to convert it to +- // BGRx to match color format expected by WebRTC. +- if (spa_video_format_->format == pw_type_->video_format.RGBx) { +- uint8_t* tempFrame = static_cast(malloc(maxSize)); +- std::memcpy(tempFrame, src, maxSize); +- ConvertRGBxToBGRx(tempFrame, maxSize); +- std::memcpy(current_frame_, tempFrame, maxSize); +- free(tempFrame); +- } else { +- std::memcpy(current_frame_, src, maxSize); ++ if (map) { ++ if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) { ++ SyncDmaBuf(spaBuffer->datas[0].fd, DMA_BUF_SYNC_END); ++ } ++ munmap(map, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset); + } + } + +@@ -725,10 +771,7 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal( + g_variant_get(variant, "(u@a{sv})", &stream_id, &options); + RTC_DCHECK(options != nullptr); + +- g_variant_lookup(options, "size", "(ii)", &width, &height); +- +- that->desktop_size_.set(width, height); +- ++ that->pw_stream_node_id_ = stream_id; + g_variant_unref(options); + g_variant_unref(variant); + } +@@ -813,10 +856,15 @@ void BaseCapturerPipeWire::CaptureFrame() { + return; + } + +- std::unique_ptr result(new BasicDesktopFrame(desktop_size_)); ++ DesktopSize frame_size = desktop_size_; ++ if (video_crop_size_initialized_) { ++ frame_size = video_crop_size_; ++ } ++ ++ std::unique_ptr result(new BasicDesktopFrame(frame_size)); + result->CopyPixelsFrom( +- current_frame_, (desktop_size_.width() * kBytesPerPixel), +- DesktopRect::MakeWH(desktop_size_.width(), desktop_size_.height())); ++ current_frame_.get(), (frame_size.width() * kBytesPerPixel), ++ DesktopRect::MakeWH(frame_size.width(), frame_size.height())); + if (!result) { + callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr); + return; +@@ -837,4 +885,22 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) { + return true; + } + ++// static ++std::unique_ptr ++BaseCapturerPipeWire::CreateRawScreenCapturer( ++ const DesktopCaptureOptions& options) { ++ std::unique_ptr capturer = ++ std::make_unique(BaseCapturerPipeWire::CaptureSourceType::kAny); ++ return std::move(capturer);} ++ ++// static ++std::unique_ptr ++BaseCapturerPipeWire::CreateRawWindowCapturer( ++ const DesktopCaptureOptions& options) { ++ ++ std::unique_ptr capturer = ++ std::make_unique(BaseCapturerPipeWire::CaptureSourceType::kAny); ++ return std::move(capturer); ++} ++ + } // namespace webrtc +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +index 56b101acbaa6..de54157d1a2a 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h +@@ -22,17 +22,13 @@ + + namespace webrtc { + +-class PipeWireType { +- public: +- spa_type_media_type media_type; +- spa_type_media_subtype media_subtype; +- spa_type_format_video format_video; +- spa_type_video_format video_format; +-}; +- + class BaseCapturerPipeWire : public DesktopCapturer { + public: +- enum CaptureSourceType { Screen = 1, Window }; ++ enum CaptureSourceType : uint32_t { ++ kScreen = 0b01, ++ kWindow = 0b10, ++ kAny = 0b11 ++ }; + + explicit BaseCapturerPipeWire(CaptureSourceType source_type); + ~BaseCapturerPipeWire() override; +@@ -43,28 +39,32 @@ class BaseCapturerPipeWire : public DesktopCapturer { + bool GetSourceList(SourceList* sources) override; + bool SelectSource(SourceId id) override; + ++ static std::unique_ptr CreateRawScreenCapturer( ++ const DesktopCaptureOptions& options); ++ ++ static std::unique_ptr CreateRawWindowCapturer( ++ const DesktopCaptureOptions& options); ++ + private: + // PipeWire types --> ++ pw_context* pw_context_ = nullptr; + pw_core* pw_core_ = nullptr; +- pw_type* pw_core_type_ = nullptr; + pw_stream* pw_stream_ = nullptr; +- pw_remote* pw_remote_ = nullptr; +- pw_loop* pw_loop_ = nullptr; + pw_thread_loop* pw_main_loop_ = nullptr; +- PipeWireType* pw_type_ = nullptr; + ++ spa_hook spa_core_listener_ = {}; + spa_hook spa_stream_listener_ = {}; +- spa_hook spa_remote_listener_ = {}; + ++ pw_core_events pw_core_events_ = {}; + pw_stream_events pw_stream_events_ = {}; +- pw_remote_events pw_remote_events_ = {}; + +- spa_video_info_raw* spa_video_format_ = nullptr; ++ struct spa_video_info_raw spa_video_format_; + ++ guint32 pw_stream_node_id_ = 0; + gint32 pw_fd_ = -1; + + CaptureSourceType capture_source_type_ = +- BaseCapturerPipeWire::CaptureSourceType::Screen; ++ BaseCapturerPipeWire::CaptureSourceType::kAny; + + // <-- end of PipeWire types + +@@ -78,33 +78,37 @@ class BaseCapturerPipeWire : public DesktopCapturer { + guint sources_request_signal_id_ = 0; + guint start_request_signal_id_ = 0; + ++ bool video_crop_size_initialized_ = false; ++ DesktopSize video_crop_size_;; + DesktopSize desktop_size_ = {}; + DesktopCaptureOptions options_ = {}; + +- uint8_t* current_frame_ = nullptr; ++ std::unique_ptr current_frame_; + Callback* callback_ = nullptr; + + bool portal_init_failed_ = false; + + void InitPortal(); + void InitPipeWire(); +- void InitPipeWireTypes(); + +- void CreateReceivingStream(); ++ pw_stream* CreateReceivingStream(); + void HandleBuffer(pw_buffer* buffer); + + void ConvertRGBxToBGRx(uint8_t* frame, uint32_t size); + +- static void OnStateChanged(void* data, +- pw_remote_state old_state, +- pw_remote_state state, +- const char* error); ++ static void SyncDmaBuf(int fd, uint64_t start_or_end); ++ static void OnCoreError(void *data, ++ uint32_t id, ++ int seq, ++ int res, ++ const char *message); ++ static void OnStreamParamChanged(void *data, ++ uint32_t id, ++ const struct spa_pod *format); + static void OnStreamStateChanged(void* data, + pw_stream_state old_state, + pw_stream_state state, + const char* error_message); +- +- static void OnStreamFormatChanged(void* data, const struct spa_pod* format); + static void OnStreamProcess(void* data); + static void OnNewBuffer(void* data, uint32_t id); + +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc +index 26956fc67dc8..3813d697bb38 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc +@@ -15,7 +15,7 @@ + namespace webrtc { + + ScreenCapturerPipeWire::ScreenCapturerPipeWire() +- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Screen) {} ++ : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kScreen) {} + ScreenCapturerPipeWire::~ScreenCapturerPipeWire() {} + + // static +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc +index 35436475cb4d..c43a1f1a0c4e 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc +@@ -15,7 +15,7 @@ + namespace webrtc { + + WindowCapturerPipeWire::WindowCapturerPipeWire() +- : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Window) {} ++ : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kWindow) {} + WindowCapturerPipeWire::~WindowCapturerPipeWire() {} + + // static +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc +index cf8a9dd0e0db..d27fab8d28d9 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc +@@ -26,7 +26,7 @@ std::unique_ptr DesktopCapturer::CreateRawScreenCapturer( + const DesktopCaptureOptions& options) { + #if defined(WEBRTC_USE_PIPEWIRE) + if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { +- return ScreenCapturerPipeWire::CreateRawScreenCapturer(options); ++ return BaseCapturerPipeWire::CreateRawScreenCapturer(options); + } + #endif // defined(WEBRTC_USE_PIPEWIRE) + +diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc +index 82359e50c2db..bb9724cf7cc2 100644 +--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc ++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc +@@ -26,7 +26,7 @@ std::unique_ptr DesktopCapturer::CreateRawWindowCapturer( + const DesktopCaptureOptions& options) { + #if defined(WEBRTC_USE_PIPEWIRE) + if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { +- return WindowCapturerPipeWire::CreateRawWindowCapturer(options); ++ return BaseCapturerPipeWire::CreateRawWindowCapturer(options); + } + #endif // defined(WEBRTC_USE_PIPEWIRE) + diff --git a/SOURCES/firefox-pipewire.patch b/SOURCES/firefox-pipewire.patch new file mode 100644 index 0000000..7233a73 --- /dev/null +++ b/SOURCES/firefox-pipewire.patch @@ -0,0 +1,63 @@ +diff -up firefox-68.0/config/system-headers.mozbuild.firefox-pipewire firefox-68.0/config/system-headers.mozbuild +--- firefox-68.0/config/system-headers.mozbuild.firefox-pipewire 2019-07-01 22:30:26.000000000 +0200 ++++ firefox-68.0/config/system-headers.mozbuild 2019-07-08 15:26:15.397161627 +0200 +@@ -314,6 +314,7 @@ system_headers = [ + 'Gestalt.h', + 'getopt.h', + 'gio/gio.h', ++ 'gio/gunixfdlist.h', + 'glibconfig.h', + 'glib.h', + 'glib-object.h', +@@ -607,6 +608,7 @@ system_headers = [ + 'Pgenerr.h', + 'PGenErr.h', + 'Ph.h', ++ 'pipewire/pipewire.h', + 'pixman.h', + 'pk11func.h', + 'pk11pqg.h', +diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build.firefox-pipewire firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build +--- firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build.firefox-pipewire 2019-07-01 22:30:33.000000000 +0200 ++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build 2019-07-08 15:26:15.397161627 +0200 +@@ -194,6 +194,28 @@ if CONFIG["OS_TARGET"] == "Linux": + "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc" + ] + ++# PipeWire specific files ++if CONFIG["OS_TARGET"] == "Linux": ++ ++ DEFINES["WEBRTC_USE_PIPEWIRE"] = "1" ++ ++ OS_LIBS += [ ++ "rt", ++ "pipewire-0.2", ++ "glib-2.0", ++ "gio-2.0", ++ "gobject-2.0" ++ ] ++ ++ CXXFLAGS += CONFIG['TK_CFLAGS'] ++ ++ UNIFIED_SOURCES += [ ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc", ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc", ++ "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc" ++ ] ++ ++ + if CONFIG["OS_TARGET"] == "NetBSD": + + DEFINES["USE_X11"] = "1" +diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h.firefox-pipewire firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h +--- firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h.firefox-pipewire 2019-07-08 16:42:13.936254926 +0200 ++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h 2019-07-08 16:42:17.509264974 +0200 +@@ -141,7 +141,7 @@ class DesktopCaptureOptions { + bool disable_effects_ = true; + bool detect_updated_region_ = false; + #if defined(WEBRTC_USE_PIPEWIRE) +- bool allow_pipewire_ = false; ++ bool allow_pipewire_ = true; + #endif + }; + diff --git a/SOURCES/firefox-redhat-default-prefs.js b/SOURCES/firefox-redhat-default-prefs.js new file mode 100644 index 0000000..607a132 --- /dev/null +++ b/SOURCES/firefox-redhat-default-prefs.js @@ -0,0 +1,35 @@ +pref("app.update.auto", false); +pref("app.update.enabled", false); +pref("app.update.autoInstallEnabled", false); +pref("general.smoothScroll", true); +pref("intl.locale.matchOS", true); +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", "http://www.redhat.com"); +pref("startup.homepage_welcome_url", "http://www.redhat.com"); +pref("browser.startup.homepage", "data:text/plain,browser.startup.homepage=file:///usr/share/doc/HTML/index.html"); +pref("geo.wifi.uri", "https://location.services.mozilla.com/v1/geolocate?key=%MOZILLA_API_KEY%"); +pref("media.gmp-gmpopenh264.provider.enabled",false); +pref("media.gmp-gmpopenh264.autoupdate",false); +pref("media.gmp-gmpopenh264.enabled",false); +pref("media.gmp-gmpopenh264.enabled",false); +pref("plugins.notifyMissingFlash", false); +/* See https://bugzilla.redhat.com/show_bug.cgi?id=1226489 */ +pref("browser.display.use_system_colors", false); +pref("layers.use-image-offscreen-surfaces", false); +/* Allow sending credetials to all https:// sites */ +pref("network.negotiate-auth.trusted-uris", "https://"); +pref("security.use_sqldb", false); +/* Use OS settings for UI language */ +pref("intl.locale.requested", ""); +/* See https://bugzilla.redhat.com/show_bug.cgi?id=1672424 */ +pref("storage.nfs_filesystem", true); \ No newline at end of file diff --git a/SOURCES/firefox-rhel6-hugepage.patch b/SOURCES/firefox-rhel6-hugepage.patch new file mode 100644 index 0000000..4855721 --- /dev/null +++ b/SOURCES/firefox-rhel6-hugepage.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.1.0/xpcom/threads/nsThread.cpp.old firefox-68.1.0/xpcom/threads/nsThread.cpp +--- firefox-68.1.0/xpcom/threads/nsThread.cpp.old 2019-09-20 12:17:35.481661390 +0200 ++++ firefox-68.1.0/xpcom/threads/nsThread.cpp 2019-09-20 12:19:14.269180516 +0200 +@@ -556,7 +556,8 @@ void nsThread::InitCommon() { + // kernel report them as separate regions, even when they are adjacent to + // heap memory. This allows us to accurately track the actual memory + // consumption of our allocated stacks. +- madvise(mStackBase, stackSize, MADV_NOHUGEPAGE); ++ // not supported on RHEL6 ++ // madvise(mStackBase, stackSize, MADV_NOHUGEPAGE); + + pthread_attr_destroy(&attr); + #elif defined(XP_WIN) diff --git a/SOURCES/firefox-rhel6-nss-tls1.3.patch b/SOURCES/firefox-rhel6-nss-tls1.3.patch new file mode 100644 index 0000000..2b6e8f7 --- /dev/null +++ b/SOURCES/firefox-rhel6-nss-tls1.3.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp.old firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp +--- firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp.old 2019-10-24 14:20:21.227037984 +0200 ++++ firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp 2019-10-24 14:45:52.769506967 +0200 +@@ -996,6 +996,9 @@ void nsNSSComponent::FillTLSVersionRange + return; + } + ++ // Enable TLS 1.3 as our NSS supports it. ++ supported.max = 0x304; ++ + // Clip the defaults by what NSS actually supports to enable + // working with a system NSS with different ranges. + rangeOut.min = std::max(rangeOut.min, supported.min); diff --git a/SOURCES/firefox-symbolic.svg b/SOURCES/firefox-symbolic.svg new file mode 100644 index 0000000..7a2c73e --- /dev/null +++ b/SOURCES/firefox-symbolic.svg @@ -0,0 +1,30 @@ + + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + diff --git a/SOURCES/firefox.1 b/SOURCES/firefox.1 new file mode 100644 index 0000000..4311322 --- /dev/null +++ b/SOURCES/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\-\-save\-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/SOURCES/firefox.desktop b/SOURCES/firefox.desktop new file mode 100644 index 0000000..f13e600 --- /dev/null +++ b/SOURCES/firefox.desktop @@ -0,0 +1,272 @@ +[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; + +[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 %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]=نْو پرایوٹ وینڈو& +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 + diff --git a/SOURCES/firefox.sh.in b/SOURCES/firefox.sh.in new file mode 100644 index 0000000..a33e812 --- /dev/null +++ b/SOURCES/firefox.sh.in @@ -0,0 +1,280 @@ +#!/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="/usr/lib64" + SECONDARY_LIB_DIR="/usr/lib" + ;; + * ) + MOZ_LIB_DIR="/usr/lib" + SECONDARY_LIB_DIR="/usr/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" + +## +## Set MOZ_GRE_CONF +## +MOZ_GRE_CONF=/etc/gre.d/gre.conf +if [ "$MOZ_LIB_DIR" == "/usr/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="/usr/bin/firefox" + +## +## Set FONTCONFIG_PATH for Xft/fontconfig +## +FONTCONFIG_PATH="/etc/fonts:${MOZILLA_FIVE_HOME}/res/Xft" +export FONTCONFIG_PATH + +## +## 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" + +# Since Firefox 60 the installation of individual langpack cannot be done by +# copying xpi file to the home directory, because the langpack is loaded +# as to the available languages after the language has been decided and +# for the first run it won't be in language according to the locale. +# +# The current workaround is to put all langpacks to the location +# for system wide extensions. So we set MOZ_DISABLE_LANGPACKS=1 for this moment +export MOZ_DISABLE_LANGPACKS=1 +# 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? + /usr/bin/pidof firefox > /dev/null 2>&1 + MOZILLA_DOWN=$? + 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"` + MOZLOCALE=`echo $CURRENT_LOCALE | sed "s|_\([^.]*\).*|-\1|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 + +# Linux version specific environment variables +%RHEL_ENV_VARS% + +# Don't throw "old profile" dialog box. +export MOZ_ALLOW_DOWNGRADE=1 + +# Make sure at-spi-bus is running +if ! dbus-send --session \ + --dest=org.freedesktop.DBus \ + --type=method_call \ + --print-reply \ + /org/freedesktop/DBus \ + org.freedesktop.DBus.ListNames \ + | grep org.a11y.Bus > /dev/null; then + if [ -f "$MOZ_LIB_DIR/firefox/bundled/libexec/at-spi-bus-launcher" ]; then + echo "Starting a11y dbus service..." + $MOZ_LIB_DIR/firefox/bundled/libexec/at-spi-bus-launcher & + else + echo "Running without a11y support!" + fi +fi + +# 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/SOURCES/google-api-key b/SOURCES/google-api-key new file mode 100644 index 0000000..b95d189 --- /dev/null +++ b/SOURCES/google-api-key @@ -0,0 +1 @@ +AIzaSyBPGXa4AYD4FC3HJK7LnIKxm4fDusVuuco diff --git a/SOURCES/gtk3-private-3.22.26-1-files.inc b/SOURCES/gtk3-private-3.22.26-1-files.inc new file mode 100644 index 0000000..8e1e31a --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-files.inc @@ -0,0 +1,54 @@ +%dir %{gtk3_install_path}/bin +%{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits} +%{gtk3_install_path}/bin/gdk-pixbuf-thumbnailer +%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} +%{gtk3_install_path}/bin/glib-compile-schemas +%{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits} +%{gtk3_install_path}/bin/gtk-update-icon-cache +%{gtk3_install_path}/bin/fc-cache + +%{gtk3_install_path}/etc + +%dir %{gtk3_install_path}/%{_lib} +%{gtk3_install_path}/%{_lib}/libatk-1.0.so.* +%{gtk3_install_path}/%{_lib}/libatk-bridge-2.0.so.* +%{gtk3_install_path}/%{_lib}/libatspi.so.* +%{gtk3_install_path}/%{_lib}/libcairo.so.* +%{gtk3_install_path}/%{_lib}/libcairo-gobject.so.* +%{gtk3_install_path}/%{_lib}/libfontconfig.so.* +%{gtk3_install_path}/%{_lib}/libfreetype.so.* +%{gtk3_install_path}/%{_lib}/libgdk-3.so.* +%{gtk3_install_path}/%{_lib}/libgdk_pixbuf-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgio-2.0.so.* +%{gtk3_install_path}/%{_lib}/libglib-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgmodule-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgobject-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgthread-2.0.so.* +%{gtk3_install_path}/%{_lib}/libgtk-3.so.* +%{gtk3_install_path}/%{_lib}/libharfbuzz.so.* +%{gtk3_install_path}/%{_lib}/libpango-1.0.so.* +%{gtk3_install_path}/%{_lib}/libpangocairo-1.0.so.* +%{gtk3_install_path}/%{_lib}/libpangoft2-1.0.so.* +%{gtk3_install_path}/%{_lib}/libpcre.so.* +%{gtk3_install_path}/%{_lib}/librsvg-2.so.* +%dir %{gtk3_install_path}/%{_lib}/cairo +%{gtk3_install_path}/%{_lib}/cairo/cairo-fdr.so.* +%{gtk3_install_path}/%{_lib}/cairo/cairo-sphinx.so.* +%{gtk3_install_path}/%{_lib}/cairo/libcairo-trace.so.* +%{gtk3_install_path}/%{_lib}/gdk-pixbuf-2.0 +%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gdk-pixbuf-2.0/2.10.0/loaders.cache +%{gtk3_install_path}/%{_lib}/gio +%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gio/modules/giomodule.cache +%{gtk3_install_path}/%{_lib}/gtk-3.0 +%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gtk-3.0/3.0.0/immodules.cache + +%{gtk3_install_path}/libexec + +%{gtk3_install_path}/share +%ghost %attr(644, root, root) %{gtk3_install_path}/share/icons/Adwaita/icon-theme.cache +%ghost %attr(644, root, root) %{gtk3_install_path}/share/icons/hicolor/icon-theme.cache +%ghost %attr(644, root, root) %{gtk3_install_path}/share/glib-2.0/schemas/gschemas.compiled + +%{gtk3_install_path}/var +%dir %{gtk3_install_path}/var/cache/fontconfig + diff --git a/SOURCES/gtk3-private-3.22.26-1-post.inc b/SOURCES/gtk3-private-3.22.26-1-post.inc new file mode 100644 index 0000000..04acf06 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-post.inc @@ -0,0 +1,23 @@ +# adwaita-icon-theme +touch --no-create %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || : +touch --no-create %{gtk3_install_path}/share/icons/hicolor &>/dev/null || : +%{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache || : + +# glib2 +%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} %{gtk3_install_path}/%{_lib}/gio/modules + +# gtk3 +%{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache +%{gtk3_install_path}/bin/glib-compile-schemas %{gtk3_install_path}/share/glib-2.0/schemas &> /dev/null || : + +# fontconfig +umask 0022 + +# Force regeneration of all fontconfig cache files +# The check for existance is needed on dual-arch installs (the second +# copy of fontconfig might install the binary instead of the first) +# The HOME setting is to avoid problems if HOME hasn't been reset +# FIXME hardcoded version ! +if [ -x %{gtk3_install_path}/bin/fc-cache ] && %{gtk3_install_path}/bin/fc-cache --version 2>&1 | grep -q 2.10.95 ; then + HOME=/root %{gtk3_install_path}/bin/fc-cache -f +fi diff --git a/SOURCES/gtk3-private-3.22.26-1-posttrans.inc b/SOURCES/gtk3-private-3.22.26-1-posttrans.inc new file mode 100644 index 0000000..8c5f2d7 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-posttrans.inc @@ -0,0 +1,3 @@ +%{gtk3_install_path}/gtk-update-icon-cache %{gtk3_install_path}/share/icons/hicolor &>/dev/null || : +# adwaita +%{gtk3_install_path}/gtk-update-icon-cache %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || : diff --git a/SOURCES/gtk3-private-3.22.26-1-postun.inc b/SOURCES/gtk3-private-3.22.26-1-postun.inc new file mode 100644 index 0000000..3b5df73 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-postun.inc @@ -0,0 +1,27 @@ +# adwaita +if [ $1 -eq 0 ] ; then + touch --no-create %{gtk3_install_path}/share/icons/Adwaita &>/dev/null + touch --no-create %{gtk3_install_path}/share/icons/hicolor &>/dev/null + %{gtk3_install_path}/bin/gtk-update-icon-cache %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || : + %{gtk3_install_path}/bin/gtk-update-icon-cache %{gtk3_install_path}/share/icons/hicolor &>/dev/null || : +fi + +# gdk-pixbuf2 +if [ $1 -gt 0 ]; then + %{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache || : +fi + +# glib2 +[ ! -x %{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} ] || \ +%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} %{gtk3_install_path}/%{_lib}/gio/modules + +# gtk3 +if [ $1 -gt 0 ]; then + %{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache +fi + +if [ $1 -eq 0 ] ; then + rm -rf %{gtk3_install_path}/var/cache/fontconfig/* &>/dev/null || : +fi + +%{gtk3_install_path}/bin/glib-compile-schemas %{gtk3_install_path}/share/glib-2.0/schemas &> /dev/null || : diff --git a/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc b/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc new file mode 100644 index 0000000..f5fa495 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc @@ -0,0 +1,26 @@ +%filter_provides_in %{gtk3_install_path}/%{_lib} +%filter_requires_in %{gtk3_install_path}/%{_lib} + +%filter_from_requires /libgdk-3.*/d +%filter_from_requires /libatk-1.0.so.*/d +%filter_from_requires /libatk-bridge-2.0.so.*/d +%filter_from_requires /libatspi.so.*/d +%filter_from_requires /libcairo.so.*/d +%filter_from_requires /libcairo-gobject.so.*/d +%filter_from_requires /libfontconfig.so.*/d +%filter_from_requires /libfreetype.so.*/d +%filter_from_requires /libgdk-3.so.*/d +%filter_from_requires /libgdk_pixbuf-2.0.so.*/d +%filter_from_requires /libgio-2.0.so.*/d +%filter_from_requires /libglib-2.0.so.*/d +%filter_from_requires /libgmodule-2.0.so.*/d +%filter_from_requires /libgobject-2.0.so.*/d +%filter_from_requires /libgthread-2.0.so.*/d +%filter_from_requires /libgtk-3.so.*/d +%filter_from_requires /libharfbuzz.so.*/d +%filter_from_requires /libpango-1.0.so.*/d +%filter_from_requires /libpangocairo-1.0.so.*/d +%filter_from_requires /libpangoft2-1.0.so.*/d +%filter_from_requires /libpcre.so.*/d + +# Don't forget to call %%filter_setup from the consumer! diff --git a/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc b/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc new file mode 100644 index 0000000..eb54164 --- /dev/null +++ b/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc @@ -0,0 +1,34 @@ +%if "%{name}" == "gtk3-private" + function prepend_buildroot_include_path_to_compiler_flags() { + export CFLAGS="-I%{_buildrootdir}%{gtk3_install_path}/$@ $CFLAGS" \ + export CXXFLAGS="-I%{_buildrootdir}%{gtk3_install_path}/$@ $CXXFLAGS" + } + + prepend_buildroot_include_path_to_compiler_flags include + prepend_buildroot_include_path_to_compiler_flags include/glib-2.0 + prepend_buildroot_include_path_to_compiler_flags include/glib-2.0 + prepend_buildroot_include_path_to_compiler_flags include/gio-unix-2.0 + prepend_buildroot_include_path_to_compiler_flags %{_lib}/glib-2.0/include + prepend_buildroot_include_path_to_compiler_flags include/freetype2 + prepend_buildroot_include_path_to_compiler_flags include/fontconfig + prepend_buildroot_include_path_to_compiler_flags include/harfbuzz + prepend_buildroot_include_path_to_compiler_flags include/gdk-pixbuf-2.0 + prepend_buildroot_include_path_to_compiler_flags include/atk-1.0 + prepend_buildroot_include_path_to_compiler_flags include/at-spi-2.0 + prepend_buildroot_include_path_to_compiler_flags include/at-spi2-atk/2.0 + prepend_buildroot_include_path_to_compiler_flags include/cairo + prepend_buildroot_include_path_to_compiler_flags include/pango-1.0 + prepend_buildroot_include_path_to_compiler_flags include/librsvg-2.0 + prepend_buildroot_include_path_to_compiler_flags include/cairo + prepend_buildroot_include_path_to_compiler_flags include/gtk-3.0 + prepend_buildroot_include_path_to_compiler_flags include/gtk-3.0/unix-print + prepend_buildroot_include_path_to_compiler_flags include/librsvg-2.0 +%else + sed -i 's@%{gtk3_install_path}@%{_buildrootdir}%{gtk3_install_path}@g' %{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig/*.pc +%endif + +export LDFLAGS="-L%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS" +export LDFLAGS="-Wl,-rpath,%{gtk3_install_path}/%{_lib} $LDFLAGS" +export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS" + +export PKG_CONFIG_PATH=%{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig diff --git a/SOURCES/mozilla-1170092.patch b/SOURCES/mozilla-1170092.patch new file mode 100644 index 0000000..5aebd73 --- /dev/null +++ b/SOURCES/mozilla-1170092.patch @@ -0,0 +1,99 @@ +diff -up firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp +--- firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 2020-02-07 01:27:03.000000000 +0100 ++++ firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp 2020-02-24 11:30:32.058044651 +0100 +@@ -246,8 +246,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//pref ++ rv = NS_GetSpecialDirectory(NS_APP_PREFS_SYSTEM_CONFIG_DIR, ++ getter_AddRefs(jsFile)); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ rv = jsFile->AppendNative(NS_LITERAL_CSTRING("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-68.5.0/modules/libpref/Preferences.cpp.1170092 firefox-68.5.0/modules/libpref/Preferences.cpp +--- firefox-68.5.0/modules/libpref/Preferences.cpp.1170092 2020-02-24 11:30:32.059044645 +0100 ++++ firefox-68.5.0/modules/libpref/Preferences.cpp 2020-02-24 11:35:14.613443673 +0100 +@@ -4436,6 +4436,8 @@ static nsresult pref_ReadDefaultPrefs(co + // + // 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; + nsZipFind* findPtr; +diff -up firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp +--- firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092 2020-02-07 01:28:06.000000000 +0100 ++++ firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp 2020-02-24 11:34:27.284704700 +0100 +@@ -61,6 +61,7 @@ + #endif + #ifdef XP_UNIX + # include ++# include "nsIXULAppInfo.h" + #endif + #ifdef XP_IOS + # include "UIKitDirProvider.h" +@@ -524,6 +525,21 @@ nsXREDirProvider::GetFile(const char* aP + } + } + } ++ ++#if defined(XP_UNIX) ++ if (!strcmp(aProperty, NS_APP_PREFS_SYSTEM_CONFIG_DIR)) { ++ nsCString sysConfigDir = NS_LITERAL_CSTRING("/etc/"); ++ nsCOMPtr 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); ++ return NS_NewNativeLocalFile(sysConfigDir, false, aFile); ++ } ++#endif ++ + if (NS_FAILED(rv) || !file) return NS_ERROR_FAILURE; + + if (ensureFilePermissions) { +@@ -880,6 +896,17 @@ nsresult nsXREDirProvider::GetFilesInter + LoadDirIntoArray(mXULAppDir, kAppendPrefDir, directories); + LoadDirsIntoArray(mAppBundleDirectories, kAppendPrefDir, directories); + ++ // Add /etc//pref/ directory if it exists ++ nsCOMPtr systemPrefDir; ++ rv = NS_GetSpecialDirectory(NS_APP_PREFS_SYSTEM_CONFIG_DIR, ++ getter_AddRefs(systemPrefDir)); ++ if (NS_SUCCEEDED(rv)) { ++ rv = systemPrefDir->AppendNative(NS_LITERAL_CSTRING("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-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h +--- firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 2020-02-07 01:27:52.000000000 +0100 ++++ firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h 2020-02-24 11:30:32.059044645 +0100 +@@ -62,6 +62,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/SOURCES/mozilla-1196777.patch b/SOURCES/mozilla-1196777.patch new file mode 100644 index 0000000..7fa1595 --- /dev/null +++ b/SOURCES/mozilla-1196777.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.0/widget/gtk/nsWindow.cpp.1196777 firefox-68.0/widget/gtk/nsWindow.cpp +--- firefox-68.0/widget/gtk/nsWindow.cpp.1196777 2019-05-21 11:29:55.833376744 +0200 ++++ firefox-68.0/widget/gtk/nsWindow.cpp 2019-05-21 12:15:35.446089316 +0200 +@@ -156,7 +156,8 @@ const gint kEvents = + #if GTK_CHECK_VERSION(3, 4, 0) + GDK_SMOOTH_SCROLL_MASK | GDK_TOUCH_MASK | + #endif +- GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK; ++ GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK | ++ GDK_FOCUS_CHANGE_MASK; + + #if !GTK_CHECK_VERSION(3, 22, 0) + typedef enum { diff --git a/SOURCES/mozilla-1603112-accept-lang.patch b/SOURCES/mozilla-1603112-accept-lang.patch new file mode 100644 index 0000000..b67b232 --- /dev/null +++ b/SOURCES/mozilla-1603112-accept-lang.patch @@ -0,0 +1,12 @@ +diff --git a/intl/strres/nsStringBundle.cpp b/intl/strres/nsStringBundle.cpp +--- a/intl/strres/nsStringBundle.cpp ++++ b/intl/strres/nsStringBundle.cpp +@@ -66,7 +66,6 @@ + "chrome://global/locale/commonDialogs.properties", + "chrome://global/locale/css.properties", + "chrome://global/locale/dom/dom.properties", +- "chrome://global/locale/intl.properties", + "chrome://global/locale/layout/HtmlForm.properties", + "chrome://global/locale/layout/htmlparser.properties", + "chrome://global/locale/layout_errors.properties", + diff --git a/SOURCES/mozilla-api-key b/SOURCES/mozilla-api-key new file mode 100644 index 0000000..81877bc --- /dev/null +++ b/SOURCES/mozilla-api-key @@ -0,0 +1 @@ +9008bb7e-1e22-4038-94fe-047dd48ccc0b diff --git a/SOURCES/mozilla-bmo1005535.patch b/SOURCES/mozilla-bmo1005535.patch new file mode 100644 index 0000000..96f6e1a --- /dev/null +++ b/SOURCES/mozilla-bmo1005535.patch @@ -0,0 +1,20 @@ +# HG changeset patch +# User Steve Singer +# Date 1558451540 -7200 +# Tue May 21 17:12:20 2019 +0200 +# Node ID 433beec63e6b5f409683af20a0c1ab137cc7bfad +# Parent 42c99b59a87b904063bad3193f10c51d068d2eac +Bug 1005535 - Get skia GPU building on big endian. + +diff -r 42c99b59a87b -r 433beec63e6b gfx/skia/skia/include/private/GrColor.h +--- a/gfx/skia/skia/include/private/GrColor.h Wed Jun 05 08:48:08 2019 +0200 ++++ b/gfx/skia/skia/include/private/GrColor.h Tue May 21 17:12:20 2019 +0200 +@@ -63,7 +63,7 @@ + * Since premultiplied means that alpha >= color, we construct a color with + * each component==255 and alpha == 0 to be "illegal" + */ +-#define GrColor_ILLEGAL (~(0xFF << GrColor_SHIFT_A)) ++#define GrColor_ILLEGAL ((uint32_t)(~(0xFF << GrColor_SHIFT_A))) + + /** Normalizes and coverts an uint8_t to a float. [0, 255] -> [0.0, 1.0] */ + static inline float GrNormalizeByteToFloat(uint8_t value) { diff --git a/SOURCES/mozilla-bmo1504834-part1.patch b/SOURCES/mozilla-bmo1504834-part1.patch new file mode 100644 index 0000000..cb985bb --- /dev/null +++ b/SOURCES/mozilla-bmo1504834-part1.patch @@ -0,0 +1,81 @@ +# HG changeset patch +# Parent 051b75a600dfbf7503c3485cebfd34d4eb29be96 +Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1504834 + +diff -r 051b75a600df gfx/2d/DrawTargetSkia.cpp +--- a/gfx/2d/DrawTargetSkia.cpp Fri Jul 05 12:42:44 2019 +0200 ++++ b/gfx/2d/DrawTargetSkia.cpp Mon Jul 08 10:59:30 2019 +0200 +@@ -138,8 +138,7 @@ + return surfaceBounds.Intersect(bounds); + } + +-static const int kARGBAlphaOffset = +- SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0; ++static const int kARGBAlphaOffset = 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) { +diff -r 051b75a600df gfx/2d/Types.h +--- a/gfx/2d/Types.h Fri Jul 05 12:42:44 2019 +0200 ++++ b/gfx/2d/Types.h Mon Jul 08 10:59:30 2019 +0200 +@@ -85,15 +85,8 @@ + // 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 + 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 + }; + + static inline int BytesPerPixel(SurfaceFormat aFormat) { +diff -r 051b75a600df gfx/skia/skia/third_party/skcms/skcms.cc +--- a/gfx/skia/skia/third_party/skcms/skcms.cc Fri Jul 05 12:42:44 2019 +0200 ++++ b/gfx/skia/skia/third_party/skcms/skcms.cc Mon Jul 08 10:59:30 2019 +0200 +@@ -17,6 +17,8 @@ + #include + #elif defined(__SSE__) + #include ++#else ++ #define SKCMS_PORTABLE + #endif + + // sizeof(x) will return size_t, which is 32-bit on some machines and 64-bit on others. +@@ -124,20 +126,28 @@ + static uint16_t read_big_u16(const uint8_t* ptr) { + uint16_t be; + memcpy(&be, ptr, sizeof(be)); +-#if defined(_MSC_VER) ++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ++ return be; ++#else ++ #if defined(_MSC_VER) + return _byteswap_ushort(be); +-#else ++ #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) ++#if __BYTE_ORDER == __ORDER_BIG_ENDIAN__ ++ return be; ++#else ++ #if defined(_MSC_VER) + return _byteswap_ulong(be); +-#else ++ #else + return __builtin_bswap32(be); ++ #endif + #endif + } + diff --git a/SOURCES/mozilla-bmo1504834-part2.patch b/SOURCES/mozilla-bmo1504834-part2.patch new file mode 100644 index 0000000..e6e6aa5 --- /dev/null +++ b/SOURCES/mozilla-bmo1504834-part2.patch @@ -0,0 +1,88 @@ +# HG changeset patch +# Parent 36563351309ddbc6c29559ba50a41d005f925abb +Skia does not support big endian. The places to fix are too numerous and upstream (skia, not Mozilla) +has no interest in maintaining big endian. +So here we try to swizzle the input for skia, so that skia always works on LE, and when it comes +out again, we transform back to BE. + +diff -r 36563351309d gfx/2d/ConvolutionFilter.cpp +--- a/gfx/2d/ConvolutionFilter.cpp Mon Sep 09 17:59:28 2019 +0200 ++++ b/gfx/2d/ConvolutionFilter.cpp Tue Sep 10 08:25:13 2019 +0200 +@@ -35,9 +35,38 @@ + return true; + } + ++static void ByteSwapArray(uint8_t *u8Array, int32_t size) { ++ uint32_t *array = reinterpret_cast(u8Array); ++ for (int pxl = 0; pxl < size; ++pxl) { ++ // Use an endian swap to move the bytes, i.e. BGRA -> ARGB. ++ uint32_t rgba = array[pxl]; ++ array[pxl] = NativeEndian::swapToLittleEndian(rgba); ++ } ++} ++ + void ConvolutionFilter::ConvolveHorizontally(const uint8_t* aSrc, uint8_t* aDst, + bool aHasAlpha) { ++#if MOZ_BIG_ENDIAN ++ int outputSize = mFilter->numValues(); ++ ++ // Input size isn't handed in, so we have to calculate it quickly ++ int inputSize = 0; ++ for (int xx = 0; xx < outputSize; ++xx) { ++ // Get the filter that determines the current output pixel. ++ int filterOffset, filterLength; ++ mFilter->FilterForValue(xx, &filterOffset, &filterLength); ++ inputSize = std::max(inputSize, filterOffset + filterLength); ++ } ++ ++ ByteSwapArray((uint8_t*)aSrc, inputSize); ++#endif ++ + SkOpts::convolve_horizontally(aSrc, *mFilter, aDst, aHasAlpha); ++ ++#if MOZ_BIG_ENDIAN ++ ByteSwapArray((uint8_t*)aSrc, inputSize); ++ ByteSwapArray(aDst, outputSize); ++#endif + } + + void ConvolutionFilter::ConvolveVertically(uint8_t* const* aSrc, uint8_t* aDst, +@@ -49,8 +78,26 @@ + int32_t filterLength; + auto filterValues = + mFilter->FilterForValue(aRowIndex, &filterOffset, &filterLength); ++ ++#if MOZ_BIG_ENDIAN ++ for (int filterY = 0; filterY < filterLength; filterY++) { ++ // Skia only knows LE, so we have to swizzle the input ++ ByteSwapArray(aSrc[filterY], aRowSize); ++ } ++#endif ++ + SkOpts::convolve_vertically(filterValues, filterLength, aSrc, aRowSize, aDst, + aHasAlpha); ++ ++#if MOZ_BIG_ENDIAN ++ // After skia is finished, we swizzle back to BE, in case ++ // the input is used again somewhere else ++ for (int filterY = 0; filterY < filterLength; filterY++) { ++ ByteSwapArray(aSrc[filterY], aRowSize); ++ } ++ // The destination array as well ++ ByteSwapArray(aDst, aRowSize); ++#endif + } + + /* ConvolutionFilter::ComputeResizeFactor is derived from Skia's +diff -r 36563351309d gfx/skia/skia/include/core/SkPreConfig.h +--- a/gfx/skia/skia/include/core/SkPreConfig.h Mon Sep 09 17:59:28 2019 +0200 ++++ b/gfx/skia/skia/include/core/SkPreConfig.h Tue Sep 10 08:25:13 2019 +0200 +@@ -73,7 +73,7 @@ + defined(__ppc__) || defined(__hppa) || \ + defined(__PPC__) || defined(__PPC64__) || \ + defined(_MIPSEB) || defined(__ARMEB__) || \ +- defined(__s390__) || \ ++ defined(__s390__) || defined(__s390x__) || \ + (defined(__sh__) && defined(__BIG_ENDIAN__)) || \ + (defined(__ia64) && defined(__BIG_ENDIAN__)) + #define SK_CPU_BENDIAN diff --git a/SOURCES/mozilla-bmo1504834-part3.patch b/SOURCES/mozilla-bmo1504834-part3.patch new file mode 100644 index 0000000..1a498f8 --- /dev/null +++ b/SOURCES/mozilla-bmo1504834-part3.patch @@ -0,0 +1,44 @@ +# HG changeset patch +# Parent aecb4600e5da17443b224c79eee178c1d8e155e3 +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 -r aecb4600e5da gfx/skia/skia/include/private/SkNx.h +--- a/gfx/skia/skia/include/private/SkNx.h Tue Aug 20 09:46:55 2019 +0200 ++++ b/gfx/skia/skia/include/private/SkNx.h Mon Sep 09 10:04:06 2019 +0200 +@@ -238,7 +238,18 @@ + AI SkNx operator*(const SkNx& y) const { return fVal * y.fVal; } + AI SkNx operator/(const SkNx& y) const { return fVal / y.fVal; } + ++ // On Big endian the commented out variant doesn't work, ++ // and honestly, I have no idea why it exists in the first place. ++ // The reason its broken is, I think, that it defaults to the double-variant of ToBits() ++ // which gets a 64-bit integer, and FromBits returns 32-bit, ++ // cutting off the wrong half again. ++ // Overall, I see no reason to have ToBits and FromBits at all (even for floats/doubles). ++ // Still we are only "fixing" this for big endian and leave little endian alone (never touch a running system) ++#ifdef SK_CPU_BENDIAN ++ AI SkNx operator&(const SkNx& y) const { return fVal & y.fVal; } ++#else + AI SkNx operator&(const SkNx& y) const { return FromBits(ToBits(fVal) & ToBits(y.fVal)); } ++#endif + AI SkNx operator|(const SkNx& y) const { return FromBits(ToBits(fVal) | ToBits(y.fVal)); } + AI SkNx operator^(const SkNx& y) const { return FromBits(ToBits(fVal) ^ ToBits(y.fVal)); } + +diff -r aecb4600e5da gfx/skia/skia/src/opts/SkBlitMask_opts.h +--- a/gfx/skia/skia/src/opts/SkBlitMask_opts.h Tue Aug 20 09:46:55 2019 +0200 ++++ b/gfx/skia/skia/src/opts/SkBlitMask_opts.h Mon Sep 09 10:04:06 2019 +0200 +@@ -203,7 +203,13 @@ + // ~~~> + // a = 1*aa + d(1-1*aa) = aa + d(1-aa) + // c = 0*aa + d(1-1*aa) = d(1-aa) ++ ++ // For big endian we have to swap the alpha-mask from 0,0,0,255 to 255,0,0,0 ++#ifdef SK_CPU_BENDIAN ++ return Sk4px(Sk16b(aa) & Sk16b(255,0,0,0, 255,0,0,0, 255,0,0,0, 255,0,0,0)) ++#else + return Sk4px(Sk16b(aa) & Sk16b(0,0,0,255, 0,0,0,255, 0,0,0,255, 0,0,0,255)) ++#endif + + d.approxMulDiv255(aa.inv()); + }; + while (h --> 0) { diff --git a/SOURCES/mozilla-bmo1504834-part4.patch b/SOURCES/mozilla-bmo1504834-part4.patch new file mode 100644 index 0000000..9d2ffc4 --- /dev/null +++ b/SOURCES/mozilla-bmo1504834-part4.patch @@ -0,0 +1,30 @@ +# HG changeset patch +# Parent 46ea866ca3acb8bb5e1709ceb799b9c94f591dec +Problem description: Tab-titles that are too long to fit into a tab get faded out. + On big endian this is broken and instead of fading out, the + tab gets white and the font transparent, leading to an unreadable + tab-title +Solution: This is not a real solution, but a hack. The real solution would have been + to byte-swap the correct buffer, but I could not find it. + So the next best thing is to deactivate the fading-effect. Now all tab-titles + are readable, albeit not as pretty to look at as they could be. +Side-effects: I have not yet found an unwanted side-effect. + +diff -r 46ea866ca3ac -r 6ef20eee3f8f gfx/2d/DrawTargetSkia.cpp +--- a/gfx/2d/DrawTargetSkia.cpp Tue Oct 22 12:27:22 2019 +0200 ++++ b/gfx/2d/DrawTargetSkia.cpp Thu Oct 31 09:11:56 2019 +0100 +@@ -1861,6 +1861,14 @@ + SkCanvas::kPreserveLCDText_SaveLayerFlag | + (aCopyBackground ? SkCanvas::kInitWithPrevious_SaveLayerFlag : 0)); + ++#if MOZ_BIG_ENDIAN ++ // Pushing a layer where an aMask is defined produces wrong output. ++ // We _should_ endian swap the data, but I couldn't find a workable way to do so ++ // Therefore I deactivate those layers in the meantime. ++ // The result is: Tab-titles that are longer than the available space should be faded out. ++ // The fading doesn't work, so we deactivate the fading-effect here. ++ if (!aMask) ++#endif + mCanvas->saveLayer(saveRec); + + SetPermitSubpixelAA(aOpaque); diff --git a/SOURCES/mozilla-bmo1554971.patch b/SOURCES/mozilla-bmo1554971.patch new file mode 100644 index 0000000..ab25c2d --- /dev/null +++ b/SOURCES/mozilla-bmo1554971.patch @@ -0,0 +1,22 @@ +# HG changeset patch +# Parent a25cebecb02d5460b8ad757fe9cb4a9c8d1d7658 +Eliminate startup error message: +JavaScript error: , line 0: Error: Type error for platformInfo value (Error processing arch: Invalid enumeration value "s390x") for runtime.getPlatformInfo. + +Reported here: https://bugzilla.mozilla.org/show_bug.cgi?id=1554971 + +Uncertain if this is causing real problems or not. Also uncertain if the fix actually fixes anything. +No response from upstream yet. + +diff -r a25cebecb02d -r 378b81b00e73 toolkit/components/extensions/schemas/runtime.json +--- a/toolkit/components/extensions/schemas/runtime.json Fri Jul 05 12:42:44 2019 +0200 ++++ b/toolkit/components/extensions/schemas/runtime.json Fri Jul 19 13:19:30 2019 +0200 +@@ -64,7 +64,7 @@ + { + "id": "PlatformArch", + "type": "string", +- "enum": ["arm", "x86-32", "x86-64"], ++ "enum": ["arm", "x86-32", "x86-64", "s390x", "aarch64", "ppc64le"], + "allowedContexts": ["content", "devtools"], + "description": "The machine's processor architecture." + }, diff --git a/SOURCES/mozilla-bmo1602730.patch b/SOURCES/mozilla-bmo1602730.patch new file mode 100644 index 0000000..c11f958 --- /dev/null +++ b/SOURCES/mozilla-bmo1602730.patch @@ -0,0 +1,28 @@ +diff -r 6ef20eee3f8f gfx/layers/basic/BasicCompositor.cpp +--- a/gfx/layers/basic/BasicCompositor.cpp Thu Oct 31 09:11:56 2019 +0100 ++++ b/gfx/layers/basic/BasicCompositor.cpp Wed Dec 11 16:16:09 2019 +0100 +@@ -693,9 +693,13 @@ + + RefPtr sourceMask; + Matrix maskTransform; ++ // Setting an alpha-mask here breaks the URL-bar on big endian (s390x) ++ // if the typed URL is too long for the textbox (automatic scrolling needed) ++#if MOZ_LITTLE_ENDIAN + if (aTransform.Is2D()) { + SetupMask(aEffectChain, dest, offset, sourceMask, maskTransform); + } ++#endif + + CompositionOp blendMode = CompositionOp::OP_OVER; + if (Effect* effect = +diff -r 6ef20eee3f8f gfx/layers/composite/CompositableHost.cpp +--- a/gfx/layers/composite/CompositableHost.cpp Thu Oct 31 09:11:56 2019 +0100 ++++ b/gfx/layers/composite/CompositableHost.cpp Wed Dec 11 16:16:09 2019 +0100 +@@ -91,6 +91,7 @@ + } + MOZ_ASSERT(source); + ++ // Alternatively: Comment out these lines where the alpha-mask is set + RefPtr effect = + new EffectMask(source, source->GetSize(), aTransform); + aEffects.mSecondaryEffects[EffectTypes::MASK] = effect; diff --git a/SOURCES/mozilla-bmo849632.patch b/SOURCES/mozilla-bmo849632.patch new file mode 100644 index 0000000..177fdc3 --- /dev/null +++ b/SOURCES/mozilla-bmo849632.patch @@ -0,0 +1,23 @@ +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 +diff -r 6b017d3e9733 gfx/gl/GLContext.h +--- a/gfx/gl/GLContext.h Mon Sep 09 10:04:05 2019 +0200 ++++ b/gfx/gl/GLContext.h Wed Nov 13 17:13:04 2019 +0100 +@@ -1551,6 +1551,13 @@ + 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/SOURCES/mozilla-nestegg-big-endian.patch b/SOURCES/mozilla-nestegg-big-endian.patch new file mode 100644 index 0000000..de9adbf --- /dev/null +++ b/SOURCES/mozilla-nestegg-big-endian.patch @@ -0,0 +1,38 @@ +# HG changeset patch +# Parent 381102061fccdec40efda75c7423a766f68201ba +Bug-behavior: Youtube-videos using VP9 and opus as audio-codec started loading but did not play +Reason: While parsing the audio-stream, the sampling frequency (short rate) was wrongly parsed by + nestegg, returning 0 all the time. This led to the audio-track reporting that it neither had + valid video nor audio. Which led to an endless-loop in the video state machine. +Solution: Correct parsing of rate in nestegg, which is a float and cuts of bytes. +Link: https://github.com/kinetiknz/nestegg/issues/64 + +diff -r 381102061fcc -r 8da4be020b1e media/libnestegg/src/nestegg.c +--- a/media/libnestegg/src/nestegg.c Tue Aug 13 07:51:27 2019 +0200 ++++ b/media/libnestegg/src/nestegg.c Tue Aug 20 07:59:54 2019 +0200 +@@ -768,7 +768,15 @@ + { + union { + uint64_t u; +- float f; ++ struct { ++#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__ ++ uint32_t _pad; ++ float f; ++#else ++ float f; ++ uint32_t _pad; ++#endif ++ } f; + double d; + } value; + int r; +@@ -780,7 +788,7 @@ + if (r != 1) + return r; + if (length == 4) +- *val = value.f; ++ *val = value.f.f; + else + *val = value.d; + return 1; diff --git a/SOURCES/mozilla-s390-context.patch b/SOURCES/mozilla-s390-context.patch new file mode 100644 index 0000000..55bd7a8 --- /dev/null +++ b/SOURCES/mozilla-s390-context.patch @@ -0,0 +1,36 @@ +# HG changeset patch +# User msirringhaus@suse.de +# Date 1558452408 -7200 +# Tue May 21 17:26:48 2019 +0200 +# Node ID 602e92722e765a3c238d3b96b26c0c8063b5eeb4 +# Parent a3cc550d25e3a04d906f516928cbcbe50efd585e +[mq]: mozilla-s390-context.patch + +diff -r a3cc550d25e3 -r 602e92722e76 js/src/wasm/WasmSignalHandlers.cpp +--- a/js/src/wasm/WasmSignalHandlers.cpp Tue May 21 17:22:06 2019 +0200 ++++ b/js/src/wasm/WasmSignalHandlers.cpp Tue May 21 17:26:48 2019 +0200 +@@ -154,6 +154,10 @@ + # define R01_sig(p) ((p)->uc_mcontext.gp_regs[1]) + # define R32_sig(p) ((p)->uc_mcontext.gp_regs[32]) + # endif ++# if defined(__linux__) && defined(__s390x__) ++# define GR_sig(p,x) ((p)->uc_mcontext.gregs[x]) ++# define PSWa_sig(p) ((p)->uc_mcontext.psw.addr) ++# endif + #elif defined(__NetBSD__) + # define EIP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EIP]) + # define EBP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EBP]) +@@ -385,8 +389,13 @@ + # define PC_sig(p) R32_sig(p) + # define SP_sig(p) R01_sig(p) + # define FP_sig(p) R01_sig(p) ++#elif defined(__s390x__) ++# define PC_sig(p) PSWa_sig(p) ++# define SP_sig(p) GR_sig(p, 15) ++# define FP_sig(p) GR_sig(p, 11) + #endif + ++ + static void SetContextPC(CONTEXT* context, uint8_t* pc) { + #ifdef PC_sig + *reinterpret_cast(&PC_sig(context)) = pc; diff --git a/SOURCES/no-rust-lto.patch b/SOURCES/no-rust-lto.patch new file mode 100644 index 0000000..7d8ae5d --- /dev/null +++ b/SOURCES/no-rust-lto.patch @@ -0,0 +1,12 @@ +diff -up firefox-68.0/config/makefiles/rust.mk.old firefox-68.0/config/makefiles/rust.mk +--- firefox-68.0/config/makefiles/rust.mk.old 2019-06-05 10:33:34.290128660 +0200 ++++ firefox-68.0/config/makefiles/rust.mk 2019-06-05 10:33:59.835052814 +0200 +@@ -47,7 +47,7 @@ cargo_rustc_flags = $(CARGO_RUSTCFLAGS) + ifndef DEVELOPER_OPTIONS + ifndef MOZ_DEBUG_RUST + # Enable link-time optimization for release builds. +-cargo_rustc_flags += -C lto ++#cargo_rustc_flags += -C lto + endif + endif + diff --git a/SOURCES/node-stdout-nonblocking-wrapper b/SOURCES/node-stdout-nonblocking-wrapper new file mode 100755 index 0000000..e36d134 --- /dev/null +++ b/SOURCES/node-stdout-nonblocking-wrapper @@ -0,0 +1,3 @@ +#!/bin/sh +#exec /usr/bin/node "$@" 2>&1 | cat - +exec $MOZ_NODEJS "$@" 2>&1 | cat - diff --git a/SOURCES/nss-build-mozilla-1564499.patch b/SOURCES/nss-build-mozilla-1564499.patch new file mode 100644 index 0000000..9d5bb5c --- /dev/null +++ b/SOURCES/nss-build-mozilla-1564499.patch @@ -0,0 +1,12 @@ +diff -up firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c.old firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c +--- firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c.old 2019-07-26 07:09:02.383303420 +0200 ++++ firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c 2019-07-26 07:09:27.228193798 +0200 +@@ -727,7 +727,7 @@ static inline void + dcbzl(char *array) + { + register char *a asm("r2") = array; +- __asm__ __volatile__("dcbzl %0,r0" ++ __asm__ __volatile__("dcbzl %0,0" + : "=r"(a) + : "0"(a)); + } diff --git a/SOURCES/python-2.7-gcc8-fix.patch b/SOURCES/python-2.7-gcc8-fix.patch new file mode 100644 index 0000000..d4da520 --- /dev/null +++ b/SOURCES/python-2.7-gcc8-fix.patch @@ -0,0 +1,57 @@ +commit 0b91f8a668201fc58fa732b8acc496caedfdbae0 +Author: Florian Weimer +Date: Sun Apr 29 12:18:33 2018 -0700 + + Indicate that _PyGC_Head is only 8-byte aligned. (closes bpo-33374) + + By spec, the "long double" in _PyGC_Head requires the union to always be 16-byte + aligned. However, obmalloc only yields 8-byte alignment. Compilers including GCC + 8 are starting to use alignment information to do store-merging. So, the "long + double" needs to be changed to a simple "double" as was long ago done in Python + 3 by e348c8d154cf6342c79d627ebfe89dfe9de23817. For 2.7, we need to add some + dummy padding to make sure _PyGC_Head stays the same size. + +diff --git a/Include/objimpl.h b/Include/objimpl.h +index 5f28683329..cbf6bc3f87 100644 +--- Python-2.7.13/Include/objimpl.h ++++ Python-2.7.13/Include/objimpl.h +@@ -248,6 +248,20 @@ PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); + /* for source compatibility with 2.2 */ + #define _PyObject_GC_Del PyObject_GC_Del + ++/* ++ * Former over-aligned definition of PyGC_Head, used to compute the size of the ++ * padding for the new version below. ++ */ ++union _gc_head; ++union _gc_head_old { ++ struct { ++ union _gc_head_old *gc_next; ++ union _gc_head_old *gc_prev; ++ Py_ssize_t gc_refs; ++ } gc; ++ long double dummy; ++}; ++ + /* GC information is stored BEFORE the object structure. */ + typedef union _gc_head { + struct { +@@ -255,7 +269,8 @@ typedef union _gc_head { + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; +- long double dummy; /* force worst-case alignment */ ++ double dummy; /* Force at least 8-byte alignment. */ ++ char dummy_padding[sizeof(union _gc_head_old)]; + } PyGC_Head; + + extern PyGC_Head *_PyGC_generation0; +diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst b/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst +new file mode 100644 +index 0000000000..9ec1a605c8 +--- /dev/null ++++ Python-2.7.13/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst +@@ -0,0 +1,3 @@ ++Tweak the definition of PyGC_Head, so compilers do not believe it is always ++16-byte aligned on x86. This prevents crashes with more aggressive ++optimizations present in GCC 8. diff --git a/SOURCES/python-2.7.patch b/SOURCES/python-2.7.patch new file mode 100644 index 0000000..cad1c67 --- /dev/null +++ b/SOURCES/python-2.7.patch @@ -0,0 +1,17 @@ +diff -up Python-2.7.13/configure.build Python-2.7.13/configure +--- Python-2.7.13/configure.build 2019-06-04 13:32:12.772134075 +0200 ++++ Python-2.7.13/configure 2019-06-04 13:32:26.140144601 +0200 +@@ -6018,11 +6018,11 @@ then + # debug builds. + OPT="-g -O0 -Wall $STRICT_PROTO" + else +- OPT="-g $WRAP -O3 -Wall $STRICT_PROTO" ++ OPT="-g $WRAP -O2 -Wall $STRICT_PROTO" + fi + ;; + *) +- OPT="-O3 -Wall $STRICT_PROTO" ++ OPT="-O2 -Wall $STRICT_PROTO" + ;; + esac + case $ac_sys_system in diff --git a/SOURCES/python-encode.patch b/SOURCES/python-encode.patch new file mode 100644 index 0000000..2f3bad9 --- /dev/null +++ b/SOURCES/python-encode.patch @@ -0,0 +1,12 @@ +diff -up firefox-68.0/python/mozbuild/mozbuild/controller/building.py.old firefox-68.0/python/mozbuild/mozbuild/controller/building.py +--- firefox-68.0/python/mozbuild/mozbuild/controller/building.py.old 2019-05-29 10:46:55.403262995 +0200 ++++ firefox-68.0/python/mozbuild/mozbuild/controller/building.py 2019-05-29 10:47:42.691176970 +0200 +@@ -571,7 +571,7 @@ class TerminalLoggingHandler(logging.Han + if self.footer: + self.footer.clear() + +- self.fh.write(msg) ++ self.fh.write(msg.encode("utf-8")) + self.fh.write('\n') + + if self.footer: diff --git a/SOURCES/python-missing-utimensat.patch b/SOURCES/python-missing-utimensat.patch new file mode 100644 index 0000000..d19ecab --- /dev/null +++ b/SOURCES/python-missing-utimensat.patch @@ -0,0 +1,12 @@ +diff -up python3/Python-3.6.8/configure.old python3/Python-3.6.8/configure +--- Python-3.6.8/configure.old 2019-10-01 12:56:35.074551835 +0200 ++++ Python-3.6.8/configure 2019-10-01 12:56:44.240517798 +0200 +@@ -11438,7 +11438,7 @@ for ac_func in alarm accept4 setitimer g + sigaction sigaltstack siginterrupt sigpending sigrelse \ + sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \ + sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ +- truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ ++ truncate uname unlinkat unsetenv utimes waitid waitpid wait3 wait4 \ + wcscoll wcsftime wcsxfrm wmemcmp writev _getpty + do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` diff --git a/SOURCES/rhbz-1173156.patch b/SOURCES/rhbz-1173156.patch new file mode 100644 index 0000000..c35d901 --- /dev/null +++ b/SOURCES/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/SOURCES/rhbz-1821418.patch b/SOURCES/rhbz-1821418.patch new file mode 100644 index 0000000..588084c --- /dev/null +++ b/SOURCES/rhbz-1821418.patch @@ -0,0 +1,37 @@ +diff -up firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp +--- firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 2020-04-03 21:30:08.000000000 +0200 ++++ firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp 2020-04-23 21:15:56.015491502 +0200 +@@ -147,8 +147,12 @@ bool nsAvailableMemoryWatcher::IsVirtual + + /* static */ + bool nsAvailableMemoryWatcher::IsCommitSpaceLow(const MEMORYSTATUSEX& aStat) { +- if ((kLowCommitSpaceThreshold != 0) && +- (aStat.ullAvailPageFile < kLowCommitSpaceThreshold)) { ++ const char* threshold = getenv("MOZ_GC_THRESHOLD"); ++ if (threshold) { ++ kLowCommitSpaceThreshold = atoi(threshold); ++ } ++ ++ if ((kLowCommitSpaceThreshold == 0) || (aStat.ullAvailPageFile < kLowCommitSpaceThreshold)) { + sNumLowCommitSpaceEvents++; + CrashReporter::AnnotateCrashReport( + CrashReporter::Annotation::LowCommitSpaceEvents, +@@ -206,13 +210,16 @@ void nsAvailableMemoryWatcher::AdjustPol + // polling interval accordingly. + NS_IMETHODIMP + nsAvailableMemoryWatcher::Notify(nsITimer* aTimer) { ++ const char* threshold = getenv("MOZ_GC_THRESHOLD"); ++ bool forceLowMem = (threshold && atoi(threshold) == 0); ++ + MEMORYSTATUSEX stat; + stat.dwLength = sizeof(stat); + bool success = GlobalMemoryStatusEx(&stat); + +- if (success) { ++ if (success || forceLowMem) { + bool lowMemory = IsVirtualMemoryLow(stat) || IsCommitSpaceLow(stat) || +- IsPhysicalMemoryLow(stat); ++ IsPhysicalMemoryLow(stat) || forceLowMem; + + if (lowMemory) { + SendMemoryPressureEvent(); diff --git a/SOURCES/rust-network-check.patch b/SOURCES/rust-network-check.patch new file mode 100644 index 0000000..d18f2fe --- /dev/null +++ b/SOURCES/rust-network-check.patch @@ -0,0 +1,105 @@ +diff -up firefox-68.0/config/makefiles/rust.mk.rust-network-check firefox-68.0/config/makefiles/rust.mk +--- firefox-68.0/config/makefiles/rust.mk.rust-network-check 2019-06-06 10:29:18.984737603 +0200 ++++ firefox-68.0/config/makefiles/rust.mk 2019-06-06 11:39:51.581028835 +0200 +@@ -127,7 +127,7 @@ export RUST_BACKTRACE=full + export MOZ_TOPOBJDIR=$(topobjdir) + + target_rust_ltoable := force-cargo-library-build +-target_rust_nonltoable := force-cargo-test-run force-cargo-library-check $(foreach b,build check,force-cargo-program-$(b)) ++target_rust_nonltoable := force-cargo-test-run $(foreach b,build check,force-cargo-program-$(b)) + + $(target_rust_ltoable): RUSTFLAGS:=$(rustflags_override) $(RUSTFLAGS) $(if $(MOZ_LTO_RUST),-Clinker-plugin-lto) + $(target_rust_nonltoable): RUSTFLAGS:=$(rustflags_override) $(RUSTFLAGS) +@@ -238,19 +238,9 @@ force-cargo-library-build: + $(call CARGO_BUILD) --lib $(cargo_target_flag) $(rust_features_flag) -- $(cargo_rustc_flags) + + $(RUST_LIBRARY_FILE): force-cargo-library-build +-# When we are building in --enable-release mode; we add an additional check to confirm +-# that we are not importing any networking-related functions in rust code. This reduces +-# the chance of proxy bypasses originating from rust code. +-ifndef DEVELOPER_OPTIONS +-ifndef MOZ_DEBUG_RUST +-ifeq ($(OS_ARCH), Linux) +- $(call py_action,check_binary,--target --networking $@) +-endif +-endif +-endif + + force-cargo-library-check: +- $(call CARGO_CHECK) --lib $(cargo_target_flag) $(rust_features_flag) ++ @true + else + force-cargo-library-check: + @true +diff -up firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py.rust-network-check firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py +--- firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py.rust-network-check 2019-05-20 18:17:57.000000000 +0200 ++++ firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py 2019-06-06 10:29:18.986737599 +0200 +@@ -250,43 +250,6 @@ def check_mozglue_order(target, binary): + raise RuntimeError('Could not parse readelf output?') + + +-def check_networking(binary): +- retcode = 0 +- networking_functions = set([ +- # socketpair is not concerning; it is restricted to AF_UNIX +- "socket", "connect", "accept", "bind", "listen", +- "getsockname", "getsockopt", "setsockopt", +- "recv", "recvfrom", +- "send", "sendto", +- # We would be concerned by recvmsg and sendmsg; but we believe +- # they are okay as documented in 1376621#c23 +- "gethostbyname", "gethostbyaddr", "gethostent", "sethostent", "endhostent", +- "gethostent_r", "gethostbyname2", "gethostbyaddr_r", "gethostbyname_r", +- "gethostbyname2_r", +- "getaddrinfo", "getservent", "getservbyname", "getservbyport", "setservent", +- "getprotoent", "getprotobyname", "getprotobynumber", "setprotoent", +- "endprotoent"]) +- bad_occurences_names = set() +- +- try: +- for sym in at_least_one(iter_symbols(binary)): +- if sym['addr'] == 0 and sym['name'] in networking_functions: +- bad_occurences_names.add(sym['name']) +- except Empty: +- raise RuntimeError('Could not parse llvm-objdump output?') +- +- basename = os.path.basename(binary) +- if bad_occurences_names: +- s = 'TEST-UNEXPECTED-FAIL | check_networking | {} | Identified {} ' + \ +- 'networking function(s) being imported in the rust static library ({})' +- print(s.format(basename, len(bad_occurences_names), +- ",".join(sorted(bad_occurences_names))), +- file=sys.stderr) +- retcode = 1 +- elif buildconfig.substs.get('MOZ_AUTOMATION'): +- print('TEST-PASS | check_networking | {}'.format(basename)) +- return retcode +- + def checks(target, binary): + # The clang-plugin is built as target but is really a host binary. + # Cheat and pretend we were passed the right argument. +@@ -330,8 +293,6 @@ def main(args): + help='Perform checks for a host binary') + parser.add_argument('--target', action='store_true', + help='Perform checks for a target binary') +- parser.add_argument('--networking', action='store_true', +- help='Perform checks for networking functions') + + parser.add_argument('binary', metavar='PATH', + help='Location of the binary to check') +@@ -343,14 +304,7 @@ def main(args): + file=sys.stderr) + return 1 + +- if options.networking and options.host: +- print('--networking is only valid with --target', +- file=sys.stderr) +- return 1 +- +- if options.networking: +- return check_networking(options.binary) +- elif options.host: ++ if options.host: + return checks(HOST, options.binary) + elif options.target: + return checks(TARGET, options.binary) diff --git a/SPECS/firefox.spec b/SPECS/firefox.spec new file mode 100644 index 0000000..6ab0762 --- /dev/null +++ b/SPECS/firefox.spec @@ -0,0 +1,1643 @@ +# Set for local builds only +%global disable_toolsets 0 + +# Use system nspr/nss? FIXME +%if 0%{?rhel} == 8 +%global system_nss 1 +%endif +%if 0%{?rhel} == 7 +%global system_nss 1 +%endif +%if 0%{?rhel} == 6 +%global system_nss 1 +%endif +%define use_bundled_ffi 0 +%if 0%{?rhel} == 8 +%define use_bundled_python_2 1 +%define use_bundled_python_3 0 +%else +%define use_bundled_python_2 1 +%define use_bundled_python_3 1 +%endif +%define bundle_gnome_extension 0 + +# Don't use system hunspell for now +%global system_hunspell 0 +%global system_sqlite 0 +%if 0%{?rhel} == 8 +%global use_llvmts 0 +%else +%global use_llvmts 1 +%endif + +%if 0%{?rhel} > 6 +%global system_ffi 1 +%else +%global system_ffi 0 +%endif +%if 0%{?rhel} < 8 +%global use_dts 1 +%endif + +%global use_rustts 1 +%global dts_version 8 +%if 0%{?rhel} == 6 +%global dts_version 8 +%endif +%global rust_version 1.31 +%global rust_toolset_version 1.35 +%global llvm_version 7.0 +%if 0%{?rhel} == 8 +%global llvm_version 6.0 +%endif + +%if 0%{?disable_toolsets} +%global use_rustts 0 +%global use_dts 0 +%global use_llvmts 0 +%endif + +# Use system cairo? +%global system_cairo 0 + +# Use system libvpx? +%global system_libvpx 0 + +# Use system libicu? +%global system_libicu 0 + +# Big endian platforms +%ifarch ppc64 s390x +# Javascript Intl API is not supported on big endian platforms right now: +# https://bugzilla.mozilla.org/show_bug.cgi?id=1322212 +%global big_endian 1 +%endif + +# Hardened build? +%global hardened_build 1 + +%global system_jpeg 1 + +%ifarch %{ix86} x86_64 +%global run_tests 0 +%else +%global run_tests 0 +%endif + +# Build as a debug package? +%global debug_build 0 + +%global default_bookmarks_file %{_datadir}/bookmarks/default-bookmarks.html +%global firefox_app_id \{ec8030f7-c20a-464f-9b0e-13a3a9e97384\} +# Minimal required versions +%global cairo_version 1.13.1 +%global freetype_version 2.1.9 +%if %{?system_libvpx} +%global libvpx_version 1.4.0 +%endif + +%global rhel_minor_version -1 +%if "%{?dist}" == "el8" +%global rhel_minor_version 3 +%endif +%if "%{?dist}" == ".el8_2" +%global rhel_minor_version 2 +%endif +%if "%{?dist}" == ".el8_1" +%global rhel_minor_version 1 +%endif +%if "%{?dist}" == ".el8_0" +%global rhel_minor_version 0 +%endif + + +%if 0%{?system_nss} +%global nspr_version 4.21 +# NSS/NSPR quite often ends in build override, so as requirement the version +# we're building against could bring us some broken dependencies from time to time. +#%global nspr_build_version %(pkg-config --silence-errors --modversion nspr 2>/dev/null || echo 65536) +%global nspr_build_version %{nspr_version} +%global nss_version 3.44 +#%global nss_build_version %(pkg-config --silence-errors --modversion nss 2>/dev/null || echo 65536) +%global nss_build_version %{nss_version} +%endif + +%if %{?system_sqlite} +%global sqlite_version 3.8.4.2 +# The actual sqlite version (see #480989): +%global sqlite_build_version %(pkg-config --silence-errors --modversion sqlite3 2>/dev/null || echo 65536) +%endif + +%define bundled_python_version_2 2.7.13 +%define bundled_python_version_3 3.6.8 +%define use_bundled_yasm 1 +%define use_bundled_openssl 0 +%define use_bundled_nodejs 0 +%if 0%{?rhel} < 8 +%define use_bundled_nodejs 1 +%if 0%{?rhel} == 6 +%define use_bundled_openssl 1 +%endif +%endif + +# GTK3 bundling +%define avoid_bundled_rebuild 0 +%if 0%{?rhel} == 6 +%define bundle_gtk3 1 +# In-tree libffi is able to build on following platforms, we have to bundle it for the rest +%ifnarch x86_64 i686 aarch64 +%define use_bundled_ffi 1 +%endif +%endif + +%define gtk3_nvr 3.22.26-1 +%define gtk3_install_path %{mozappdir}/bundled + +%if 0%{?bundle_gtk3} +# 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')} +%endif + + +%global mozappdir %{_libdir}/%{name} +%global mozappdirdev %{_libdir}/%{name}-devel-%{version} +%global langpackdir %{mozappdir}/distribution/extensions +%global tarballdir %{name}-%{version} +%global pre_version esr +#global pre_tag alpha + +%global official_branding 1 +%global build_langpacks 1 + +%global enable_mozilla_crashreporter 0 +%if !%{debug_build} +%ifarch %{ix86} x86_64 +%global enable_mozilla_crashreporter 0 +%endif +%endif + +Summary: Mozilla Firefox Web browser +Name: firefox +Version: 68.9.0 +Release: 1%{?dist} +URL: https://www.mozilla.org/firefox/ +License: MPLv1.1 or GPLv2+ or LGPLv2+ +%if 0%{?rhel} == 7 +ExcludeArch: s390 ppc +%endif +%if 0%{?rhel} == 6 +ExclusiveArch: i686 x86_64 ppc64 s390x +%endif + +Source0: https://hg.mozilla.org/releases/mozilla-release/archive/firefox-%{version}%{?pre_version}.source.tar.xz +%if %{build_langpacks} +Source1: firefox-langpacks-%{version}%{?pre_version}-20200529.tar.xz +%endif +Source2: cbindgen-vendor.tar.xz +Source10: firefox-mozconfig +%if 0%{?centos} +Source12: firefox-centos-default-prefs.js +%else +Source12: firefox-redhat-default-prefs.js +%endif +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 +Source28: node-stdout-nonblocking-wrapper + +Source200: gtk3-private-%{gtk3_nvr}.el6.src.rpm +Source201: gtk3-private-%{gtk3_nvr}-post.inc +Source202: gtk3-private-%{gtk3_nvr}-postun.inc +Source203: gtk3-private-%{gtk3_nvr}-posttrans.inc +Source204: gtk3-private-%{gtk3_nvr}-files.inc +Source205: gtk3-private-%{gtk3_nvr}-setup-flags-env.inc +Source206: gtk3-private-%{gtk3_nvr}-requires-provides-filter.inc +Source301: yasm-1.2.0-3.el5.src.rpm +Source303: libffi-3.0.13-18.el7_3.src.rpm +Source304: nodejs-8.11.4-1.3.fc27.src.rpm +Source305: openssl-1.0.2k-19.6.bundle.el7_7.src.rpm + +#Python +%if 0%{?use_bundled_python_2} +Source100: https://www.python.org/ftp/python/%{bundled_python_version_2}/Python-%{bundled_python_version_2}.tar.xz +%endif +%if 0%{?use_bundled_python_3} +Source101: https://www.python.org/ftp/python/%{bundled_python_version_3}/Python-%{bundled_python_version_3}.tar.xz +%endif +# Build patches +Patch1000: python-2.7.patch +Patch1001: build-ppc64le-inline.patch +Patch1002: python-2.7-gcc8-fix.patch +Patch1003: python-missing-utimensat.patch +Patch1004: build-icu-make.patch +# workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1699374 +Patch1: no-rust-lto.patch +Patch2: rust-network-check.patch +Patch4: build-mozconfig-fix.patch +Patch6: build-nss-version.patch +Patch7: firefox-debugedits-error.patch +Patch8: firefox-dont-check-binary.patch +Patch9: nss-build-mozilla-1564499.patch +Patch26: build-icu-big-endian.patch +Patch41: build-debug-qcms.patch + +# Fedora/RHEL specific patches +Patch215: firefox-enable-addons.patch +Patch219: rhbz-1173156.patch +Patch224: mozilla-1170092.patch +#ARM run-time patch +#Patch226: rhbz-1354671.patch +Patch231: firefox-pipewire.patch +Patch232: firefox-rhel6-hugepage.patch +Patch233: firefox-rhel6-nss-tls1.3.patch +Patch234: rhbz-1821418.patch +Patch235: firefox-pipewire-0-3.patch + +# Upstream patches +Patch402: mozilla-1196777.patch + +#Patch500: debug.patch +Patch501: python-encode.patch +Patch502: mozilla-1603112-accept-lang.patch +Patch503: mozilla-s390-context.patch +Patch504: mozilla-nestegg-big-endian.patch +Patch505: mozilla-bmo1005535.patch +Patch506: mozilla-bmo1504834-part1.patch +Patch507: mozilla-bmo1504834-part2.patch +Patch508: mozilla-bmo1504834-part3.patch +Patch509: mozilla-bmo1504834-part4.patch +Patch510: mozilla-bmo1554971.patch +Patch511: mozilla-bmo1602730.patch +Patch512: mozilla-bmo849632.patch + +# CentOS patches +%if 0%{?centos} +Patch10000: Bug-1238661---fix-mozillaSignalTrampoline-to-work-.patch +Patch10001: Bug-1526653---fix_user_vfp_armv7.patch +%endif + +%if %{?system_nss} +BuildRequires: pkgconfig(nspr) >= %{nspr_version} +BuildRequires: pkgconfig(nss) >= %{nss_version} +BuildRequires: nss-static >= %{nss_version} +%endif +%if %{?system_cairo} +BuildRequires: pkgconfig(cairo) >= %{cairo_version} +%endif +BuildRequires: pkgconfig(libpng) +BuildRequires: xz +BuildRequires: libXt-devel +BuildRequires: mesa-libGL-devel +Requires: liberation-fonts-common +Requires: liberation-sans-fonts +%if %{?system_jpeg} +BuildRequires: libjpeg-devel +%endif +BuildRequires: zip +BuildRequires: bzip2-devel +BuildRequires: pkgconfig(zlib) +BuildRequires: pkgconfig(libIDL-2.0) +BuildRequires: pkgconfig(gtk+-2.0) +BuildRequires: krb5-devel +BuildRequires: pkgconfig(pango) +BuildRequires: pkgconfig(freetype2) >= %{freetype_version} +BuildRequires: pkgconfig(xt) +BuildRequires: pkgconfig(xrender) +%if %{?system_hunspell} +BuildRequires: hunspell-devel +%endif +BuildRequires: pkgconfig(libstartup-notification-1.0) +BuildRequires: pkgconfig(libnotify) +BuildRequires: pkgconfig(dri) +BuildRequires: pkgconfig(libcurl) +BuildRequires: dbus-glib-devel +%if %{?system_libvpx} +BuildRequires: libvpx-devel >= %{libvpx_version} +%endif +BuildRequires: autoconf213 +BuildRequires: pkgconfig(libpulse) +BuildRequires: pkgconfig(gconf-2.0) + +%if 0%{?use_dts} +BuildRequires: devtoolset-%{dts_version}-gcc-c++ +BuildRequires: devtoolset-%{dts_version}-gcc +BuildRequires: devtoolset-%{dts_version}-binutils +BuildRequires: devtoolset-%{dts_version}-libatomic-devel +%if 0%{?use_llvmts} +BuildRequires: llvm-toolset-%{llvm_version} +BuildRequires: llvm-toolset-%{llvm_version}-llvm-devel +%endif +%endif + +BuildRequires: scl-utils + + +%if 0%{?rhel} == 8 +BuildRequires: cargo +BuildRequires: rust >= %{rust_version} +BuildRequires: llvm >= %{llvm_version} +BuildRequires: llvm-devel >= %{llvm_version} +BuildRequires: clang >= %{llvm_version} +BuildRequires: clang-devel >= %{llvm_version} +BuildRequires: rustfmt >= %{rust_version} +BuildRequires: python3 +BuildRequires: nodejs >= 8.11 +%else +%if 0%{?use_rustts} +BuildRequires: rust-toolset-%{rust_toolset_version} +%endif +%if 0%{?use_llvmts} +BuildRequires: llvm-toolset-%{llvm_version} +BuildRequires: llvm-toolset-%{llvm_version}-llvm-devel +%endif +%endif + +%if 0%{?use_bundled_python_2} +# Needed for Python in RHEL6 +BuildRequires: openssl-devel +%endif + +%if 0%{?rhel} == 8 +BuildRequires: pipewire-devel +%endif + +%if 0%{?bundle_gtk3} +BuildRequires: automake +BuildRequires: autoconf +BuildRequires: cups-devel +BuildRequires: dbus-devel +BuildRequires: desktop-file-utils +BuildRequires: expat-devel +BuildRequires: fontpackages-devel +BuildRequires: gamin-devel +BuildRequires: gettext-devel +BuildRequires: git +BuildRequires: intltool +BuildRequires: jasper-devel +BuildRequires: libepoxy-devel +BuildRequires: libcroco-devel +BuildRequires: libffi-devel +BuildRequires: libpng-devel +BuildRequires: libtiff-devel +BuildRequires: libtool +BuildRequires: libxml2-devel +BuildRequires: libX11-devel +BuildRequires: libXcomposite-devel +BuildRequires: libXcursor-devel +BuildRequires: libXinerama-devel +BuildRequires: libXevie-devel +BuildRequires: libXrandr-devel +BuildRequires: libXrender-devel +BuildRequires: libXtst-devel +BuildRequires: mesa-libGL-devel +BuildRequires: mesa-libEGL-devel +BuildRequires: pixman-devel +BuildRequires: rest-devel +BuildRequires: readline-devel +# TODO: We miss that dependency in our bundled gtk3 package. +# As a hotfix we put it here and fix gtk3 in next release. +Requires: mesa-libEGL%{?_isa} +Requires: libcroco%{?_isa} +Requires: mesa-libGL%{?_isa} +Requires: bzip2-libs%{?_isa} +Requires: libXtst%{?_isa} +%else +BuildRequires: gtk3-devel +BuildRequires: glib2-devel +%endif + +Requires: mozilla-filesystem +Requires: p11-kit-trust +%if %{?system_nss} +Requires: nspr >= %{nspr_build_version} +Requires: nss >= %{nss_build_version} +%endif + +BuildRequires: desktop-file-utils +BuildRequires: system-bookmarks +Requires: redhat-indexhtml +%if %{?system_sqlite} +BuildRequires: pkgconfig(sqlite3) >= %{sqlite_version} +Requires: sqlite >= %{sqlite_build_version} +%endif + + +%if %{?run_tests} +BuildRequires: xorg-x11-server-Xvfb +%endif + +%if %{?system_ffi} + %if !%{use_bundled_ffi}0 +BuildRequires: pkgconfig(libffi) + %endif +%endif + +Obsoletes: mozilla <= 37:1.7.13 +Provides: webclient + +%description +Mozilla Firefox is an open-source web browser, designed for standards +compliance, performance and portability. + +%if %{enable_mozilla_crashreporter} +%global moz_debug_prefix %{_prefix}/lib/debug +%global moz_debug_dir %{moz_debug_prefix}%{mozappdir} +%global uname_m %(uname -m) +%global symbols_file_name %{name}-%{version}.en-US.%{_os}-%{uname_m}.crashreporter-symbols.zip +%global symbols_file_path %{moz_debug_dir}/%{symbols_file_name} +%global _find_debuginfo_opts -p %{symbols_file_path} -o debugcrashreporter.list +%global crashreporter_pkg_name mozilla-crashreporter-%{name}-debuginfo +%package -n %{crashreporter_pkg_name} +Summary: Debugging symbols used by Mozilla's crash reporter servers +%description -n %{crashreporter_pkg_name} +This package provides debug information for Firefox, for use by +Mozilla's crash reporter servers. If you are trying to locally +debug %{name}, you want to install %{name}-debuginfo instead. +%files -n %{crashreporter_pkg_name} -f debugcrashreporter.list +%endif + +%if %{run_tests} +%global testsuite_pkg_name mozilla-%{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} +/test_results +%endif + +#--------------------------------------------------------------------- + +%if %{?bundle_gnome_extension} +%package -n firefox-gnome-shell-extension +%global firefox_gnome_shell_addon_name addon-751081-latest.xpi +Summary: Support for managing GNOME Shell Extensions through web browsers +Requires: %{name}%{?_isa} = %{version}-%{release} + +License: GPLv3+ +URL: https://wiki.gnome.org/Projects/GnomeShellIntegrationForChrome +Source2: https://addons.mozilla.org/firefox/downloads/latest/gnome-shell-integration/platform:2/%{firefox_gnome_shell_addon_name} + +Requires: dbus +Requires: gnome-icon-theme +Requires: gnome-shell +Requires: hicolor-icon-theme +Requires: mozilla-filesystem + +%description -n firefox-gnome-shell-extension +Browser extension for Firefox and native host messaging connector that provides +integration with GNOME Shell and the corresponding extensions repository +https://extensions.gnome.org. + +%files -n firefox-gnome-shell-extension +%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi +%endif + +%prep +%if 0%{?use_bundled_python_2} +%setup -q -T -c -n python2 -a 100 +%patch1000 -p0 -b .build +%patch1002 -p0 -b .gcc8 +%endif +%if 0%{?use_bundled_python_3} +%setup -q -T -c -n python3 -a 101 +%if 0%{?rhel} == 6 +%patch1003 -p0 -b .missing-utimensat.patch +%endif +%endif +%setup -q -n %{tarballdir} +# Build patches, can't change backup suffix from default because during build +# there is a compare of config and js/config directories and .orig suffix is +# ignored during this compare. +%patch1 -p1 -b .no-rust-lto +%patch2 -p1 -b .rust-network-check +%patch7 -p1 -b .debugedits-error +%ifarch %{ix86} %{arm} ppc +# binary check fails OOM on 32bit arches +%patch8 -p1 -b .dont-check-binary +%endif +%patch9 -p1 -b .nss-build-mozilla-1564499 + +%if %{?debug_build} +%patch41 -p1 -b .build-debug-qcms +%endif +#%if 0%{?rhel} == 8 +#%endif + +%patch4 -p1 -b .build-mozconfig-fix +%patch6 -p1 -b .nss-version + +# Fedora patches +%patch215 -p1 -b .addons +%patch219 -p1 -b .rhbz-1173156 +%patch224 -p1 -b .1170092 +%if 0%{?rhel} == 8 + %if 0%{?rhel_minor_version} >= 3 +%patch235 -p1 -b .pipewire-0-3 + %else +%patch231 -p1 -b .pipewire + %endif +%endif +%if 0%{?rhel} == 6 +%patch232 -p1 -b .hugepage +%patch233 -p1 -b .rhel6-nss-tls1.3 +%endif +%patch234 -p1 -b .rhbz-1821418 + +#ARM run-time patch +#%ifarch aarch64 +#%patch226 -p1 -b .1354671 +#%endif + +%patch402 -p1 -b .1196777 + +# Patch for big endian platforms only +%if 0%{?big_endian} +%patch26 -p1 -b .icu +%endif + +#%patch500 -p1 -b .debug +%patch501 -p1 -b .python-encode +%patch502 -p1 -b .1603112-accept-lang +%patch503 -p1 -b .mozilla-s390-context +%patch504 -p1 -b .mozilla-nestegg-big-endian +%patch505 -p1 -b .mozilla-bmo1005535 +%patch506 -p1 -b .mozilla-bmo1504834-part1 +%patch507 -p1 -b .mozilla-bmo1504834-part2 +%patch508 -p1 -b .mozilla-bmo1504834-part3 +%patch509 -p1 -b .mozilla-bmo1504834-part4 +%patch510 -p1 -b .mozilla-bmo1554971 +%patch511 -p1 -b .mozilla-bmo1602730 +%patch512 -p1 -b .mozilla-bmo849632 +%patch1001 -p1 -b .ppc64le-inline +%patch1004 -p1 -b .icu-make + +# CentOS patches +%if 0%{?centos} +%patch10000 -p1 -b .mozilla-1238661 +%patch10001 -p1 -b .mozilla-1526653 +%endif + +%{__rm} -f .mozconfig +%{__cp} %{SOURCE10} .mozconfig +%if %{official_branding} +echo "ac_add_options --enable-official-branding" >> .mozconfig +%endif +%{__cp} %{SOURCE24} mozilla-api-key +%{__cp} %{SOURCE27} google-api-key + +%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 %{?system_sqlite} +echo "ac_add_options --enable-system-sqlite" >> .mozconfig +%else +echo "ac_add_options --disable-system-sqlite" >> .mozconfig +%endif + +%if %{?system_cairo} +echo "ac_add_options --enable-system-cairo" >> .mozconfig +%else +echo "ac_add_options --disable-system-cairo" >> .mozconfig +%endif + +%if 0%{?use_bundled_ffi} +echo "ac_add_options --enable-system-ffi" >> .mozconfig +%endif +%if 0%{?system_ffi} +echo "ac_add_options --enable-system-ffi" >> .mozconfig +%endif + +%ifarch %{arm} %{ix86} x86_64 +echo "ac_add_options --disable-elf-hack" >> .mozconfig +%endif + +%if %{?system_hunspell} +echo "ac_add_options --enable-system-hunspell" >> .mozconfig +%else +# not available? +#echo "ac_add_options --disable-system-hunspell" >> .mozconfig +%endif + +%if %{?debug_build} +echo "ac_add_options --enable-debug" >> .mozconfig +echo "ac_add_options --disable-optimize" >> .mozconfig +%else +%global optimize_flags "-g -O2" +%ifarch s390 s390x +%global optimize_flags "-g -O1" +%endif +%ifarch armv7hl +# ARMv7 need that (rhbz#1426850) +%global optimize_flags "-g -O2 -fno-schedule-insns" +%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 + +%ifnarch %{ix86} x86_64 +echo "ac_add_options --disable-webrtc" >> .mozconfig +%endif + +%if !%{enable_mozilla_crashreporter} +echo "ac_add_options --disable-crashreporter" >> .mozconfig +%endif + +%if %{?run_tests} +echo "ac_add_options --enable-tests" >> .mozconfig +%endif + +%if !%{?system_jpeg} +echo "ac_add_options --without-system-jpeg" >> .mozconfig +%else +echo "ac_add_options --with-system-jpeg" >> .mozconfig +%endif + +%if %{?system_libvpx} +echo "ac_add_options --with-system-libvpx" >> .mozconfig +%else +echo "ac_add_options --without-system-libvpx" >> .mozconfig +%endif + +%if %{?system_libicu} +echo "ac_add_options --with-system-icu" >> .mozconfig +%else +echo "ac_add_options --without-system-icu" >> .mozconfig +%endif +%ifarch s390 s390x +echo "ac_add_options --disable-ion" >> .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 + +#--------------------------------------------------------------------- + +%build +set -e +# Hack for missing shell when building in brew on RHEL6 +%if 0%{?rhel} == 6 +export SHELL=/bin/sh +%endif + +%if ! 0%{?avoid_bundled_rebuild} + rm -rf %{_buildrootdir}/* +%endif +export PATH="%{_buildrootdir}/bin:$PATH" + +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 i386 i686 + 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 +} + +function build_bundled_package() { + PACKAGE_RPM=$1 + PACKAGE_FILES=$2 + PACKAGE_SOURCE=$3 + export PACKAGE_DIR="%{_topdir}/RPMS" + + PACKAGE_ALREADY_BUILD=0 + %if %{?avoid_bundled_rebuild} + if ls $PACKAGE_DIR/$PACKAGE_RPM; then + PACKAGE_ALREADY_BUILD=1 + fi + if ls $PACKAGE_DIR/%{_arch}/$PACKAGE_RPM; then + PACKAGE_ALREADY_BUILD=1 + fi + %endif + if [ $PACKAGE_ALREADY_BUILD == 0 ]; then + echo "Rebuilding $PACKAGE_RPM from $PACKAGE_SOURCE"; echo "===============================" + rpmbuild --nodeps --rebuild $PACKAGE_SOURCE + fi + + if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then + # Hack for tps tests + ARCH_STR=%{_arch} + %ifarch i386 i686 + ARCH_STR="i?86" + %endif + export PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR" + fi + pushd $PACKAGE_DIR + + echo "Installing $PACKAGE_DIR/$PACKAGE_RPM"; echo "===============================" + PACKAGE_LIST=$(echo $PACKAGE_DIR/$PACKAGE_RPM | tr " " "\n") + for PACKAGE in $PACKAGE_LIST + do + rpm2cpio $PACKAGE | cpio -iduv + done + + PATH=$PACKAGE_DIR/usr/bin:$PATH + export PATH + LD_LIBRARY_PATH=$PACKAGE_DIR/usr/%{_lib}:$LD_LIBRARY_PATH + export LD_LIBRARY_PATH + + # Clean rpms to avoid including them to package + %if ! 0%{?avoid_bundled_rebuild} + rm -f $PACKAGE_FILES + %endif + + popd +} + +# Build and install local yasm if needed +# ====================================== +%if %{use_bundled_yasm} + build_bundled_package 'yasm-1*.rpm' 'yasm-*.rpm' '%{SOURCE301}' +%endif + +%if 0%{?bundle_gtk3} + %if ! 0%{?avoid_bundled_rebuild} + rpm -ivh %{SOURCE200} + rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' -ba %{_specdir}/gtk3-private.spec + %endif + pushd %{_buildrootdir} + install_rpms_to_current_dir gtk3-private-%{gtk3_nvr}*.rpm + install_rpms_to_current_dir gtk3-private-devel-%{gtk3_nvr}*.rpm + install_rpms_to_current_dir gtk3-private-rpm-scripts-%{gtk3_nvr}*.rpm + popd +%endif + +%if 0%{?bundle_gtk3} +# gtk3-private-3.22.26.el6-1-requires-provides-filter.inc +%include_file %{SOURCE206} +%endif +%if 0%{use_bundled_ffi} + # Install libraries to the predefined location to later add them to the Firefox libraries + rpm -ivh %{SOURCE303} + rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' -ba %{_specdir}/libffi.spec + pushd %{_buildrootdir} + install_rpms_to_current_dir 'libffi*.rpm' + popd + %filter_from_requires /libffi.so.6/d +%endif +%filter_setup + +# If needed build the bundled python 2.7 and 3.6 and put it in the PATH +%if 0%{?use_bundled_python_3} + pushd %{_builddir}/python3/Python-%{bundled_python_version_3} + ./configure --prefix="%{_buildrootdir}" --exec-prefix="%{_buildrootdir}" --libdir="%{_buildrootdir}/lib" --with-pydebug + make %{?_smp_mflags} install V=1 -j1 + cp Tools/scripts/pathfix.py %{_buildrootdir}/bin + popd +%endif +%if 0%{?use_bundled_python_2} + pushd %{_builddir}/python2/Python-%{bundled_python_version_2} + ./configure --prefix="%{_buildrootdir}" --exec-prefix="%{_buildrootdir}" --libdir="%{_buildrootdir}/lib" + make %{?_smp_mflags} install V=1 + popd +%endif + +function replace_prefix() { + FILE_NAME=$1 + PKG_CONFIG_PREFIX=$2 + + cat $FILE_NAME | tail -n +2 > tmp.txt + echo "$PKG_CONFIG_PREFIX" > $FILE_NAME + cat tmp.txt >> $FILE_NAME + rm -rf tmp.txt +} + +# Build and install local openssl if needed +# ========================================= +%if 0%{?use_bundled_openssl} + rpm -ivh %{SOURCE305} + rpmbuild --nodeps -ba %{_specdir}/openssl.spec + pushd %{_buildrootdir} + install_rpms_to_current_dir openssl-1.0.2k*.rpm + install_rpms_to_current_dir openssl-libs-1.0.2k*.rpm + install_rpms_to_current_dir openssl-devel-1.0.2k*.rpm + install_rpms_to_current_dir openssl-static-1.0.2k*.rpm + # openssl is installed to %{_buildrootdir}/usr/lib(64)/... + export PKG_CONFIG_PATH=%{_buildrootdir}/%{_libdir}/pkgconfig/:$PKG_CONFIG_PATH + replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/libcrypto.pc prefix=%{_buildrootdir}/usr + replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/libssl.pc prefix=%{_buildrootdir}/usr + replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/openssl.pc prefix=%{_buildrootdir}/usr + cat %{_buildrootdir}/%{_libdir}/pkgconfig/libcrypto.pc + cat %{_buildrootdir}/%{_libdir}/pkgconfig/libssl.pc + cat %{_buildrootdir}/%{_libdir}/pkgconfig/openssl.pc + pushd %{_rpmdir} + rm -f openssl-*.rpm + popd + popd +%endif + +# We need to disable exit on error temporarily for the following scripts: +set +e +%if 0%{?use_dts} +source scl_source enable devtoolset-%{dts_version} +%endif +%if 0%{?use_rustts} +source scl_source enable rust-toolset-%{rust_toolset_version} +%endif + +# Build and install local node if needed +# ====================================== +%if %{use_bundled_nodejs} + build_bundled_package 'nodejs-8*.rpm' 'nodejs-*.rpm' %{SOURCE304} + export MOZ_NODEJS=$PACKAGE_DIR/usr/bin/node +%else + export MOZ_NODEJS=/usr/bin/node +%endif + +mkdir -p my_rust_vendor +cd my_rust_vendor +%{__tar} xf %{SOURCE2} +cd - +mkdir -p .cargo +cat > .cargo/config < 23 +# Disable null pointer gcc6 optimization in gcc6 (rhbz#1328045) +MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -fno-delete-null-pointer-checks" +%endif +# Use hardened build? +%if %{?hardened_build} +MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -fPIC -Wl,-z,relro -Wl,-z,now" +%endif +%if %{?debug_build} +MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-O2//') +%endif +%ifarch s390 +MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-g/-g1/') +# If MOZ_DEBUG_FLAGS is empty, firefox's build will default it to "-g" which +# overrides the -g1 from line above and breaks building on s390 +# (OOM when linking, rhbz#1238225) +export MOZ_DEBUG_FLAGS=" " +%endif +%ifarch s390 %{arm} ppc aarch64 i686 +MOZ_LINK_FLAGS="-Wl,--no-keep-memory -Wl,--reduce-memory-overheads" +%endif +%ifarch %{arm} +export RUSTFLAGS="-Cdebuginfo=0" +%endif +export CFLAGS=$MOZ_OPT_FLAGS +export CXXFLAGS=$MOZ_OPT_FLAGS +export LDFLAGS=$MOZ_LINK_FLAGS + +export PREFIX='%{_prefix}' +export LIBDIR='%{_libdir}' +export CC=gcc +export CXX=g++ + +MOZ_SMP_FLAGS=-j1 +# More than two build tasks can lead to OOM gcc crash. +%if 0%{?rhel} < 8 +[ -z "$RPM_BUILD_NCPUS" ] && \ + RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`" +[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2 +%else +%ifarch %{ix86} x86_64 ppc ppc64 ppc64le aarch64 +[ -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 +%endif +%endif + +%if 0%{?bundle_gtk3} +# gtk3-private-setup-flags-env.inc +%include_file %{SOURCE205} +%endif + +export MOZ_MAKE_FLAGS="$MOZ_SMP_FLAGS" +export MOZ_SERVICES_SYNC="1" +export STRIP=/bin/true +./mach build -v + +# create debuginfo for crash-stats.mozilla.com +%if %{enable_mozilla_crashreporter} +#cd %{moz_objdir} +make -C objdir buildsymbols +%endif + +%if %{?run_tests} +%if %{?system_nss} +ln -s /usr/bin/certutil objdir/dist/bin/certutil +ln -s /usr/bin/pk12util objdir/dist/bin/pk12util + +%endif +mkdir test_results +./mach --log-no-times check-spidermonkey &> test_results/check-spidermonkey || true +./mach --log-no-times check-spidermonkey &> test_results/check-spidermonkey-2nd-run || true +./mach --log-no-times cppunittest &> test_results/cppunittest || true +xvfb-run ./mach --log-no-times crashtest &> test_results/crashtest || true +./mach --log-no-times gtest &> test_results/gtest || true +xvfb-run ./mach --log-no-times jetpack-test &> test_results/jetpack-test || true +# not working right now ./mach marionette-test &> test_results/marionette-test || true +xvfb-run ./mach --log-no-times mochitest-a11y &> test_results/mochitest-a11y || true +xvfb-run ./mach --log-no-times mochitest-browser &> test_results/mochitest-browser || true +xvfb-run ./mach --log-no-times mochitest-chrome &> test_results/mochitest-chrome || true +xvfb-run ./mach --log-no-times mochitest-devtools &> test_results/mochitest-devtools || true +xvfb-run ./mach --log-no-times mochitest-plain &> test_results/mochitest-plain || true +xvfb-run ./mach --log-no-times reftest &> test_results/reftest || true +xvfb-run ./mach --log-no-times webapprt-test-chrome &> test_results/webapprt-test-chrome || true +xvfb-run ./mach --log-no-times webapprt-test-content &> test_results/webapprt-test-content || true +./mach --log-no-times webidl-parser-test &> test_results/webidl-parser-test || true +xvfb-run ./mach --log-no-times xpcshell-test &> test_results/xpcshell-test || true +%if %{?system_nss} +rm -f objdir/dist/bin/certutil +rm -f objdir/dist/bin/pk12util +%endif + +%endif +#--------------------------------------------------------------------- + +%install +%if 0%{?rhel} == 6 +export SHELL=/bin/sh +%endif + +%if 0%{?bundle_gtk3} +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 i386 i686 + 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 +} + +pushd %{buildroot} +# Install gtk3-private again to the buildroot, but without devel subpackage +install_rpms_to_current_dir gtk3-private-%{gtk3_nvr}*.rpm +install_rpms_to_current_dir gtk3-private-rpm-scripts-%{gtk3_nvr}*.rpm +popd +%endif + +# Install bundled libffi +%if %{use_bundled_ffi} + pushd %{buildroot} + install_rpms_to_current_dir libffi-3*.rpm + popd +%endif + +# set up our default bookmarks +%{__cp} -p %{default_bookmarks_file} objdir/dist/bin/browser/chrome/en-US/locale/browser/bookmarks.html + +# 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} + +# set up the firefox start script +%{__rm} -rf %{buildroot}%{_bindir}/firefox +%{__cat} %{SOURCE21} > %{buildroot}%{_bindir}/firefox +%if 0%{?bundle_gtk3} +sed -i -e 's|%RHEL_ENV_VARS%|export XDG_DATA_DIRS="$MOZ_LIB_DIR/firefox/bundled/share:/usr/share:$XDG_DATA_DIRS"\nexport FONTCONFIG_FILE="$MOZ_LIB_DIR/firefox/bundled/etc/fonts/fonts.conf"|' %{buildroot}%{_bindir}/firefox +%else +sed -i -e 's|%RHEL_ENV_VARS%||' %{buildroot}%{_bindir}/firefox +%endif + +%{__chmod} 755 %{buildroot}%{_bindir}/firefox + +%{__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 + +# Register as an application to be visible in the software center +# +# NOTE: It would be *awesome* if this file was maintained by the upstream +# project, translated and installed into the right place during `make install`. +# +# See http://www.freedesktop.org/software/appstream/docs/ for more details. +# +%{__mkdir_p} %{buildroot}%{_datadir}/appdata +cat > %{buildroot}%{_datadir}/appdata/%{name}.appdata.xml < + + + + firefox.desktop + CC0-1.0 + +

+ 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. +

+ +
+ http://www.mozilla.org/ + + https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/a.png + https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/b.png + https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/c.png + + +
+EOF + +echo > %{name}.lang +%if %{build_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'` + echo "%%lang($language) %{langpackdir}/${extensionID}.xpi" >> %{name}.lang +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 "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 + +# System config dir +%{__mkdir_p} %{buildroot}/%{_sysconfdir}/%{name}/pref + +# System extensions +%{__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 + +# Enable crash reporter for Firefox application +%if %{enable_mozilla_crashreporter} +sed -i -e "s/\[Crash Reporter\]/[Crash Reporter]\nEnabled=1/" %{buildroot}/%{mozappdir}/application.ini +# Add debuginfo for crash-stats.mozilla.com +%{__mkdir_p} %{buildroot}/%{moz_debug_dir} +%{__cp} objdir/dist/%{symbols_file_name} %{buildroot}/%{moz_debug_dir} +%endif + +%if %{run_tests} +# Add debuginfo for crash-stats.mozilla.com +%{__mkdir_p} %{buildroot}/test_results +%{__cp} test_results/* %{buildroot}/test_results +%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 + +%if 0%{?centos} +sed -i -e 's|Red Hat Enterprise|CentOS|' %{buildroot}%{mozappdir}/distribution/distribution.ini +%endif + +# Remove copied libraries to speed up build +rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libmozjs.so +rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libmozalloc.so +rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libxul.so + +%if %{bundle_gnome_extension} +# Gnome extension +%{__mkdir_p} %{buildroot}%{mozappdir}/distribution/extensions +%{__cp} -p %{SOURCE2} %{buildroot}%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi +chmod 644 %{buildroot}%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi +%endif +#--------------------------------------------------------------------- + +%preun +# is it a final removal? +if [ $1 -eq 0 ]; then + %{__rm} -rf %{mozappdir}/components + %{__rm} -rf %{mozappdir}/extensions + %{__rm} -rf %{mozappdir}/plugins + %{__rm} -rf %{langpackdir} +fi + +%clean +rm -rf %{_srcrpmdir}/gtk3-private-%{gtk3_nvr}*.src.rpm +find %{_rpmdir} -name "gtk3-private-*%{gtk3_nvr}*.rpm" -delete +rm -rf %{_srcrpmdir}/libffi*.src.rpm +find %{_rpmdir} -name "libffi*.rpm" -delete +rm -rf %{_srcrpmdir}/openssl*.src.rpm +find %{_rpmdir} -name "openssl*.rpm" -delete + +%post +update-desktop-database &> /dev/null || : +touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : +%if 0%{?bundle_gtk3} +# gtk3-private-post.inc +%include_file %{SOURCE201} +%endif + +%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 || : +fi +%if 0%{?bundle_gtk3} +# gtk3-private-postun.inc +%include_file %{SOURCE202} +%endif + +%posttrans +gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : +%if 0%{?bundle_gtk3} +# gtk3-private-posttrans.inc +%include_file %{SOURCE203} +%endif + +%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}/appdata/*.appdata.xml +%{_datadir}/applications/*.desktop +%dir %{mozappdir} +%doc %{mozappdir}/LICENSE +%{mozappdir}/browser/chrome +%{mozappdir}/browser/chrome.manifest +%{mozappdir}/defaults/preferences/* +%{mozappdir}/browser/defaults/preferences +%{mozappdir}/browser/features/*.xpi +%{mozappdir}/distribution/distribution.ini +%attr(644, root, root) %{mozappdir}/browser/blocklist.xml +%if %{build_langpacks} +%dir %{langpackdir} +%endif +%{mozappdir}/browser/omni.ja +%{mozappdir}/chrome.manifest +%{mozappdir}/run-mozilla.sh +%{mozappdir}/application.ini +%{mozappdir}/pingsender +%exclude %{mozappdir}/removed-files +%{_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 +%if %{enable_mozilla_crashreporter} +%{mozappdir}/crashreporter +%{mozappdir}/crashreporter.ini +%{mozappdir}/minidump-analyzer +%{mozappdir}/Throbber-small.gif +%{mozappdir}/browser/crashreporter-override.ini +%endif +%{mozappdir}/*.so +%{mozappdir}/gtk2/*.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/*.ttf +%if !%{?system_libicu} +#%{mozappdir}/icudt*.dat +%endif +%if !%{?system_nss} +%{mozappdir}/libfreeblpriv3.chk +%{mozappdir}/libnssdbm3.chk +%{mozappdir}/libsoftokn3.chk +%exclude %{mozappdir}/libnssckbi.so +%endif +%if 0%{use_bundled_ffi} +%{mozappdir}/bundled/%{_lib}/libffi.so* +%exclude %{_datadir}/doc/libffi* +%endif + +%if 0%{?bundle_gtk3} +# gtk3-private-files.inc +%include_file %{SOURCE204} +%endif + + +#--------------------------------------------------------------------- + +%changelog +* Fri May 29 2020 Jan Horak +- Update to 68.9.0 build1 +- Added patch for pipewire 0.3 + +* Mon May 11 2020 Jan Horak +- Added s390x specific patches + +* Wed Apr 29 2020 Jan Horak +- Update to 68.8.0 build1 + +* Thu Apr 23 2020 Martin Stransky - 68.7.0-3 +- Added fix for rhbz#1821418 + +* Tue Apr 07 2020 Jan Horak - 68.7.0-2 +- Update to 68.7.0 build3 + +* Mon Apr 6 2020 Jan Horak - 68.6.1-1 +- Update to 68.6.1 ESR + +* Wed Mar 04 2020 Jan Horak +- Update to 68.6.0 build1 + +* Mon Feb 24 2020 Martin Stransky - 68.5.0-3 +- Added fix for rhbz#1805667 +- Enabled mzbz@1170092 - Firefox prefs at /etc + +* Fri Feb 07 2020 Jan Horak +- Update to 68.5.0 build2 + +* Wed Feb 05 2020 Jan Horak +- Update to 68.5.0 build1 + +* Wed Jan 08 2020 Jan Horak +- Update to 68.4.1esr build1 + +* Fri Jan 03 2020 Jan Horak +- Update to 68.4.0esr build1 + +* Wed Dec 18 2019 Jan Horak +- Fix for wrong intl.accept_lang when using non en-us langpack + +* Wed Nov 27 2019 Martin Stransky - 68.3.0-1 +- Update to 68.3.0 ESR + +* Thu Oct 24 2019 Martin Stransky - 68.2.0-4 +- Added patch for TLS 1.3 support. + +* Wed Oct 23 2019 Martin Stransky - 68.2.0-3 +- Rebuild + +* Mon Oct 21 2019 Martin Stransky - 68.2.0-2 +- Rebuild + +* Thu Oct 17 2019 Martin Stransky - 68.2.0-1 +- Update to 68.2.0 ESR + +* Thu Oct 10 2019 Martin Stransky - 68.1.0-6 +- Enable system nss on RHEL6 + +* Thu Sep 5 2019 Jan Horak - 68.1.0-2 +- Enable building langpacks + +* Wed Aug 28 2019 Jan Horak - 68.1.0-1 +- Update to 68.1.0 ESR + +* Mon Aug 5 2019 Martin Stransky - 68.0.1-4 +- Enable system nss + +* Mon Jul 29 2019 Martin Stransky - 68.0.1-3 +- Enable official branding + +* Fri Jul 26 2019 Martin Stransky - 68.0.1-2 +- Enabled PipeWire on RHEL8 + +* Fri Jul 26 2019 Martin Stransky - 68.0.1-1 +- Updated to 68.0.1 ESR + +* Tue Jul 16 2019 Jan Horak - 68.0-0.11 +- Update to 68.0 ESR + +* Tue Jun 25 2019 Martin Stransky - 68.0-0.10 +- Updated to 68.0 alpha 13 +- Enabled second arches + +* Fri Mar 22 2019 Martin Stransky - 68.0-0.1 +- Updated to 68.0 alpha + +* Fri Mar 15 2019 Martin Stransky - 60.6.0-3 +- Added Google API keys (mozbz#1531176) + +* Thu Mar 14 2019 Martin Stransky - 60.6.0-2 +- Update to 60.6.0 ESR (Build 2) + +* Wed Mar 13 2019 Martin Stransky - 60.6.0-1 +- Update to 60.6.0 ESR (Build 1) + +* Wed Feb 13 2019 Jan Horak - 60.5.1-1 +- Update to 60.5.1 ESR + +* Wed Feb 6 2019 Martin Stransky - 60.5.0-3 +- Added fix for rhbz#1672424 - Firefox crashes on NFS drives. + +* Fri Jan 25 2019 Martin Stransky - 60.5.0-2 +- Updated to 60.5.0 ESR build2 + +* Tue Jan 22 2019 Martin Stransky - 60.5.0-1 +- Updated to 60.5.0 ESR build1 + +* Thu Jan 10 2019 Jan Horak - 60.4.0-3 +- Fixing fontconfig warnings (rhbz#1601475) + +* Wed Jan 9 2019 Jan Horak - 60.4.0-2 +- Added pipewire patch from Tomas Popela (rhbz#1664270) + +* Wed Dec 5 2018 Jan Horak - 60.4.0-1 +- Update to 60.4.0 ESR + +* Tue Dec 4 2018 Jan Horak - 60.3.0-2 +- Added firefox-gnome-shell-extension + +* Fri Oct 19 2018 Jan Horak - 60.3.0-1 +- Update to 60.3.0 ESR + +* Wed Oct 10 2018 Jan Horak - 60.2.2-2 +- Added patch for rhbz#1633932 + +* Tue Oct 2 2018 Jan Horak - 60.2.2-1 +- Update to 60.2.2 ESR + +* Mon Sep 24 2018 Jan Horak - 60.2.1-1 +- Update to 60.2.1 ESR + +* Fri Aug 31 2018 Jan Horak - 60.2.0-1 +- Update to 60.2.0 ESR + +* Tue Aug 28 2018 Jan Horak - 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 - 60.1.0-8 +- Fixed homepage and bookmarks (rhbz#1606778) +- Fixed missing file associations in RHEL6 (rhbz#1613565) + +* Thu Jul 12 2018 Jan Horak - 60.1.0-7 +- Run at-spi-bus if not running already (for the bundled gtk3) + +* Mon Jul 9 2018 Jan Horak - 60.1.0-6 +- Fix for missing schemes for bundled gtk3 + +* Mon Jun 25 2018 Martin Stransky - 60.1.0-5 +- Added mesa-libEGL dependency to gtk3/rhel6 + +* Sun Jun 24 2018 Martin Stransky - 60.1.0-4 +- Disabled jemalloc on all second arches + +* Fri Jun 22 2018 Martin Stransky - 60.1.0-3 +- Updated to 60.1.0 ESR build2 + +* Thu Jun 21 2018 Martin Stransky - 60.1.0-2 +- Disabled jemalloc on second arches + +* Wed Jun 20 2018 Martin Stransky - 60.1.0-1 +- Updated to 60.1.0 ESR + +* Wed Jun 13 2018 Jan Horak - 60.0-12 +- Fixing bundled libffi issues +- Readded some requirements + +* Mon Jun 11 2018 Martin Stransky - 60.0-10 +- Added fix for mozilla BZ#1436242 - IPC crashes. + +* Mon Jun 11 2018 Jan Horak - 60.0-9 +- Bundling libffi for the sec-arches +- Added openssl-devel for the Python +- Fixing bundled gtk3 + +* Fri May 18 2018 Martin Stransky - 60.0-8 +- Added fix for mozilla BZ#1458492 + +* Wed May 16 2018 Martin Stransky - 60.0-7 +- Added patch from rhbz#1498561 to fix ppc64(le) crashes. + +* Wed May 16 2018 Martin Stransky - 60.0-6 +- Disabled jemalloc on second arches + +* Sun May 6 2018 Jan Horak - 60.0-4 +- Update to 60.0 ESR + +* Thu Mar 8 2018 Jan Horak - 52.7.0-1 +- Update to 52.7.0 ESR + +* Mon Jan 29 2018 Martin Stransky - 52.6.0-2 +- Build Firefox for desktop arches only (x86_64 and ppc64le) + +* Thu Jan 18 2018 Martin Stransky - 52.6.0-1 +- Update to 52.6.0 ESR + +* Thu Nov 9 2017 Jan Horak - 52.5.0-1 +- Update to 52.5.0 ESR + +* Mon Sep 25 2017 Jan Horak - 52.4.0-1 +- Update to 52.4.0 ESR + +* Thu Aug 3 2017 Jan Horak - 52.3.0-3 +- Update to 52.3.0 ESR (b2) +- Require correct nss version + +* Tue Jun 13 2017 Jan Horak - 52.2.0-1 +- Update to 52.2.0 ESR + +* Wed May 24 2017 Jan Horak - 52.1.2-1 +- Update to 52.1.2 ESR + +* Wed May 24 2017 Jan Horak - 52.0-7 +- Added fix for accept language (rhbz#1454322) + +* Wed Mar 22 2017 Jan Horak - 52.0-6 +- Removing patch required for older NSS from RHEL 7.3 +- Added patch for rhbz#1414564 + +* Fri Mar 17 2017 Martin Stransky - 52.0-5 +- Added fix for mozbz#1348168/CVE-2017-5428 + +* Mon Mar 6 2017 Jan Horak - 52.0-4 +- Update to 52.0 ESR (b4) + +* Thu Mar 2 2017 Martin Stransky - 52.0-3 +- Added fix for rhbz#1423012 - ppc64 gfx crashes + +* Wed Mar 1 2017 Jan Horak - 52.0-2 +- Enable system nss + +* Tue Feb 28 2017 Martin Stransky - 52.0-1 +- Update to 52.0ESR (B1) +- Build RHEL7 package for Gtk3 + +* Mon Feb 27 2017 Martin Stransky - 52.0-0.13 +- Added fix for rhbz#1414535 + +* Tue Feb 21 2017 Jan Horak - 52.0-0.12 +- Update to 52.0b8 + +* Tue Feb 7 2017 Jan Horak - 52.0-0.11 +- Readded addons patch + +* Mon Feb 6 2017 Jan Horak - 52.0-0.10 +- Update to 52.0b3 + +* Tue Jan 31 2017 Jan Horak - 52.0-0.9 +- Update to 52.0b2 + +* Fri Jan 27 2017 Jan Horak - 52.0-0.8 +- Update to 52.0b1 + +* Thu Dec 8 2016 Jan Horak - 52.0-0.5 +- Firefox Aurora 52 testing build