aboutsummaryrefslogtreecommitdiff
path: root/extra/firefox
diff options
context:
space:
mode:
Diffstat (limited to 'extra/firefox')
-rwxr-xr-xextra/firefox/build42
-rw-r--r--extra/firefox/checksums15
-rw-r--r--extra/firefox/depends53
-rw-r--r--extra/firefox/files/mozconfig59
-rw-r--r--extra/firefox/files/policies.json21
-rw-r--r--extra/firefox/files/stab.h71
-rw-r--r--extra/firefox/files/vendor.js619
-rw-r--r--extra/firefox/patches/firefox-71-no-accessibility.patch13
-rw-r--r--extra/firefox/patches/firefox-71-no-dbus.patch425
-rw-r--r--extra/firefox/patches/fix-fortify-system-wrappers.patch13
-rw-r--r--extra/firefox/patches/fix-sandbox-membarrier.patch54
-rw-r--r--extra/firefox/patches/fix-seccomp-bpf.patch14
-rw-r--r--extra/firefox/patches/fix-toolkit.patch90
-rw-r--r--extra/firefox/patches/fix-tools.patch37
-rw-r--r--extra/firefox/patches/fix-webrtc-glibcisms.patch20
-rw-r--r--extra/firefox/patches/mallinfo.patch34
-rw-r--r--extra/firefox/sources15
-rw-r--r--extra/firefox/version1
18 files changed, 1596 insertions, 0 deletions
diff --git a/extra/firefox/build b/extra/firefox/build
new file mode 100755
index 00000000..fb862887
--- /dev/null
+++ b/extra/firefox/build
@@ -0,0 +1,42 @@
+#!/bin/sh -e
+
+# Build autoconf 2.13 for Firefox's sole use.
+# See: https://bugzilla.mozilla.org/show_bug.cgi?id=104642
+(
+ cd autoconf2.13
+
+ ./configure \
+ --prefix="$PWD/../autoconf" \
+ --program-suffix=-2.13
+
+ make
+ make install
+)
+
+export PATH=$PWD/autoconf/bin:$PATH
+export LDFLAGS="$LDFLAGS -Wl,-rpath=/usr/lib/firefox"
+export CC=${CC:-gcc}
+export CXX=${CXX:-g++}
+
+for patch in *.patch; do
+ patch -p1 < "$patch"
+done
+
+# Fix OOM errors.
+cores=$(nproc)
+printf '%s\n' "mk_add_options MOZ_MAKE_FLAGS=\"-j$cores -l$cores\"" >> mozconfig
+
+./mach build
+DESTDIR="$1" ./mach install
+
+rm -rf "$1/usr/include"
+rm -rf "$1/usr/lib/firefox-devel"
+rm -rf "$1/usr/share/idl"
+rm -rf "$1/usr/lib/firefox/gtk2"
+rm -f "$1/usr/lib/firefox/browser/features/fxmonitor@mozilla.org.xpi"
+rm -f "$1/usr/lib/firefox/browser/features/screenshots@mozilla.org.xpi"
+rm -f "$1/usr/lib/firefox/browser/features/webcompat-reporter@mozilla.org.xpi"
+rm -f "$1/usr/lib/firefox/browser/features/webcompat@mozilla.org.xpi"
+
+install -D vendor.js "$1/usr/lib/firefox/browser/defaults/preferences/vendor.js"
+install -D policies.json "$1/usr/lib/firefox/distribution/policies.json"
diff --git a/extra/firefox/checksums b/extra/firefox/checksums
new file mode 100644
index 00000000..30128dc0
--- /dev/null
+++ b/extra/firefox/checksums
@@ -0,0 +1,15 @@
+e67c448f9e82a19c737a72f9af1ccd325ba9e86fcbb1cd6839e6eda37d0f5410 firefox-71.0.source.tar.xz
+f0611136bee505811e9ca11ca7ac188ef5323a8e2ef19cffd3edb3cf08fd791e autoconf-2.13.tar.gz
+b5e70b12cc9dd18fffd7924a7d3a2e11574136fe0764359d08eba0755f1c5d4c mozconfig
+960d82bbfdc88c95f5cb4f2e1c1bf23dae7519b3b7203914d7b3ddbff1ba4c28 stab.h
+cfc7d5006a3381e1b04f642b518317e19790ee31d23757274fdfeaba65c98b0c vendor.js
+f4ce7ee2485256b3f8c2bc467445f14b4730a7b895b17de7a21711d78bcfedea policies.json
+315880530f09175788dfa48a1915bfa1e190bfd3e267988b9100cb93006c808c fix-fortify-system-wrappers.patch
+418a2a9f80c41ee004cb640968617cab283b99f3d109aaf6180b0088d60c84b0 fix-sandbox-membarrier.patch
+14f281ee323aa682e04479019171bde243ac6227820856aa03b162179b14bfd9 fix-seccomp-bpf.patch
+b19aaae7fc45db643f8d2540d96919c745ea341e36d9aea2df40e3e90eb951f0 fix-toolkit.patch
+e24f71a6a0d8d4637b2081780c66b01be4eeb4dd496031270d0ae0b898be94d2 fix-tools.patch
+5e0fcfde375837074baad21a8ab26aa442a7940617ebd074a6b238a48f2ceb63 fix-webrtc-glibcisms.patch
+1d4a8f110d34da478f5597727eda9acacebd443dd86cce5bb64f898c01feabce mallinfo.patch
+49b1c589bc3248fa6389c8b9ff9316c5c5f10cb7868436c9c47cab888bdc8df6 firefox-71-no-dbus.patch
+b050ee807c000f26d09ff0c3e79f0149f195d802efa92b8740a75e7f07267064 firefox-71-no-accessibility.patch
diff --git a/extra/firefox/depends b/extra/firefox/depends
new file mode 100644
index 00000000..7b3a39b9
--- /dev/null
+++ b/extra/firefox/depends
@@ -0,0 +1,53 @@
+alsa-lib
+atk
+bzip2
+cairo
+cbindgen make
+clang make
+expat
+ffmpeg
+fontconfig
+freetype-harfbuzz
+fribidi
+gdk-pixbuf
+glib
+gtk+2 make
+gtk+3
+hicolor-icon-theme
+libICE
+libSM
+libX11
+libXau
+libXcomposite
+libXcursor
+libXdamage
+libXext
+libXfixes
+libXi
+libXinerama
+libXrandr
+libXrender
+libXt
+libXxf86vm
+libdrm
+libepoxy
+libffi
+libjpeg-turbo
+libpng
+libvpx
+libxcb
+libxshmfence
+llvm make
+mesa
+nasm make
+nodejs make
+pango
+perl make
+pixman
+python make
+python2 make
+rust make
+util-linux
+yasm make
+zip make
+zlib
diff --git a/extra/firefox/files/mozconfig b/extra/firefox/files/mozconfig
new file mode 100644
index 00000000..fbfc81f5
--- /dev/null
+++ b/extra/firefox/files/mozconfig
@@ -0,0 +1,59 @@
+ac_add_options --prefix=/usr
+ac_add_options --libdir=/usr/lib
+
+ac_add_options --enable-official-branding
+ac_add_options --enable-optimize="$CFLAGS"
+ac_add_options --enable-install-strip
+ac_add_options --enable-strip
+
+ac_add_options --without-system-nspr
+ac_add_options --without-system-nss
+ac_add_options --with-system-jpeg
+ac_add_options --with-system-zlib
+ac_add_options --with-system-bz2
+ac_add_options --with-system-png
+
+# System 'libvpx' is too new.
+ac_add_options --without-system-libvpx
+
+ac_add_options --with-system-pixman
+ac_add_options --with-system-ffi
+
+ac_add_options --disable-gconf
+ac_add_options --disable-profiling
+ac_add_options --disable-accessibility
+ac_add_options --disable-tests
+ac_add_options --disable-system-extension-dirs
+ac_add_options --disable-parental-controls
+ac_add_options --disable-debug-symbols
+ac_add_options --disable-callgrind
+ac_add_options --disable-vtune
+
+# Settings for musl.
+ac_add_options --disable-elf-hack
+ac_add_options --disable-gold
+ac_add_options --disable-jemalloc
+ac_add_options --enable-release
+
+# ALSA/PulseAudio (removed in 70 (still present in 71b4(?!))
+ac_add_options --disable-pulseaudio
+ac_add_options --enable-alsa
+
+ac_add_options --disable-startup-notification
+
+# Respect the user.
+ac_add_options MOZ_SERVICES_METRICS=
+ac_add_options MOZ_PAY=
+ac_add_options MOZ_SERVICES_HEALTHREPORTER=
+ac_add_options MOZ_SERVICES_FXACCOUNTS=
+ac_add_options MOZ_SERVICES_METRICS=
+ac_add_options MOZ_DATA_REPORTING=
+ac_add_options MOZ_DEVICES=
+ac_add_options MOZ_REQUIRE_SIGNING=
+ac_add_options MOZ_TELEMETRY_REPORTING=
+ac_add_options --disable-crashreporter
+ac_add_options --disable-updater
+ac_add_options --disable-dbus
+ac_add_options --disable-eme
+ac_add_options --disable-necko-wifi
+ac_add_options --disable-webrtc
diff --git a/extra/firefox/files/policies.json b/extra/firefox/files/policies.json
new file mode 100644
index 00000000..f918c5b5
--- /dev/null
+++ b/extra/firefox/files/policies.json
@@ -0,0 +1,21 @@
+{
+ "policies": {
+ "DisableAppUpdate": true,
+ "DisableFirefoxStudies": true,
+ "DisablePocket": true,
+ "DisableTelemetry": true,
+ "DontCheckDefaultBrowser": true,
+ "DisableFeedbackCommands": true,
+ "DisableFirefoxAccounts": true,
+ "DisableFirefoxScreenshots": true,
+ "DisableFirefoxStudies": true,
+ "DisableMasterPasswordCreation": true,
+ "DisableSetDesktopBackground": true,
+ "DisableSystemAddonUpdate": true,
+ "DontCheckDefaultBrowser": true,
+ "ExtensionUpdate": false,
+ "NetworkPrediction": false,
+ "OverridePostUpdatePage": "",
+ "CaptivePortal": false
+ }
+}
diff --git a/extra/firefox/files/stab.h b/extra/firefox/files/stab.h
new file mode 100644
index 00000000..6f70af39
--- /dev/null
+++ b/extra/firefox/files/stab.h
@@ -0,0 +1,71 @@
+/* $OpenBSD: stab.h,v 1.3 2003/06/02 19:34:12 millert Exp $ */
+/* $NetBSD: stab.h,v 1.4 1994/10/26 00:56:25 cgd Exp $ */
+
+/*-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)stab.h 5.2 (Berkeley) 4/4/91
+ */
+
+#ifndef _STAB_H_
+#define _STAB_H_
+
+/*
+ * The following are symbols used by various debuggers and by the Pascal
+ * compiler. Each of them must have one (or more) of the bits defined by
+ * the N_STAB mask set.
+ */
+
+#define N_GSYM 0x20 /* global symbol */
+#define N_FNAME 0x22 /* F77 function name */
+#define N_FUN 0x24 /* procedure name */
+#define N_STSYM 0x26 /* data segment variable */
+#define N_LCSYM 0x28 /* bss segment variable */
+#define N_MAIN 0x2a /* main function name */
+#define N_PC 0x30 /* global Pascal symbol */
+#define N_RSYM 0x40 /* register variable */
+#define N_SLINE 0x44 /* text segment line number */
+#define N_DSLINE 0x46 /* data segment line number */
+#define N_BSLINE 0x48 /* bss segment line number */
+#define N_SSYM 0x60 /* structure/union element */
+#define N_SO 0x64 /* main source file name */
+#define N_LSYM 0x80 /* stack variable */
+#define N_BINCL 0x82 /* include file beginning */
+#define N_SOL 0x84 /* included source file name */
+#define N_PSYM 0xa0 /* parameter variable */
+#define N_EINCL 0xa2 /* include file end */
+#define N_ENTRY 0xa4 /* alternate entry point */
+#define N_LBRAC 0xc0 /* left bracket */
+#define N_EXCL 0xc2 /* deleted include file */
+#define N_RBRAC 0xe0 /* right bracket */
+#define N_BCOMM 0xe2 /* begin common */
+#define N_ECOMM 0xe4 /* end common */
+#define N_ECOML 0xe8 /* end common (local name) */
+#define N_LENG 0xfe /* length of preceding entry */
+
+#endif /* !_STAB_H_ */
diff --git a/extra/firefox/files/vendor.js b/extra/firefox/files/vendor.js
new file mode 100644
index 00000000..65bc0d95
--- /dev/null
+++ b/extra/firefox/files/vendor.js
@@ -0,0 +1,619 @@
+// KISS' vendor.js.
+//
+// Sources:
+// - GNU IceCat,
+// - OpenBSD,
+// - GHacks user.js
+// - pyllyukko/user.js
+// - anarcat/firefox-tmp
+// - Debian
+
+//
+// STARTUP
+//
+
+pref("browser.newtab.preload", false);
+pref("browser.newtabpage.directory.ping", "");
+pref("browser.newtabpage.directory.source", "data:application/json,{}");
+pref("browser.newtabpage.enabled", false);
+pref("browser.newtabpage.enhanced", false);
+pref("browser.newtabpage.introShown", false);
+pref("browser.newtabpage.activity-stream.feeds.telemetry", false);
+pref("browser.newtabpage.activity-stream.telemetry", false);
+pref("browser.newtabpage.activity-stream.telemetry.ping.endpoint", "");
+pref("browser.newtabpage.activity-stream.telemetry.ut.events", false);
+pref("browser.newtabpage.activity-stream.telemetry.structuredIngestion", false);
+pref("browser.newtabpage.activity-stream.feeds.snippets", false);
+pref("browser.newtabpage.activity-stream.asrouter.providers.snippets", "");
+pref("browser.newtabpage.activity-stream.feeds.section.topstories", false);
+pref("browser.newtabpage.activity-stream.section.highlights.includePocket", false);
+pref("browser.newtabpage.activity-stream.showSponsored", false);
+pref("browser.newtabpage.activity-stream.feeds.discoverystreamfeed", false);
+
+//
+// GEO
+//
+
+pref("geo.enabled", false);
+pref("geo.provider.use_gpsd", false);
+pref("geo.wifi.uri", "");
+pref("browser.search.geoip.url", "");
+pref("browser.search.geoSpecificDefaults", false);
+pref("browser.search.geoSpecificDefaults.url", "");
+
+//
+// LANGUAGE
+//
+
+pref("intl.accept_languages", "en-US, en");
+pref("javascript.use_us_english_locale", true);
+pref("intl.charset.fallback.override", "windows-1252");
+
+//
+// SILENT FIREFOX
+//
+
+pref("app.update.auto", false);
+pref("app.update.enabled", false);
+pref("browser.newtabbage.enabled", false);
+pref("browser.search.update", false);
+pref("extensions.getAddons.showPane", false);
+pref("extensions.htmlaboutaddons.recommendations.enabled", false);
+pref("toolkit.telemetry.unified", false);
+pref("toolkit.telemetry.server", "data:,");
+pref("toolkit.telemetry.archive.enabled", false);
+pref("toolkit.telemetry.newProfilePing.enabled", false);
+pref("toolkit.telemetry.shutdownPingSender.enabled", false);
+pref("toolkit.telemetry.updatePing.enabled", false);
+pref("toolkit.telemetry.bhrPing.enabled", false);
+pref("toolkit.telemetry.firstShutdownPing.enabled", false);
+pref("toolkit.telemetry.hybridContent.enabled", false);
+pref("toolkit.telemetry.coverage.opt-out", true);
+pref("toolkit.telemetry.shutdownPingSender.enabledFirstSession", false);
+pref("toolkit.telemetry.server_owner", "");
+pref("toolkit.telemetry.geckoview.streaming", false);
+pref("toolkit.telemetry.ecosystemtelemetry.enabled", false);
+pref("toolkit.telemetry.cachedClientID", "");
+pref("toolkit.telemetry.enabled", false);
+pref("toolkit.telemetry.rejected", true);
+pref("toolkit.telemetry.server", "");
+pref("toolkit.telemetry.unifiedIsOptIn", false);
+pref("toolkit.telemetry.prompted", 2);
+pref("security.protectionspopup.recordEventTelemetry", false);
+pref("security.identitypopup.recordEventTelemetry", false);
+pref("privacy.trackingprotection.origin_telemetry.enabled", false);
+pref("privacy.trackingprotection.pbmode.enabled", false);
+pref("permissions.eventTelemetry.enabled", false);
+pref("browser.urlbar.eventTelemetry.enabled", false);
+pref("toolkit.coverage.opt-out", true);
+pref("toolkit.coverage.endpoint.base", "");
+pref("datareporting.healthreport.uploadEnabled", false);
+pref("datareporting.policy.dataSubmissionEnabled", false);
+pref("datareporting.healthreport.about.reportUrl", "127.0.0.1");
+pref("datareporting.healthreport.documentServerURI", "127.0.0.1");
+pref("datareporting.policy.dataSubmissionPolicyBypassNotification", true);
+pref("datareporting.policy.firstRunURL", "");
+pref("startup.homepage_welcome_url.additional", "");
+pref("browser.startup.firstrunSkipsHomepage", true);
+pref("healthreport.uploadEnabled", false);
+pref("social.toast-notifications.enabled", false);
+pref("datareporting.healthreport.service.enabled", false);
+pref("browser.slowStartup.notificationDisabled", true);
+pref("network.http.sendRefererHeader", 2);
+pref("network.http.referer.spoofSource", false);
+pref("app.shield.optoutstudies.enabled", false);
+pref("extensions.shield-recipe-client.enabled", false);
+pref("browser.discovery.enabled", false);
+pref("breakpad.reportURL", "");
+pref("browser.tabs.crashReporting.sendReport", false);
+pref("browser.crashReports.unsubmittedCheck.enabled", false);
+pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false);
+pref("captivedetect.canonicalURL", "");
+pref("network.captive-portal-service.enabled", false);
+pref("network.connectivity-service.enabled", false);
+pref("extensions.blocklist.enabled", false);
+pref("privacy.announcements.enabled", false);
+pref("browser.snippets.enabled", false);
+pref("browser.snippets.syncPromo.enabled", false);
+pref("browser.snippets.geoUrl", "http://127.0.0.1/");
+pref("browser.snippets.updateUrl", "http://127.0.0.1/");
+pref("browser.snippets.statsUrl", "http://127.0.0.1/");
+pref("datareporting.policy.firstRunTime", 0);
+pref("datareporting.policy.dataSubmissionPolicyVersion", 2);
+pref("browser.webapps.checkForUpdates", 0);
+pref("browser.webapps.updateCheckUrl", "http://127.0.0.1/");
+pref("dom.flyweb.enabled", false);
+pref("services.sync.autoconnect", false);
+pref("services.sync.engine.addons", false);
+pref("services.sync.engine.bookmarks", false);
+pref("services.sync.engine.history", false);
+pref("services.sync.engine.passwords", false);
+pref("services.sync.engine.prefs", false);
+pref("services.sync.engine.tabs", false);
+pref("extensions.webservice.discoverURL", "");
+pref("browser.shell.checkDefaultBrowser", false);
+pref("shell.checkDefaultClient", false);
+pref("browser.newtabpage.directory.source", 'data:application/json,{}');
+pref("browser.urlbar.suggest.searches", false);
+pref("geo.wifi.scan", false);
+pref("dom.push.connection.enabled", false);
+pref("extensions.update.url", "");
+pref("extensions.update.background.url", "");
+pref("extensions.blocklist.detailsURL", "");
+pref("extensions.blocklist.itemURL", "");
+pref("extensions.blocklist.url", "");
+pref("extensions.hotfix.url", "");
+pref("extensions.getAddons.get.url", "");
+pref("extensions.getAddons.getWithPerformance.url", "");
+pref("extensions.getAddons.search.browseURL", "");
+pref("services.settings.server", "");
+pref("datareporting.healthreport.documentServerURI", "");
+pref("general.useragent.updates.enabled", false);
+pref("general.useragent.updates.url", "");
+pref("identity.fxaccounts.auth.uri", "");
+pref("identity.fxaccounts.remote.root", "");
+pref("identity.fxaccounts.skipDeviceRegistration", true);
+pref("browser.translation.bing.authURL", "");
+pref("browser.translation.bing.translateArrayURL", "");
+pref("browser.translation.yandex.translateURLOverride", "");
+pref("browser.translation.engine", "bing");
+pref("browser.aboutHomeSnippets.updateUrl", "nonexistent://test");
+pref("browser.newtabpage.activity-stream.default.sites", "");
+pref("browser.newtabpage.activity-stream.tippyTop.service.endpoint", "");
+pref("browser.uitour.pinnedTabUrl", "");
+pref("browser.uitour.url", "");
+pref("browser.search.isUS", true);
+pref("browser.search.countryCode", "US");
+pref("browser.ping-centre.staging.endpoint", "");
+pref("browser.ping-centre.production.endpoint", "");
+pref("browser.contentblocking.report.monitor.sign_in_url", "");
+pref("browser.contentblocking.report.monitor.url", "");
+pref("identity.fxaccounts.service.monitorLoginUrl", "");
+pref("network.trr.resolvers", "");
+pref("network.trr.uri", "");
+pref("security.certerrors.mitm.priming.endpoint", "");
+pref("signon.management.page.breachAlertUrl", "");
+pref("network.connectivity-service.IPv4.url", "");
+pref("network.connectivity-service.IPv6.url", "");
+pref("accessibility.support.url", "");
+pref("app.feedback.baseURL", "");
+pref("app.normandy.shieldLearnMoreUrl", "");
+pref("app.update.url", "");
+pref("browser.chrome.errorReporter.infoURL", "");
+pref("browser.contentblocking.report.cookie.url", "");
+pref("browser.dictionaries.download.url", "");
+pref("browser.safebrowsing.provider.google.reportMalwareMistakeURL", "");
+pref("browser.safebrowsing.provider.google.reportPhishMistakeURL", "");
+pref("browser.safebrowsing.provider.google.reportURL", "");
+pref("browser.safebrowsing.provider.google4.dataSharingURL", "");
+pref("browser.safebrowsing.provider.google4.reportMalwareMistakeURL", "");
+pref("browser.safebrowsing.provider.google4.reportPhishMistakeURL", "");
+pref("browser.safebrowsing.provider.google4.reportURL", "");
+pref("browser.safebrowsing.reportPhishURL", "");
+pref("devtools.devices.url", "");
+pref("devtools.performance.recording.ui-base-url", "");
+pref("devtools.webide.templatesURL", "");
+pref("extensions.getAddons.compatOverides.url", "");
+pref("extensions.getAddons.discovery.api_url", "");
+pref("extensions.getAddons.langpacks.url", "");
+pref("extensions.recommendations.themeRecommendationUrl", "");
+pref("gecko.handlerService.schemes.webcal.0.name", "");
+pref("gecko.handlerService.schemes.webcal.0.uriTemplate", "");
+pref("gecko.handlerService.schemes.irc.0.name", "");
+pref("gecko.handlerService.schemes.irc.0.uriTemplate", "");
+pref("media.gmp-manager.url", "");
+
+// Firefox connects to cloudfront on startup unless
+// these are false/blank.
+pref("browser.selfsupport.url", "");
+
+//
+// "SAFE" BROWSING
+//
+
+pref("browser.safebrowsing.malware.enabled", false);
+pref("browser.safebrowsing.phishing.enabled", false);
+pref("browser.safebrowsing.downloads.enabled", false);
+pref("browser.safebrowsing.downloads.remote.enabled", false);
+pref("browser.safebrowsing.downloads.remote.url", "");
+pref("browser.safebrowsing.downloads.remote.block_potentially_unwanted", false);
+pref("browser.safebrowsing.downloads.remote.block_uncommon", false);
+pref("browser.safebrowsing.provider.mozilla.updateURL", "");
+pref("browser.safebrowsing.provider.mozilla.gethashURL", "");
+pref("browser.safebrowsing.provider.google.gethashURL", "");
+pref("browser.safebrowsing.provider.google.updateURL", "");
+pref("browser.safebrowsing.provider.google4.gethashURL", "");
+pref("browser.safebrowsing.provider.google4.updateURL", "");
+pref("privacy.trackingprotection.introURL", "");
+
+//
+// EXPERIMENTS
+//
+
+pref("app.normandy.enabled", false);
+pref("app.normandy.api_url", "");
+pref("app.normandy.user_id", "");
+pref("extensions.systemAddon.update.url", "");
+pref("browser.ping-centre.telemetry", false);
+pref("extensions.screenshots.disabled", true);
+pref("extensions.screenshots.upload-disabled", true);
+pref("extensions.formautofill.addresses.enabled", false);
+pref("extensions.formautofill.available", "off");
+pref("extensions.formautofill.creditCards.enabled", false);
+pref("extensions.formautofill.heuristics.enabled", false);
+pref("extensions.webcompat-reporter.enabled", false);
+pref("experiments.supported", false);
+pref("experiments.enabled", false);
+pref("experiments.manifest.uri", "");
+pref("network.allow-experiments", false);
+pref("privacy.trackingprotection.enabled", false);
+
+//
+// IMPLICIT OUTBOUND CONNECTIONS
+//
+
+pref("network.prefetch-next", false);
+pref("network.dns.disablePrefetch", true);
+pref("network.dns.disablePrefetchFromHTTPS", true);
+pref("network.http.keep-alive.timeout", 15);
+pref("network.predictor.enabled", false);
+pref("network.predictor.enable-prefetch", false);
+pref("network.http.speculative-parallel-limit", 0);
+pref("browser.startup.page", 0);
+pref("browser.send_pings", false);
+pref("browser.send_pings.require_same_host", true);
+pref("network.dns.blockDotOnion", true);
+pref("browser.casting.enabled", false);
+
+//
+// PROTOCOLS
+//
+
+pref("network.dns.disableIPv6", true);
+pref("network.http.altsvc.enabled", false);
+pref("network.http.altsvc.oe", false);
+pref("network.proxy.socks_remote_dns", true);
+pref("network.trr.mode", 5);
+pref("network.file.disable_unc_paths", true);
+pref("network.gio.supported-protocols", "");
+pref("network.http.pipelining", true);
+pref("network.http.proxy.pipelining", true);
+pref("network.http.pipelining.maxrequests", 10);
+pref("nglayout.initialpaint.delay", 0);
+pref("network.protocol-handler.warn-external-default", true);
+pref("network.protocol-handler.external.http", false);
+pref("network.protocol-handler.external.https", false);
+pref("network.protocol-handler.external.javascript",false);
+pref("network.protocol-handler.external.moz-extension", false);
+pref("network.protocol-handler.external.ftp", false);
+pref("network.protocol-handler.external.file", false);
+pref("network.protocol-handler.external.about", false);
+pref("network.protocol-handler.external.chrome", false);
+pref("network.protocol-handler.external.blob", false);
+pref("network.protocol-handler.external.data", false);
+pref("network.protocol-handler.expose-all", false);
+pref("network.protocol-handler.expose.http", true);
+pref("network.protocol-handler.expose.https", true);
+pref("network.protocol-handler.expose.javascript", true);
+pref("network.protocol-handler.expose.moz-extension", true);
+pref("network.protocol-handler.expose.ftp", true);
+pref("network.protocol-handler.expose.file", true);
+pref("network.protocol-handler.expose.about", true);
+pref("network.protocol-handler.expose.chrome", true);
+pref("network.protocol-handler.expose.blob", true);
+pref("network.protocol-handler.expose.data", true);
+
+//
+// SEARCH / AUTOFILL / FORMS
+//
+
+pref("browser.fixup.alternate.enabled", false);
+pref("browser.urlbar.trimURLs", false);
+pref("browser.sessionhistory.max_entries", 10);
+pref("layout.css.visited_links_enabled", false);
+pref("browser.search.suggest.enabled", false);
+pref("browser.urlbar.usepreloadedtopurls.enabled", false);
+pref("browser.urlbar.speculativeConnect.enabled", false);
+pref("browser.formfill.enable", false);
+pref("browser.taskbar.lists.enabled", false);
+pref("browser.taskbar.lists.frequent.enabled", false);
+pref("browser.taskbar.lists.recent.enabled", false);
+pref("browser.taskbar.lists.tasks.enabled", false);
+pref("browser.taskbar.previews.enable", false);
+
+//
+// PASSWORDS
+//
+
+pref("signon.autofillForms", false);
+pref("signon.formlessCapture.enabled", false);
+pref("network.auth.subresource-http-auth-allow", 1);
+
+//
+// CACHE
+//
+
+pref("browser.cache.disk.enable", false);
+pref("browser.sessionstore.privacy_level", 2);
+pref("browser.sessionstore.interval", 30000);
+pref("toolkit.winRegisterApplicationRestart", false);
+pref("browser.shell.shortcutFavicons", false);
+pref("alerts.showFavicons", false);
+
+//
+// CIPHERS
+//
+
+pref("security.ssl.require_safe_negotiation", true);
+pref("security.ssl.disable_session_identifiers", true);
+pref("security.ssl.errorReporting.automatic", false);
+pref("security.tls.enable_0rtt_data", false);
+pref("security.ssl.enable_ocsp_stapling", true);
+pref("security.OCSP.enabled", 1);
+pref("security.OCSP.require", true);
+pref("security.pki.sha1_enforcement_level", 1);
+pref("security.family_safety.mode", 0);
+pref("security.cert_pinning.enforcement_level", 2);
+pref("security.ssl.errorReporting.enabled", false);
+pref("security.ssl.errorReporting.url", "");
+pref("security.mixed_content.block_active_content", true);
+pref("security.mixed_content.block_display_content", true);
+pref("security.mixed_content.block_object_subrequest", true);
+pref("security.ssl.treat_unsafe_negotiation_as_broken", true);
+pref("browser.ssl_override_behavior", 1);
+pref("browser.xul.error_pages.expert_bad_cert", true);
+pref("security.insecure_connection_icon.enabled", true);
+pref("security.insecure_connection_text.enabled", true);
+pref("security.ssl3.ecdhe_ecdsa_rc4_128_sha", false);
+pref("security.ssl3.ecdhe_rsa_rc4_128_sha", false);
+pref("security.ssl3.rsa_rc4_128_md5", false);
+pref("security.ssl3.rsa_rc4_128_sha", false);
+pref("security.tls.version.min", 1);
+pref("security.ssl3.dhe_rsa_aes_128_sha", false);
+pref("security.ssl3.dhe_rsa_aes_256_sha", false);
+
+//
+// FONTS
+//
+
+pref("gfx.font_rendering.opentype_svg.enabled", false);
+pref("gfx.font_rendering.graphite.enabled", false);
+
+//
+// HEADERS / REFERERS
+//
+
+pref("network.http.referer.XOriginPolicy", 2);
+pref("network.http.referer.XOriginTrimmingPolicy", 0);
+pref("network.http.referer.hideOnionSource", true);
+pref("privacy.donottrackheader.enabled", true);
+
+//
+// CONTAINERS
+//
+
+pref("privacy.userContext.ui.enabled", true);
+pref("privacy.userContext.enabled", true);
+pref("privacy.usercontext.about_newtab_segregation.enabled", true);
+pref("privacy.userContext.longPressBehavior", 2);
+
+//
+// PLUGINS
+//
+
+pref("plugin.state.flash", 0);
+pref("plugin.state.java", 0);
+pref("media.gmp-widevinecdm.visible", false);
+pref("media.gmp-widevinecdm.enabled", false);
+pref("media.eme.enabled", false);
+pref("media.gmp-manager.url.override", "data:text/plain,");
+pref("browser.eme.ui.enabled", false);
+pref("media.eme.apiVisible", false);
+pref("media.gmp-provider.enabled", false);
+pref("media.gmp-gmpopenh264.enabled", false);
+pref("media.gmp-gmpopenh264.provider.enabled", false);
+pref("plugins.hide_infobar_for_missing_plugin", true);
+pref("plugins.hide_infobar_for_outdated_plugin", true);
+pref("plugins.notifyMissingFlash", false);
+pref("dom.ipc.plugins.flash.subprocess.crashreporter.enabled", false);
+pref("dom.ipc.plugins.reportCrashURL", false);
+pref("plugins.click_to_play", true);
+
+//
+// CAMERA / MIC
+//
+
+pref("media.peerconnection.enabled", false);
+pref("media.peerconnection.ice.default_address_only", true);
+pref("media.peerconnection.ice.no_host", true);
+pref("webgl.disabled", true);
+pref("webgl.dxgl.enabled", false);
+pref("webgl.enable-webgl2", false);
+pref("webgl.min_capability_mode", true);
+pref("webgl.disable-extensions", true);
+pref("webgl.disable-fail-if-major-performance-caveat", true);
+pref("media.getusermedia.screensharing.enabled", false);
+pref("media.getusermedia.browser.enabled", false);
+pref("media.getusermedia.audiocapture.enabled", false);
+pref("media.autoplay.enabled.user-gestures-needed", false);
+pref("media.block-autoplay-until-in-foreground", true);
+
+//
+// WINDOW MEDDLING / POPUPS
+//
+
+pref("dom.disable_window_open_feature.close", true);
+pref("dom.disable_window_open_feature.location", true);
+pref("dom.disable_window_open_feature.menubar", true);
+pref("dom.disable_window_open_feature.minimizable", true);
+pref("dom.disable_window_open_feature.personalbar", true);
+pref("dom.disable_window_open_feature.resizable", true);
+pref("dom.disable_window_open_feature.status", true);
+pref("dom.disable_window_open_feature.titlebar", true);
+pref("dom.disable_window_open_feature.toolbar", true);
+pref("dom.disable_window_move_resize", true);
+pref("browser.link.open_newwindow", 3);
+pref("browser.link.open_newwindow.restriction", 0);
+pref("dom.disable_open_during_load", true);
+pref("dom.popup_allowed_events", "click dblclick");
+
+//
+// WEB WORKERS
+//
+
+pref("dom.serviceWorkers.enabled", false);
+pref("dom.push.enabled", false);
+pref("dom.webnotifications.enabled", false);
+pref("dom.webnotifications.serviceworker.enabled", false);
+pref("permissions.default.desktop-notification", 2);
+
+//
+// DOM / JAVASCRIPT
+//
+
+pref("dom.event.clipboardevents.enabled", false);
+pref("middlemouse.paste", false);
+pref("dom.allow_cut_copy", false);
+pref("dom.disable_beforeunload", true);
+pref("dom.vibrator.enabled", false);
+pref("javascript.options.asmjs", false);
+pref("javascript.options.wasm", false);
+pref("dom.targetBlankNoOpener.enabled", true);
+
+//
+// HARDWARE FINGERPRINTING
+//
+
+pref("dom.battery.enabled", false);
+pref("dom.vr.enabled", false);
+pref("media.navigator.enabled", false);
+pref("dom.webaudio.enabled", false);
+
+//
+// MISC
+//
+
+pref("accessibility.force_disabled", 1);
+pref("beacon.enabled", false);
+pref("browser.helperApps.deleteTempFileOnExit", true);
+pref("browser.pagethumbnails.capturing_disabled", true);
+pref("browser.tabs.remote.allowLinkedWebInFileUriProcess", false);
+pref("browser.uitour.enabled", false);
+pref("devtools.chrome.enabled", false);
+pref("devtools.debugger.remote-enabled", false);
+pref("devtools.webide.enabled", false);
+pref("devtools.webide.autoinstallADBExtension", false);
+pref("middlemouse.contentLoadURL", false);
+pref("network.http.redirection-limit", 10);
+pref("permissions.manager.defaultsUrl", "");
+pref("webchannel.allowObject.urlWhitelist", "");
+pref("network.IDN_show_punycode", true);
+pref("social.whitelist", "");
+pref("social.directories", "");
+pref("social.shareDirectory", "");
+pref("browser.apps.URL", "");
+pref("dom.enable_user_timing", false);
+pref("dom.mozTCPSocket.enabled", false);
+pref("dom.netinfo.enabled", false);
+pref("dom.telephony.enabled", false);
+pref("media.webspeech.recognition.enable", false);
+pref("device.sensors.enabled", false);
+pref("media.webspeech.synth.enabled", false);
+pref("dom.gamepad.enabled", false);
+pref("dom.enable_resource_timing", false);
+pref("dom.archivereader.enabled", false);
+pref("camera.control.face_detection.enabled", false);
+pref("browser.search.region", "US");
+pref("intl.locale.matchOS", false);
+pref("clipboard.autocopy", false);
+pref("browser.fixup.alternate.enabled", false);
+pref("media.video_stats.enabled", false);
+pref("devtools.chrome.enabled", false);
+pref("devtools.debugger.force-local", true);
+pref("browser.startup.homepage_override.mstone", "ignore");
+
+// Taken from TOR browser.
+pref("general.buildID.override", "20100101");
+pref("browser.startup.homepage_override.buildID", "20100101");
+pref("toolkit.telemetry.previousBuildID", "20100101");
+
+//
+// DOWNLOADS
+//
+
+pref("browser.download.useDownloadDir", false);
+pref("browser.download.manager.addToRecentDocs", false);
+pref("browser.download.hide_plugins_without_extensions", false);
+
+//
+// EXTENSIONS
+//
+
+pref("extensions.enabledScopes", 5);
+pref("extensions.autoDisableScopes", 15);
+pref("extensions.update.enabled", false);
+pref("xpinstall.signatures.required", true);
+pref("extensions.getAddons.cache.enabled", false);
+pref("lightweightThemes.update.enabled", false);
+pref("extensions.systemAddon.update.enabled", false);
+pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr", false);
+pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false);
+pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false);
+
+//
+// STORAGE
+//
+
+pref("browser.cache.offline.enable", false);
+pref("offline-apps.allow_by_default", false);
+
+//
+// SHUTDOWN
+//
+
+pref("privacy.sanitize.sanitizeOnShutdown", true);
+pref("privacy.clearOnShutdown.formdata", true);
+pref("privacy.clearOnShutdown.offlineApps", true);
+pref("privacy.clearOnShutdown.sessions", true);
+pref("privacy.clearOnShutdown.siteSettings", false);
+pref("privacy.cpd.cache", true);
+pref("privacy.cpd.cookies", true);
+pref("privacy.cpd.formdata", true);
+pref("privacy.cpd.history", true);
+pref("privacy.cpd.offlineApps", true);
+pref("privacy.cpd.passwords", false);
+pref("privacy.cpd.sessions", true);
+pref("privacy.cpd.siteSettings", false);
+pref("privacy.sanitize.timeSpan", 0);
+
+//
+// ISOLATION
+//
+
+pref("privacy.firstparty.isolate", true);
+pref("privacy.firstparty.isolate.restrict_opener_access", true);
+pref("browser.startup.blankWindow", false);
+
+//
+// POCKET / HELLO
+//
+
+pref("loop.enabled", false);
+pref("loop.feedback.baseUrl", "");
+pref("loop.gettingStarted.url", "");
+pref("loop.learnMoreUrl", "");
+pref("loop.legal.ToS_url", "");
+pref("loop.legal.privacy_url", "");
+pref("loop.oauth.google.redirect_uri", "");
+pref("loop.oauth.google.scope", "");
+pref("loop.server", "");
+pref("loop.soft_start_hostname", "");
+pref("loop.support_url", "");
+pref("loop.throttled2", false);
+pref("loop.logDomains", false);
+pref("browser.pocket.enabled", false);
+pref("browser.pocket.api", "");
+pref("browser.pocket.site", "");
+pref("browser.pocket.oAuthConsumerKey", "");
+pref("browser.pocket.useLocaleList", false);
+pref("browser.pocket.enabledLocales", "");
diff --git a/extra/firefox/patches/firefox-71-no-accessibility.patch b/extra/firefox/patches/firefox-71-no-accessibility.patch
new file mode 100644
index 00000000..b744c577
--- /dev/null
+++ b/extra/firefox/patches/firefox-71-no-accessibility.patch
@@ -0,0 +1,13 @@
+diff -r 22ced1a079e0 accessible/ipc/extension/other/moz.build
+--- a/accessible/ipc/extension/other/moz.build Mon Sep 16 22:30:52 2019 +0300
++++ b/accessible/ipc/extension/other/moz.build Tue Sep 17 23:17:02 2019 +0200
+@@ -9,7 +9,8 @@
+
+ IPDL_SOURCES += ['PDocAccessiblePlatformExt.ipdl']
+
+-if CONFIG['ACCESSIBILITY']:
++#if CONFIG['ACCESSIBILITY']:
++if 1:
+ EXPORTS.mozilla.a11y += [
+ 'DocAccessiblePlatformExtChild.h',
+ 'DocAccessiblePlatformExtParent.h',
diff --git a/extra/firefox/patches/firefox-71-no-dbus.patch b/extra/firefox/patches/firefox-71-no-dbus.patch
new file mode 100644
index 00000000..0dba95a9
--- /dev/null
+++ b/extra/firefox/patches/firefox-71-no-dbus.patch
@@ -0,0 +1,425 @@
+diff --git a/Cargo.lock b/Cargo.lock
+index e0fd54008d..c8a3033238 100644
+--- a/Cargo.lock
++++ b/Cargo.lock
+@@ -72,24 +72,10 @@ dependencies = [
+ "winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)",
+ ]
+
+-[[package]]
+-name = "audio_thread_priority"
+-version = "0.20.2"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-dependencies = [
+- "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "dbus 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
+- "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
+- "mach 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
+- "winapi 0.3.6 (git+https://github.com/froydnj/winapi-rs?branch=aarch64)",
+-]
+-
+ [[package]]
+ name = "audioipc"
+ version = "0.2.4"
+ dependencies = [
+- "audio_thread_priority 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
+@@ -117,7 +103,6 @@ dependencies = [
+ name = "audioipc-client"
+ version = "0.4.0"
+ dependencies = [
+- "audio_thread_priority 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "audioipc 0.2.4",
+ "cubeb-backend 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)",
+@@ -130,7 +115,6 @@ dependencies = [
+ name = "audioipc-server"
+ version = "0.2.3"
+ dependencies = [
+- "audio_thread_priority 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "audioipc 0.2.4",
+ "cubeb-core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+@@ -837,15 +821,6 @@ dependencies = [
+ "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ ]
+
+-[[package]]
+-name = "dbus"
+-version = "0.6.4"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-dependencies = [
+- "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
+- "libdbus-sys 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+-]
+-
+ [[package]]
+ name = "deflate"
+ version = "0.7.19"
+@@ -1219,7 +1194,6 @@ name = "gkrust-shared"
+ version = "0.1.0"
+ dependencies = [
+ "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
+- "audio_thread_priority 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "audioipc-client 0.4.0",
+ "audioipc-server 0.2.3",
+ "authenticator 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+@@ -1559,14 +1533,6 @@ name = "libc"
+ version = "0.2.60"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+
+-[[package]]
+-name = "libdbus-sys"
+-version = "0.1.5"
+-source = "registry+https://github.com/rust-lang/crates.io-index"
+-dependencies = [
+- "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
+-]
+-
+ [[package]]
+ name = "libloading"
+ version = "0.5.0"
+@@ -3811,7 +3777,6 @@ dependencies = [
+ "checksum atomic 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c210c1f4db048cda477b652d170572d84c9640695835f17663595d3bd543fc28"
+ "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
+ "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
+-"checksum audio_thread_priority 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)" = "197b2d259505d11c92d266e1784f01cc935eb764d2f54e16aedf4e5085197871"
+ "checksum authenticator 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ec149e5d5d4caa2c9ead53a8ce1ea9c4204c388c65bf3b96c2d1dc0fcf4aeb66"
+ "checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875"
+ "checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
+@@ -3872,7 +3837,6 @@ dependencies = [
+ "checksum darling 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe629a532efad5526454efb0700f86d5ad7ff001acb37e431c8bf017a432a8e"
+ "checksum darling_core 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ee54512bec54b41cf2337a22ddfadb53c7d4c738494dc2a186d7b037ad683b85"
+ "checksum darling_macro 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cd3e432e52c0810b72898296a69d66b1d78d1517dff6cde7a130557a55a62c1"
+-"checksum dbus 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e1b39f3f6aa3d4a1522c4f0f9f1e9e9167bd93740a8690874caa7cf8ce47d7"
+ "checksum deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "8a6abb26e16e8d419b5c78662aa9f82857c2386a073da266840e474d5055ec86"
+ "checksum derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f57d78cf3bd45270dad4e70c21ec77a960b36c7a841ff9db76aaa775a8fb871"
+ "checksum devd-rs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0d009f166c0d9e9f9909dc751630b3a6411ab7f85a153d32d01deb364ffe52a7"
+@@ -3931,7 +3895,6 @@ dependencies = [
+ "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1"
+ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f"
+ "checksum libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d44e80633f007889c7eff624b709ab43c92d708caad982295768a7b13ca3b5eb"
+-"checksum libdbus-sys 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "18cb88963258d00f4962205dbb5933d82780d9962c8c8a064b651d2ad7189210"
+ "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
+ "checksum libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea626d3bdf40a1c5aee3bcd4f40826970cae8d80a8fec934c82a63840094dcfe"
+ "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe"
+diff --git a/dom/ipc/ContentChild.cpp b/dom/ipc/ContentChild.cpp
+index 393fb53c02..15ddd2cf70 100644
+--- a/dom/ipc/ContentChild.cpp
++++ b/dom/ipc/ContentChild.cpp
+@@ -107,9 +107,7 @@
+ #include "nsIStringBundle.h"
+ #include "nsIWorkerDebuggerManager.h"
+ #include "nsGeolocation.h"
+-#include "audio_thread_priority.h"
+ #include "nsIConsoleService.h"
+-#include "audio_thread_priority.h"
+
+ #if !defined(XP_WIN)
+ # include "mozilla/Omnijar.h"
+@@ -1782,9 +1780,6 @@ mozilla::ipc::IPCResult ContentChild::RecvSetProcessSandbox(
+ } else {
+ // Pre-start audio before sandboxing; see bug 1443612.
+ if (Preferences::GetBool("media.cubeb.sandbox")) {
+- if (atp_set_real_time_limit(0, 48000)) {
+- NS_WARNING("could not set real-time limit at process startup");
+- }
+ InstallSoftRealTimeLimitHandler();
+ } else {
+ Unused << CubebUtils::GetCubebContext();
+diff --git a/dom/media/GraphRunner.cpp b/dom/media/GraphRunner.cpp
+index 8ff3391f4e..7a97faae76 100644
+--- a/dom/media/GraphRunner.cpp
++++ b/dom/media/GraphRunner.cpp
+@@ -13,7 +13,6 @@
+ #include "nsISupportsImpl.h"
+ #include "prthread.h"
+ #include "Tracing.h"
+-#include "audio_thread_priority.h"
+
+ namespace mozilla {
+
+@@ -93,9 +92,6 @@ bool GraphRunner::OneIteration(GraphTime aStateEnd) {
+ void GraphRunner::Run() {
+ PR_SetCurrentThreadName("GraphRunner");
+
+- atp_handle* handle =
+- atp_promote_current_thread_to_real_time(0, mGraph->GraphRate());
+-
+ MonitorAutoLock lock(mMonitor);
+ while (true) {
+ while (mThreadState == ThreadState::Wait) {
+@@ -111,10 +107,6 @@ void GraphRunner::Run() {
+ mMonitor.Notify();
+ }
+
+- if (handle) {
+- atp_demote_current_thread_from_real_time(handle);
+- }
+-
+ dom::WorkletThread::DeleteCycleCollectedJSContext();
+ }
+
+diff --git a/dom/media/UnderrunHandlerLinux.cpp b/dom/media/UnderrunHandlerLinux.cpp
+index af5c84538e..23bf97a31f 100644
+--- a/dom/media/UnderrunHandlerLinux.cpp
++++ b/dom/media/UnderrunHandlerLinux.cpp
+@@ -9,7 +9,6 @@
+
+ #include <mozilla/Sprintf.h>
+ #include <mozilla/Atomics.h>
+-#include "audio_thread_priority.h"
+
+ namespace mozilla {
+
+@@ -57,20 +56,6 @@ void InstallSoftRealTimeLimitHandler() {
+ }
+
+ void DemoteThreadFromRealTime() {
+- atp_thread_info* info = atp_get_current_thread_info();
+- if (!info) {
+- NS_WARNING("Could not get current thread info when demoting thread.");
+- return;
+- }
+- int rv = atp_demote_thread_from_real_time(info);
+- if (rv) {
+- NS_WARNING("Could not demote thread from real-time.");
+- return;
+- }
+- rv = atp_free_thread_info(info);
+- if (rv) {
+- NS_WARNING("Could not free atp_thread_info struct");
+- }
+ gRealtimeLimitReached = false;
+ }
+
+diff --git a/dom/media/moz.build b/dom/media/moz.build
+index 716c6a2322..840465f04a 100644
+--- a/dom/media/moz.build
++++ b/dom/media/moz.build
+@@ -101,7 +101,6 @@ XPIDL_SOURCES += [
+ XPIDL_MODULE = 'dom_media'
+
+ EXPORTS += [
+- '../../third_party/rust/audio_thread_priority/audio_thread_priority.h',
+ 'ADTSDecoder.h',
+ 'ADTSDemuxer.h',
+ 'AsyncLogger.h',
+diff --git a/media/audioipc/audioipc/Cargo.toml b/media/audioipc/audioipc/Cargo.toml
+index 286e16789b..c34775cea1 100644
+--- a/media/audioipc/audioipc/Cargo.toml
++++ b/media/audioipc/audioipc/Cargo.toml
+@@ -19,7 +19,6 @@ serde = "1.*.*"
+ serde_derive = "1.*.*"
+ tokio = "0.1"
+ tokio-io = "0.1"
+-audio_thread_priority = "0.20.2"
+
+ [target.'cfg(unix)'.dependencies]
+ iovec = "0.1"
+diff --git a/media/audioipc/audioipc/src/messages.rs b/media/audioipc/audioipc/src/messages.rs
+index 9a2ca4d59e..612e8d5050 100644
+--- a/media/audioipc/audioipc/src/messages.rs
++++ b/media/audioipc/audioipc/src/messages.rs
+@@ -9,8 +9,6 @@ use cubeb::{self, ffi};
+ use std::ffi::{CStr, CString};
+ use std::os::raw::{c_char, c_int, c_uint};
+ use std::ptr;
+-#[cfg(target_os = "linux")]
+-use audio_thread_priority::RtPriorityThreadInfo;
+
+ #[derive(Debug, Serialize, Deserialize)]
+ pub struct Device {
+@@ -209,9 +207,6 @@ pub enum ServerMessage {
+ StreamSetVolume(usize, f32),
+ StreamGetCurrentDevice(usize),
+ StreamRegisterDeviceChangeCallback(usize, bool),
+-
+- #[cfg(target_os = "linux")]
+- PromoteThreadToRealTime([u8; std::mem::size_of::<RtPriorityThreadInfo>()]),
+ }
+
+ // Server -> Client messages.
+diff --git a/media/audioipc/client/Cargo.toml b/media/audioipc/client/Cargo.toml
+index 866cde7e98..eaf9a62cc7 100644
+--- a/media/audioipc/client/Cargo.toml
++++ b/media/audioipc/client/Cargo.toml
+@@ -9,7 +9,6 @@ description = "Cubeb Backend for talking to remote cubeb server."
+ edition = "2018"
+
+ [dependencies]
+-audio_thread_priority = "0.20.2"
+ audioipc = { path="../audioipc" }
+ cubeb-backend = "0.6.0"
+ futures = { version="0.1.18", default-features=false, features=["use_std"] }
+diff --git a/media/audioipc/client/src/context.rs b/media/audioipc/client/src/context.rs
+index c20e281248..e13dbc2d8d 100644
+--- a/media/audioipc/client/src/context.rs
++++ b/media/audioipc/client/src/context.rs
+@@ -6,10 +6,6 @@
+ use crate::{assert_not_in_callback, run_in_callback};
+ use crate::stream;
+ use crate::{ClientStream, G_SERVER_FD, CPUPOOL_INIT_PARAMS};
+-#[cfg(not(target_os = "linux"))]
+-use audio_thread_priority::promote_current_thread_to_real_time;
+-#[cfg(target_os = "linux")]
+-use audio_thread_priority::get_current_thread_info;
+ use audioipc::codec::LengthDelimitedCodec;
+ use audioipc::frame::{framed, Framed};
+ use audioipc::platformhandle_passing::{framed_with_platformhandles, FramedWithPlatformHandles};
+@@ -91,34 +87,6 @@ fn open_server_stream() -> io::Result<audioipc::MessageStream> {
+ }
+ }
+
+-#[cfg(target_os = "linux")]
+-fn promote_thread(rpc: &rpc::ClientProxy<ServerMessage, ClientMessage>)
+-{
+- match get_current_thread_info() {
+- Ok(info) => {
+- let bytes = info.serialize();
+- // Don't wait for the response, this is on the callback thread, which must not block.
+- rpc.call(ServerMessage::PromoteThreadToRealTime(bytes));
+- }
+- Err(_) => {
+- warn!("Could not remotely promote thread to RT.");
+- }
+- }
+-}
+-
+-#[cfg(not(target_os = "linux"))]
+-fn promote_thread(_rpc: &rpc::ClientProxy<ServerMessage, ClientMessage>)
+-{
+- match promote_current_thread_to_real_time(0, 48000) {
+- Ok(_) => {
+- info!("Audio thread promoted to real-time.");
+- }
+- Err(_) => {
+- warn!("Could not promote thread to real-time.");
+- }
+- }
+-}
+-
+ fn register_thread(callback: Option<extern "C" fn(*const ::std::os::raw::c_char)>) {
+ if let Some(func) = callback {
+ let thr = thread::current();
+@@ -127,12 +95,6 @@ fn register_thread(callback: Option<extern "C" fn(*const ::std::os::raw::c_char)
+ }
+ }
+
+-fn promote_and_register_thread(rpc: &rpc::ClientProxy<ServerMessage, ClientMessage>,
+- callback: Option<extern "C" fn(*const ::std::os::raw::c_char)>) {
+- promote_thread(rpc);
+- register_thread(callback);
+-}
+-
+ #[derive(Default)]
+ struct DeviceCollectionCallback {
+ cb: ffi::cubeb_device_collection_changed_callback,
+@@ -235,7 +197,6 @@ impl ContextOps for ClientContext {
+
+ let cpu_pool = futures_cpupool::Builder::new()
+ .name_prefix("AudioIPC")
+- .after_start(move || promote_and_register_thread(&rpc2, params.thread_create_callback))
+ .pool_size(params.pool_size)
+ .stack_size(params.stack_size)
+ .create();
+diff --git a/media/audioipc/server/Cargo.toml b/media/audioipc/server/Cargo.toml
+index 8a628e7090..31f23cbe78 100644
+--- a/media/audioipc/server/Cargo.toml
++++ b/media/audioipc/server/Cargo.toml
+@@ -9,7 +9,6 @@ description = "Remote cubeb server"
+ edition = "2018"
+
+ [dependencies]
+-audio_thread_priority = "0.20.2"
+ audioipc = { path = "../audioipc" }
+ cubeb-core = "0.6.0"
+ futures = "0.1.18"
+diff --git a/media/audioipc/server/src/lib.rs b/media/audioipc/server/src/lib.rs
+index 63b373fe8f..75f8b99123 100644
+--- a/media/audioipc/server/src/lib.rs
++++ b/media/audioipc/server/src/lib.rs
+@@ -11,7 +11,6 @@ extern crate log;
+ #[macro_use]
+ extern crate lazy_static;
+
+-use audio_thread_priority::promote_current_thread_to_real_time;
+ use audioipc::core;
+ use audioipc::platformhandle_passing::framed_with_platformhandles;
+ use audioipc::rpc;
+@@ -64,12 +63,6 @@ fn run() -> Result<ServerWrapper> {
+ trace!("Starting up cubeb audio server event loop thread...");
+
+ let callback_thread = core::spawn_thread("AudioIPC Callback RPC", || {
+- match promote_current_thread_to_real_time(0, 48000) {
+- Ok(_) => {}
+- Err(_) => {
+- debug!("Failed to promote audio callback thread to real-time.");
+- }
+- }
+ trace!("Starting up cubeb audio callback event loop thread...");
+ Ok(())
+ })
+diff --git a/media/audioipc/server/src/server.rs b/media/audioipc/server/src/server.rs
+index 3d98c8fed2..35fff91130 100644
+--- a/media/audioipc/server/src/server.rs
++++ b/media/audioipc/server/src/server.rs
+@@ -30,8 +30,6 @@ use std::rc::Rc;
+ use std::{panic, slice};
+ use tokio::reactor;
+ use tokio::runtime::current_thread;
+-#[cfg(target_os = "linux")]
+-use audio_thread_priority::{RtPriorityThreadInfo, promote_thread_to_real_time};
+
+ use crate::errors::*;
+
+@@ -521,21 +519,6 @@ impl CubebServer {
+ )
+ .unwrap_or_else(error)
+ },
+-
+- #[cfg(target_os = "linux")]
+- ServerMessage::PromoteThreadToRealTime(thread_info) => {
+- let info = RtPriorityThreadInfo::deserialize(thread_info);
+- match promote_thread_to_real_time(info, 0, 48000) {
+- Ok(_) => {
+- info!("Promotion of content process thread to real-time OK");
+- }
+- Err(_) => {
+- warn!("Promotion of content process thread to real-time error");
+- }
+- }
+- ClientMessage::ThreadPromoted
+- },
+-
+ };
+
+ trace!("process_msg: req={:?}, resp={:?}", msg, resp);
+diff --git a/toolkit/library/rust/shared/Cargo.toml b/toolkit/library/rust/shared/Cargo.toml
+index 190503e2ab..dd7f0a5234 100644
+--- a/toolkit/library/rust/shared/Cargo.toml
++++ b/toolkit/library/rust/shared/Cargo.toml
+@@ -40,7 +40,6 @@ bitsdownload = { path = "../../../components/bitsdownload", optional = true }
+ storage = { path = "../../../../storage/rust" }
+ bookmark_sync = { path = "../../../components/places/bookmark_sync", optional = true }
+ shift_or_euc_c = "0.1.0"
+-audio_thread_priority = "0.20.2"
+ mdns_service = { path="../../../../media/mtransport/mdns_service", optional = true }
+
+ [build-dependencies]
+diff --git a/toolkit/library/rust/shared/lib.rs b/toolkit/library/rust/shared/lib.rs
+index f76f53436d..318f904703 100644
+--- a/toolkit/library/rust/shared/lib.rs
++++ b/toolkit/library/rust/shared/lib.rs
+@@ -48,8 +48,6 @@ extern crate shift_or_euc_c;
+
+ extern crate arrayvec;
+
+-extern crate audio_thread_priority;
+-
+ #[cfg(feature = "webrtc")]
+ extern crate mdns_service;
+
diff --git a/extra/firefox/patches/fix-fortify-system-wrappers.patch b/extra/firefox/patches/fix-fortify-system-wrappers.patch
new file mode 100644
index 00000000..17cf7e30
--- /dev/null
+++ b/extra/firefox/patches/fix-fortify-system-wrappers.patch
@@ -0,0 +1,13 @@
+The wrapper features.h gets pulled in by system headers causing thigns to
+break. We work around it by simply not wrap features.h
+
+--- ./config/system-headers.mozbuild.orig
++++ ./config/system-headers.mozbuild
+@@ -229,7 +229,6 @@
+ 'execinfo.h',
+ 'extras.h',
+ 'fcntl.h',
+- 'features.h',
+ 'fenv.h',
+ 'ffi.h',
+ 'fibdef.h',
diff --git a/extra/firefox/patches/fix-sandbox-membarrier.patch b/extra/firefox/patches/fix-sandbox-membarrier.patch
new file mode 100644
index 00000000..4bd3b80d
--- /dev/null
+++ b/extra/firefox/patches/fix-sandbox-membarrier.patch
@@ -0,0 +1,54 @@
+allow usage of SYS_membarrier, needed since musl-1.1.22
+
+Taken from voidlinux: https://github.com/void-linux/void-packages/commit/4198411ac3b9e2620e171c662df82008da0faebb
+
+--- a/security/sandbox/linux/SandboxFilter.cpp
++++ b/security/sandbox/linux/SandboxFilter.cpp
+@@ -572,6 +572,8 @@
+ case __NR_set_tid_address:
+ return Allow();
+ #endif
++ case __NR_membarrier:
++ return Allow();
+
+ // prctl
+ case __NR_prctl: {
+
+--- a/security/sandbox/chromium/sandbox/linux/system_headers/arm_linux_syscalls.h
++++ b/security/sandbox/chromium/sandbox/linux/system_headers/arm_linux_syscalls.h
+@@ -1385,6 +1385,10 @@
+ #define __NR_memfd_create (__NR_SYSCALL_BASE+385)
+ #endif
+
++#if !defined(__NR_membarrier)
++#define __NR_membarrier (__NR_SYSCALL_BASE+389)
++#endif
++
+ // ARM private syscalls.
+ #if !defined(__ARM_NR_BASE)
+ #define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0xF0000)
+
+--- a/security/sandbox/chromium/sandbox/linux/system_headers/x86_64_linux_syscalls.h
++++ b/security/sandbox/chromium/sandbox/linux/system_headers/x86_64_linux_syscalls.h
+@@ -1290,5 +1290,9 @@
+ #define __NR_memfd_create 319
+ #endif
+
++#if !defined(__NR_membarrier)
++#define __NR_membarrier 324
++#endif
++
+ #endif // SANDBOX_LINUX_SYSTEM_HEADERS_X86_64_LINUX_SYSCALLS_H_
+
+--- a/security/sandbox/chromium/sandbox/linux/system_headers/x86_32_linux_syscalls.h
++++ b/security/sandbox/chromium/sandbox/linux/system_headers/x86_32_linux_syscalls.h
+@@ -1490,5 +1490,9 @@
+ #define __NR_shutdown 373
+ #endif
+
++#if !defined(__NR_membarrier)
++#define __NR_membarrier 375
++#endif
++
+ #endif // SANDBOX_LINUX_SYSTEM_HEADERS_X86_32_LINUX_SYSCALLS_H_
+
diff --git a/extra/firefox/patches/fix-seccomp-bpf.patch b/extra/firefox/patches/fix-seccomp-bpf.patch
new file mode 100644
index 00000000..da102b46
--- /dev/null
+++ b/extra/firefox/patches/fix-seccomp-bpf.patch
@@ -0,0 +1,14 @@
+--- a/security/sandbox/chromium/sandbox/linux/seccomp-bpf/trap.cc
++++ b/security/sandbox/chromium/sandbox/linux/seccomp-bpf/trap.cc
+@@ -25,6 +25,11 @@
+ #include "sandbox/linux/system_headers/linux_seccomp.h"
+ #include "sandbox/linux/system_headers/linux_signal.h"
+
++// musl libc defines siginfo_t __si_fields instead of _sifields
++#if defined(OS_LINUX) && !defined(__GLIBC__)
++#define _sifields __si_fields
++#endif
++
+ namespace {
+
+ struct arch_sigsys {
diff --git a/extra/firefox/patches/fix-toolkit.patch b/extra/firefox/patches/fix-toolkit.patch
new file mode 100644
index 00000000..414734df
--- /dev/null
+++ b/extra/firefox/patches/fix-toolkit.patch
@@ -0,0 +1,90 @@
+diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
+index 4222ce3..4d40c6a 100644
+--- a/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
++++ b/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
+@@ -46,6 +46,7 @@
+ #include <sys/mman.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
++#include <libgen.h>
+
+ #include <iostream>
+ #include <set>
+diff --git a/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.cc b/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.cc
+index 6019fc7..5953e32 100644
+--- a/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.cc
++++ b/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.cc
+@@ -41,6 +41,10 @@
+
+ #include "common/using_std_string.h"
+
++#ifndef N_UNDF
++#define N_UNDF 0
++#endif
++
+ using std::vector;
+
+ namespace google_breakpad {
+diff --git a/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.h b/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.h
+index 98ee2dd..d57aa68 100644
+--- a/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.h
++++ b/toolkit/crashreporter/google-breakpad/src/common/stabs_reader.h
+@@ -55,7 +55,7 @@
+
+ #ifdef HAVE_MACH_O_NLIST_H
+ #include <mach-o/nlist.h>
+-#elif defined(HAVE_A_OUT_H)
++#elif 0
+ #include <a.out.h>
+ #endif
+
+diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h b/toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h
+index 93fdad7..f34e5e0 100644
+--- a/toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h
++++ b/toolkit/crashreporter/google-breakpad/src/third_party/lss/linux_syscall_support.h
+@@ -1239,6 +1239,12 @@ struct kernel_statfs {
+ #ifndef __NR_fallocate
+ #define __NR_fallocate 285
+ #endif
++
++#undef __NR_pread
++#define __NR_pread __NR_pread64
++#undef __NR_pwrite
++#define __NR_pwrite __NR_pwrite64
++
+ /* End of x86-64 definitions */
+ #elif defined(__mips__)
+ #if _MIPS_SIM == _MIPS_SIM_ABI32
+diff --git a/toolkit/mozapps/update/common/updatedefines.h b/toolkit/mozapps/update/common/updatedefines.h
+index 79276f7..4c67976 100644
+--- a/toolkit/mozapps/update/common/updatedefines.h
++++ b/toolkit/mozapps/update/common/updatedefines.h
+@@ -87,7 +87,7 @@ static inline int mywcsprintf(WCHAR* dest, size_t count, const WCHAR* fmt,
+
+ # ifdef SOLARIS
+ # include <sys/stat.h>
+-# else
++# elif !defined(__linux__) || defined(__GLIBC__)
+ # include <fts.h>
+ # endif
+ # include <dirent.h>
+diff --git a/toolkit/mozapps/update/updater/updater.cpp b/toolkit/mozapps/update/updater/updater.cpp
+index 257ccb4..01314e4 100644
+--- a/toolkit/mozapps/update/updater/updater.cpp
++++ b/toolkit/mozapps/update/updater/updater.cpp
+@@ -3978,6 +3978,7 @@
+
+ int add_dir_entries(const NS_tchar* dirpath, ActionList* list) {
+ int rv = OK;
++#if !defined(__linux__) || defined(__GLIBC__)
+ FTS* ftsdir;
+ FTSENT* ftsdirEntry;
+ mozilla::UniquePtr<NS_tchar[]> searchpath(get_full_path(dirpath));
+@@ -4085,6 +4086,7 @@
+ }
+
+ fts_close(ftsdir);
++#endif
+
+ return rv;
+ }
diff --git a/extra/firefox/patches/fix-tools.patch b/extra/firefox/patches/fix-tools.patch
new file mode 100644
index 00000000..93b9d19c
--- /dev/null
+++ b/extra/firefox/patches/fix-tools.patch
@@ -0,0 +1,37 @@
+diff --git a/tools/profiler/core/platform-linux-android.cpp b/tools/profiler/core/platform-linux-android.cpp
+index 19d0a5c56d..b64b543066 100644
+--- a/tools/profiler/core/platform-linux-android.cpp
++++ b/tools/profiler/core/platform-linux-android.cpp
+@@ -506,8 +506,10 @@ static void PlatformInit(PSLockRef aLock) {}
+ ucontext_t sSyncUContext;
+
+ void Registers::SyncPopulate() {
+- if (!getcontext(&sSyncUContext)) {
+- PopulateRegsFromContext(*this, &sSyncUContext);
+- }
++ #if defined(__GLIBC__)
++ if (!getcontext(&sSyncUContext)) {
++ PopulateRegsFromContext(*this, &sSyncUContext);
++ }
++ #endif
+ }
+ #endif
+diff --git a/tools/profiler/lul/LulElf.cpp b/tools/profiler/lul/LulElf.cpp
+index 9998d04d0d..348a7086fc 100644
+--- a/tools/profiler/lul/LulElf.cpp
++++ b/tools/profiler/lul/LulElf.cpp
+@@ -469,10 +469,10 @@ string FormatIdentifier(unsigned char identifier[16]) {
+ // Return the non-directory portion of FILENAME: the portion after the
+ // last slash, or the whole filename if there are no slashes.
+ string BaseFileName(const string& filename) {
+- // Lots of copies! basename's behavior is less than ideal.
+- char* c_filename = strdup(filename.c_str());
+- string base = basename(c_filename);
+- free(c_filename);
++ // basename's behavior is less than ideal so avoid it
++ const char *c_filename = filename.c_str();
++ const char *p = strrchr(c_filename, '/');
++ string base = p ? p+1 : c_filename;
+ return base;
+ }
+
diff --git a/extra/firefox/patches/fix-webrtc-glibcisms.patch b/extra/firefox/patches/fix-webrtc-glibcisms.patch
new file mode 100644
index 00000000..658b076d
--- /dev/null
+++ b/extra/firefox/patches/fix-webrtc-glibcisms.patch
@@ -0,0 +1,20 @@
+--- ./media/webrtc/trunk/webrtc/system_wrappers/source/cpu_features_linux.c.orig 2018-05-09 23:48:44.677389171 +0200
++++ ./media/webrtc/trunk/webrtc/system_wrappers/source/cpu_features_linux.c 2018-05-09 23:48:56.254373557 +0200
+@@ -14,7 +14,7 @@
+ #ifndef __GLIBC_PREREQ
+ #define __GLIBC_PREREQ(a, b) 0
+ #endif
+-#if __GLIBC_PREREQ(2, 16)
++#if !__GLIBC__ || __GLIBC_PREREQ(2, 16)
+ #include <sys/auxv.h>
+ #else
+ #include <fcntl.h>
+@@ -32,7 +32,7 @@
+ int architecture = 0;
+ unsigned long hwcap = 0;
+ const char* platform = NULL;
+-#if __GLIBC_PREREQ(2, 16)
++#if !__GLIBC__ || __GLIBC_PREREQ(2, 16)
+ hwcap = getauxval(AT_HWCAP);
+ platform = (const char*)getauxval(AT_PLATFORM);
+ #else
diff --git a/extra/firefox/patches/mallinfo.patch b/extra/firefox/patches/mallinfo.patch
new file mode 100644
index 00000000..0649413c
--- /dev/null
+++ b/extra/firefox/patches/mallinfo.patch
@@ -0,0 +1,34 @@
+--- a/xpcom/base/nsMemoryReporterManager.cpp.orig 2019-03-19 17:12:20.844810044 +0100
++++ b/xpcom/base/nsMemoryReporterManager.cpp 2019-03-19 17:13:32.505133615 +0100
+@@ -123,6 +123,7 @@
+ return GetProcSelfSmapsPrivate(aN);
+ }
+
++#ifdef __GLIBC__
+ # ifdef HAVE_MALLINFO
+ # define HAVE_SYSTEM_HEAP_REPORTER 1
+ static MOZ_MUST_USE nsresult SystemHeapSize(int64_t* aSizeOut) {
+@@ -142,6 +143,7 @@
+ return NS_OK;
+ }
+ # endif
++#endif // __GLIBC__
+
+ #elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
+ defined(__OpenBSD__) || defined(__FreeBSD_kernel__)
+@@ -642,6 +644,7 @@
+ return NS_OK;
+ }
+
++#ifdef __GLIBC__
+ # define HAVE_SYSTEM_HEAP_REPORTER 1
+ // Windows can have multiple separate heaps. During testing there were multiple
+ // heaps present but the non-default ones had sizes no more than a few 10s of
+@@ -698,6 +701,7 @@
+ *aSizeOut = heapsSize;
+ return NS_OK;
+ }
++#endif // __GLIBC__
+
+ struct SegmentKind {
+ DWORD mState;
diff --git a/extra/firefox/sources b/extra/firefox/sources
new file mode 100644
index 00000000..99c2a787
--- /dev/null
+++ b/extra/firefox/sources
@@ -0,0 +1,15 @@
+https://archive.mozilla.org/pub/firefox/candidates/71.0-candidates/build2/source/firefox-71.0.source.tar.xz
+https://ftp.gnu.org/gnu/autoconf/autoconf-2.13.tar.gz autoconf2.13/
+files/mozconfig
+files/stab.h toolkit/crashreporter/google-breakpad/src/
+files/vendor.js
+files/policies.json
+patches/fix-fortify-system-wrappers.patch
+patches/fix-sandbox-membarrier.patch
+patches/fix-seccomp-bpf.patch
+patches/fix-toolkit.patch
+patches/fix-tools.patch
+patches/fix-webrtc-glibcisms.patch
+patches/mallinfo.patch
+patches/firefox-71-no-dbus.patch
+patches/firefox-71-no-accessibility.patch
diff --git a/extra/firefox/version b/extra/firefox/version
new file mode 100644
index 00000000..4f95e8e6
--- /dev/null
+++ b/extra/firefox/version
@@ -0,0 +1 @@
+71.0 1