summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorYour Name2017-12-03 16:32:18 -0400
committerYour Name2017-12-03 16:32:18 -0400
commit62b04ff928bf23c2e209d9919ae16de7b62dd518 (patch)
treef6ee38078c713dae1cc8a5d00f941c8c7af7e626
parent2713ef3643f54f7d2357f0dbd87ad2da20a46dee (diff)
downloadaur-62b04ff928bf23c2e209d9919ae16de7b62dd518.tar.gz
57
-rw-r--r--0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch117
-rw-r--r--PKGBUILD246
-rw-r--r--firefox-52-disable-data-sharing-infobar.patch7
-rw-r--r--firefox-52-disable-location.services.mozilla.com.patch24
-rw-r--r--firefox-52-disable-reader.patch104
-rw-r--r--firefox-52-disable-sponsored-tiles.patch150
-rw-r--r--firefox-52-disable-telemetry.patch12
-rw-r--r--firefox-52-prefs.patch260
-rw-r--r--firefox.desktop374
-rw-r--r--glibc-2.26-fix.diff258
-rw-r--r--no-plt.diff48
-rw-r--r--plugin-crash.diff50
-rwxr-xr-xupload-symbol-archive23
-rw-r--r--wifi-disentangle.patch245
-rw-r--r--wifi-fix-interface.patch26
15 files changed, 1653 insertions, 291 deletions
diff --git a/0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch b/0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch
new file mode 100644
index 000000000000..58d029bde35a
--- /dev/null
+++ b/0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch
@@ -0,0 +1,117 @@
+From 2874ecd82e9671f774bdfda41fe0857fcb916c13 Mon Sep 17 00:00:00 2001
+Message-Id: <2874ecd82e9671f774bdfda41fe0857fcb916c13.1506634385.git.jan.steffens@gmail.com>
+From: Mike Hommey <mh+mozilla@glandium.org>
+Date: Wed, 16 Aug 2017 13:16:16 +0900
+Subject: [PATCH] Bug 1384062 - Make SystemResourceMonitor.stop more resilient
+ to errors. r=ahal,gps
+
+The poll() call in SystemResourceMonitor.stop might fail even though
+there is something to read from the pipe, in some corner cases, and
+python won't let us know about it. In that case, an exception is thrown,
+leaving the SystemResourceMonitor (and its callers) in a weird state. In
+practice, this leads BuildMonitor.__exit__ to recall stop, which then
+fails.
+
+So when poll() throws an exception, we pretend there's still something
+to read, and we try to read anyways. If there is something to read,
+recv() will return it, otherwise, it will throw an exception of its own,
+which we catch, pretending we're done.
+
+Furthermore, when there is nothing to read from the pipe, poll() simply
+returns False, and our loop never sets `done` to True, and we then hit
+an assert, which doesn't have its place here, so we remove it.
+
+Finally, the other end of the pipe might have died at any time, making
+sending over the pipe fail, so we also protect against that.
+
+With all these changes, it feels like the reason to backout bug 1239939
+in bug 1272782 should have been dealt with, and we can drop the timeout
+again.
+
+--HG--
+extra : rebase_source : ac72dd5b2602cf3ffddfb429f95e02380f939893
+---
+ .../mozsystemmonitor/resourcemonitor.py | 38 +++++++++++++++-------
+ 1 file changed, 26 insertions(+), 12 deletions(-)
+
+diff --git a/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py b/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py
+index 8f2ac95cbe505540..38f9bc986ac2a120 100644
+--- a/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py
++++ b/testing/mozbase/mozsystemmonitor/mozsystemmonitor/resourcemonitor.py
+@@ -289,47 +289,61 @@ class SystemResourceMonitor(object):
+ assert self._running
+ assert not self._stopped
+
+- self._pipe.send(('terminate',))
++ try:
++ self._pipe.send(('terminate',))
++ except Exception:
++ pass
+ self._running = False
+ self._stopped = True
+
+ self.measurements = []
+
+- done = False
+-
+ # The child process will send each data sample over the pipe
+ # as a separate data structure. When it has finished sending
+ # samples, it sends a special "done" message to indicate it
+ # is finished.
+- while self._pipe.poll(1.0):
+- start_time, end_time, io_diff, cpu_diff, cpu_percent, virt_mem, \
+- swap_mem = self._pipe.recv()
++
++ # multiprocessing.Pipe is not actually a pipe on at least Linux. that
++ # has an effect on the expected outcome of reading from it when the
++ # other end of the pipe dies, leading to possibly hanging on revc()
++ # below. So we must poll().
++ def poll():
++ try:
++ return self._pipe.poll(0.1)
++ except Exception:
++ # Poll might throw an exception even though there's still
++ # data to read. That happens when the underlying system call
++ # returns both POLLERR and POLLIN, but python doesn't tell us
++ # about it. So assume there is something to read, and we'll
++ # get an exception when trying to read the data.
++ return True
++ while poll():
++ try:
++ start_time, end_time, io_diff, cpu_diff, cpu_percent, virt_mem, \
++ swap_mem = self._pipe.recv()
++ except Exception:
++ # Let's assume we're done here
++ break
+
+ # There should be nothing after the "done" message so
+ # terminate.
+ if start_time == 'done':
+- done = True
+ break
+
+ io = self._io_type(*io_diff)
+ virt = self._virt_type(*virt_mem)
+ swap = self._swap_type(*swap_mem)
+ cpu_times = [self._cpu_times_type(*v) for v in cpu_diff]
+
+ self.measurements.append(SystemResourceUsage(start_time, end_time,
+ cpu_times, cpu_percent, io, virt, swap))
+
+ # We establish a timeout so we don't hang forever if the child
+ # process has crashed.
+ self._process.join(10)
+ if self._process.is_alive():
+ self._process.terminate()
+ self._process.join(10)
+- else:
+- # We should have received a "done" message from the
+- # child indicating it shut down properly. This only
+- # happens if the child shuts down cleanly.
+- assert done
+
+ if len(self.measurements):
+ self.start_time = self.measurements[0].start
+--
+2.14.2
+
diff --git a/PKGBUILD b/PKGBUILD
index a8a62b449c85..a38ae817c615 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,139 +1,219 @@
# $Id$
-# Maintainer: Jonas Heinrich <onny@project-insanity.org>
-# Contributor: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
# Contributor: Ionut Biru <ibiru@archlinux.org>
# Contributor: Jakub Schmidtke <sjakub@gmail.com>
pkgname=firefox-eme-free
-_pkgname=firefox
-pkgver=46.0
+pkgver=57.0.1
pkgrel=1
-pkgdesc="Standalone web browser from mozilla.org"
-arch=('i686' 'x86_64')
-license=('MPL' 'GPL' 'LGPL')
+pkgdesc="Deblobbed and EME free Firefox"
+arch=(i686 x86_64)
+license=(MPL GPL LGPL)
url="https://www.mozilla.org/firefox/"
-depends=('gtk3' 'gtk2' 'mozilla-common' 'libxt' 'startup-notification' 'mime-types'
- 'dbus-glib' 'alsa-lib' 'ffmpeg' 'desktop-file-utils' 'hicolor-icon-theme'
- 'libvpx' 'icu' 'libevent' 'nss' 'hunspell' 'sqlite' 'ttf-font')
-makedepends=('unzip' 'zip' 'diffutils' 'python2' 'yasm' 'mesa' 'imake' 'gconf'
- 'xorg-server-xvfb' 'libpulse' 'inetutils')
+depends=(gtk3 gtk2 mozilla-common libxt startup-notification mime-types dbus-glib ffmpeg
+ nss hunspell sqlite ttf-font libpulse)
+makedepends=(unzip zip diffutils python2 yasm mesa imake gconf inetutils xorg-server-xvfb
+ autoconf2.13 rust mercurial clang llvm jack)
optdepends=('networkmanager: Location detection via available WiFi networks'
- 'upower: Battery API')
-install=firefox.install
-conflicts=('firefox')
-provides=('firefox')
-options=('!emptydirs' '!makeflags')
-source=(https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/$pkgver/source/firefox-$pkgver.source.tar.xz
- mozconfig
- firefox.desktop
- firefox-install-dir.patch
- vendor.js
- firefox-symbolic.svg
- firefox-fixed-loading-icon.png
- firefox-gtk3-20.patch
- no-libnotify.patch)
-sha256sums=('b35aa05162362d73cd308066adca207f7aa40ceae10931fa4819371df6c4f8bf'
- '4e79065e0fd20120eaf3de7a57a27f012db6bd69db4f976732c0f04f41a504a0'
- 'c202e5e18da1eeddd2e1d81cb3436813f11e44585ca7357c4c5f1bddd4bec826'
- 'd86e41d87363656ee62e12543e2f5181aadcff448e406ef3218e91865ae775cd'
- '4b50e9aec03432e21b44d18c4c97b2630bace606b033f7d556c9d3e3eb0f4fa4'
+ 'libnotify: Notification integration'
+ 'pulseaudio: Audio support'
+ 'speech-dispatcher: Text-to-Speech')
+options=(!emptydirs !makeflags !strip)
+_repo=https://hg.mozilla.org/mozilla-unified
+source=("hg+$_repo#tag=FIREFOX_${pkgver//./_}_RELEASE"
+ wifi-disentangle.patch wifi-fix-interface.patch
+ 0001-Bug-1384062-Make-SystemResourceMonitor.stop-more-res.patch
+ no-plt.diff plugin-crash.diff glibc-2.26-fix.diff
+ $pkgname.desktop firefox-symbolic.svg firefox-install-dir.patch
+https://raw.githubusercontent.com/bn0785ac/firefox-beta/master/firefox-52-disable-data-sharing-infobar.patch
+https://raw.githubusercontent.com/bn0785ac/firefox-beta/master/firefox-52-disable-location.services.mozilla.com.patch
+https://raw.githubusercontent.com/bn0785ac/firefox-beta/master/firefox-52-disable-reader.patch
+https://raw.githubusercontent.com/bn0785ac/firefox-beta/master/firefox-52-disable-sponsored-tiles.patch
+https://raw.githubusercontent.com/bn0785ac/firefox-beta/master/firefox-52-disable-telemetry.patch
+https://raw.githubusercontent.com/bn0785ac/firefox-beta/master/firefox-52-prefs.patch)
+sha256sums=('SKIP'
+ 'f068b84ad31556095145d8fefc012dd3d1458948533ed3fff6cbc7250b6e73ed'
+ 'e98a3453d803cc7ddcb81a7dc83f883230dd8591bdf936fc5a868428979ed1f1'
+ 'aba767995ffb1a55345e30aaba667f43d469e23bd9b1b68263cf71b8118acc96'
+ 'ea8e1b871c0f1dd29cdea1b1a2e7f47bf4713e2ae7b947ec832dba7dfcc67daa'
+ 'a7e5d2430bb562f6367deb07417dad4368317e8e8be5d1cfa842c3356de3cfc0'
+ 'cd7ff441da66a287f8712e60cdc9e216c30355d521051e2eaae28a66d81915e8'
+ 'ada313750e6fb14558b37c764409a17c1672a351a46c73b350aa1fe4ea9220ef'
'a2474b32b9b2d7e0fb53a4c89715507ad1c194bef77713d798fa39d507def9e9'
- '68e3a5b47c6d175cc95b98b069a15205f027cab83af9e075818d38610feb6213'
- '440c3e22d98ecf8c44dcedbe90bbb302da3a059e3fc3fba205d89f0eca329cbf'
- 'e4ebdd14096d177d264a7993dbd5df46463605ff45f783732c26d30b9caa53a7')
-validpgpkeys=('2B90598A745E992F315E22C58AB132963A06537A')
+ 'd86e41d87363656ee62e12543e2f5181aadcff448e406ef3218e91865ae775cd'
+ 'bdad68eafe110b9f94a0e025635e32a6ab53e2f9adcd594c8dd2e3225f6453ab'
+ '8d9afa1f940a9dac689ead40a57990d1491f34a1787b2222f8f5b5e485d54103'
+ '7f171b7d69866ac6d8945ab0867b2646964362c791875c6428b4c2c8e3f3fb5b'
+ 'a72c657784dc5804509456d9ba39ccc8d5e5998c847f49abbcfeb2a547290815'
+ '24019d3d7e6b169087d4515db9d3a179239d1e4fe726f0906f6f26877c726040'
+ '80d6181d11c200aca2781f69ffeafb59ea23952304d161c2812a2f5a98b273b0')
# Google API keys (see http://www.chromium.org/developers/how-tos/api-keys)
# Note: These are for Arch Linux use ONLY. For your own distribution, please
# get your own set of keys. Feel free to contact foutrelis@archlinux.org for
# more information.
-_google_api_key=AIzaSyDwr302FpOSkGRpLlUpPThNTDPbXcIn_FM
-_google_default_client_id=413772536636.apps.googleusercontent.com
-_google_default_client_secret=0ZChLK6AxeA3Isu96MkwqDR4
+
# Mozilla API keys (see https://location.services.mozilla.com/api)
# Note: These are for Arch Linux use ONLY. For your own distribution, please
# get your own set of keys. Feel free to contact heftig@archlinux.org for
# more information.
-_mozilla_api_key=16674381-f021-49de-8622-3021c5942aff
prepare() {
- cd $_pkgname-$pkgver
+ mkdir path
+ ln -s /usr/bin/python2 path/python
- cp ../mozconfig .mozconfig
+ cd mozilla-unified
patch -Np1 -i ../firefox-install-dir.patch
- # https://bugzilla.mozilla.org/show_bug.cgi?id=1234158
- patch -Np1 -i ../firefox-gtk3-20.patch
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1314968
+ patch -Np1 -i ../wifi-disentangle.patch
+ patch -Np1 -i ../wifi-fix-interface.patch
+
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1384062
+
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1382942
+ patch -Np1 -i ../no-plt.diff
+
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1400175
+
- # Notifications with libnotify are broken
- # https://bugzilla.mozilla.org/show_bug.cgi?id=1236150
- patch -Np1 -i ../no-libnotify.patch
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1385667
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1394149
- echo -n "$_google_api_key" >google-api-key
- echo "ac_add_options --with-google-api-keyfile=\"$PWD/google-api-key\"" >>.mozconfig
- echo -n "$_google_default_client_id $_google_default_client_secret" >google-oauth-api-key
- echo "ac_add_options --with-google-oauth-api-keyfile=\"$PWD/google-oauth-api-key\"" >>.mozconfig
+patch -Np1 -i ../firefox-52-disable-data-sharing-infobar.patch
+patch -Np1 -i ../firefox-52-disable-location.services.mozilla.com.patch
+patch -Np1 -i ../firefox-52-disable-telemetry.patch
- echo -n "$_mozilla_api_key" >mozilla-api-key
- echo "ac_add_options --with-mozilla-api-keyfile=\"$PWD/mozilla-api-key\"" >>.mozconfig
- mkdir "$srcdir/path"
- ln -s /usr/bin/python2 "$srcdir/path/python"
- # configure script misdetects the preprocessor without an optimization level
- # https://bugs.archlinux.org/task/34644
- sed -i '/ac_cpp=/s/$CPPFLAGS/& -O2/' configure
+ cat >.mozconfig <<END
+ac_add_options --enable-application=browser
- # Fix tab loading icon (doesn't work with libpng 1.6)
- # https://bugzilla.mozilla.org/show_bug.cgi?id=841734
- cp "$srcdir/firefox-fixed-loading-icon.png" \
- browser/themes/linux/tabbrowser/loading.png
+ac_add_options --prefix=/usr
+ac_add_options --enable-release
+ac_add_options --enable-gold
+ac_add_options --enable-pie
+ac_add_options --enable-optimize="-O2"
+ac_add_options --disable-stylo
+
+# Branding
+ac_add_options --enable-official-branding
+ac_add_options --enable-update-channel=release
+ac_add_options --with-distribution-id=org.archlinux
+export MOZILLA_OFFICIAL=1
+export MOZ_TELEMETRY_REPORTING=0
+export MOZ_ADDON_SIGNING=1
+export MOZ_REQUIRE_SIGNING=0
+
+# Keys
+# System libraries
+ac_add_options --with-system-zlib
+ac_add_options --with-system-bz2
+ac_add_options --enable-system-hunspell
+ac_add_options --enable-system-sqlite
+ac_add_options --enable-system-ffi
+ac_add_options --disable-gamepad
+ac_add_options --disable-necko-wifi
+ac_add_options --disable-webspeech
+ac_add_options --disable-webrtc
+
+# Features
+ac_add_options --enable-alsa
+ac_add_options --enable-jack
+ac_add_options --enable-startup-notification
+ac_add_options --enable-crashreporter
+ac_add_options --disable-updater
+END
}
build() {
- cd $_pkgname-$pkgver
+ cd mozilla-unified
+
+ # _FORTIFY_SOURCE causes configure failures
+ CPPFLAGS+=" -O2"
export PATH="$srcdir/path:$PATH"
- export PYTHON="/usr/bin/python2"
+ export MOZ_SOURCE_REPO="$_repo"
# Do PGO
- xvfb-run -a -s "-extension GLX -screen 0 1280x1024x24" \
- make -f client.mk build MOZ_PGO=1
+ #xvfb-run -a -n 95 -s "-extension GLX -screen 0 1280x1024x24" \
+ # MOZ_PGO=1 ./mach build
+ ./mach build
+ ./mach buildsymbols
}
package() {
- cd $_pkgname-$pkgver
- make -f client.mk DESTDIR="$pkgdir" INSTALL_SDK= install
-
- install -Dm644 ../vendor.js "$pkgdir/usr/lib/firefox/browser/defaults/preferences/vendor.js"
+ cd mozilla-unified
+ DESTDIR="$pkgdir" ./mach install
+ find . -name '*crashreporter-symbols-full.zip' -exec cp -fvt "$startdir" {} +
+
+ _vendorjs="$pkgdir/usr/lib/$pkgname/browser/defaults/preferences/vendor.js"
+ install -Dm644 /dev/stdin "$_vendorjs" <<END
+// Use LANG environment variable to choose locale
+pref("intl.locale.matchOS", true);
+
+// Disable default browser checking.
+pref("browser.shell.checkDefaultBrowser", false);
+
+// Don't disable our bundled extensions in the application directory
+pref("extensions.autoDisableScopes", 11);
+pref("extensions.shownSelectionUI", true);
+
+// Opt all of us into e10s, instead of just 50%
+pref("browser.tabs.remote.autostart", true);
+END
+
+ _distini="$pkgdir/usr/lib/$pkgname/distribution/distribution.ini"
+ install -Dm644 /dev/stdin "$_distini" <<END
+[Global]
+id=archlinux
+version=1.0
+about=Mozilla Firefox for Arch Linux
+
+[Preferences]
+app.distributor=archlinux
+app.distributor.channel=$pkgname
+app.partner.archlinux=archlinux
+END
for i in 16 22 24 32 48 256; do
- install -Dm644 browser/branding/official/default$i.png \
- "$pkgdir/usr/share/icons/hicolor/${i}x${i}/apps/firefox.png"
+ install -Dm644 browser/branding/official/default$i.png \
+ "$pkgdir/usr/share/icons/hicolor/${i}x${i}/apps/$pkgname.png"
done
install -Dm644 browser/branding/official/content/icon64.png \
- "$pkgdir/usr/share/icons/hicolor/64x64/apps/firefox.png"
+ "$pkgdir/usr/share/icons/hicolor/64x64/apps/$pkgname.png"
install -Dm644 browser/branding/official/mozicon128.png \
- "$pkgdir/usr/share/icons/hicolor/128x128/apps/firefox.png"
+ "$pkgdir/usr/share/icons/hicolor/128x128/apps/$pkgname.png"
install -Dm644 browser/branding/official/content/about-logo.png \
- "$pkgdir/usr/share/icons/hicolor/192x192/apps/firefox.png"
+ "$pkgdir/usr/share/icons/hicolor/192x192/apps/$pkgname.png"
install -Dm644 browser/branding/official/content/about-logo@2x.png \
- "$pkgdir/usr/share/icons/hicolor/384x384/apps/firefox.png"
+ "$pkgdir/usr/share/icons/hicolor/384x384/apps/$pkgname.png"
install -Dm644 ../firefox-symbolic.svg \
- "$pkgdir/usr/share/icons/hicolor/symbolic/apps/firefox-symbolic.svg"
+ "$pkgdir/usr/share/icons/hicolor/symbolic/apps/$pkgname-symbolic.svg"
- install -Dm644 ../firefox.desktop \
- "$pkgdir/usr/share/applications/firefox.desktop"
+ install -Dm644 ../$pkgname.desktop \
+ "$pkgdir/usr/share/applications/$pkgname.desktop"
# Use system-provided dictionaries
- rm -rf "$pkgdir"/usr/lib/firefox/{dictionaries,hyphenation}
- ln -s /usr/share/hunspell "$pkgdir/usr/lib/firefox/dictionaries"
- ln -s /usr/share/hyphen "$pkgdir/usr/lib/firefox/hyphenation"
+ rm -r "$pkgdir"/usr/lib/$pkgname/dictionaries
+ ln -Ts /usr/share/hunspell "$pkgdir/usr/lib/$pkgname/dictionaries"
+ ln -Ts /usr/share/hyphen "$pkgdir/usr/lib/$pkgname/hyphenation"
+
+ # Install a wrapper to avoid confusion about binary path
+ install -Dm755 /dev/stdin "$pkgdir/usr/bin/$pkgname" <<END
+#!/bin/sh
+exec /usr/lib/$pkgname/firefox "\$@"
+END
- # Replace duplicate binary with symlink
+ # Replace duplicate binary with wrapper
# https://bugzilla.mozilla.org/show_bug.cgi?id=658850
- ln -sf firefox "$pkgdir/usr/lib/firefox/firefox-bin"
+ ln -srf "$pkgdir/usr/bin/$pkgname" \
+ "$pkgdir/usr/lib/$pkgname/firefox-bin"
+
+ # Use system certificates
+ ln -srf "$pkgdir/usr/lib/libnssckbi.so" \
+ "$pkgdir/usr/lib/$pkgname/libnssckbi.so"
}
diff --git a/firefox-52-disable-data-sharing-infobar.patch b/firefox-52-disable-data-sharing-infobar.patch
new file mode 100644
index 000000000000..8c9c0789868c
--- /dev/null
+++ b/firefox-52-disable-data-sharing-infobar.patch
@@ -0,0 +1,7 @@
+--- firefox-45.0esr.bak/browser/base/content/browser.js 2016-03-15
++++ firefox-45.0esr/browser/base/content/browser.js 2016-03-15
+@@ -1689,4 +1689,2 @@
+
+- if (AppConstants.MOZ_DATA_REPORTING)
+- gDataNotificationInfoBar.init();
+
diff --git a/firefox-52-disable-location.services.mozilla.com.patch b/firefox-52-disable-location.services.mozilla.com.patch
new file mode 100644
index 000000000000..42f25557ec75
--- /dev/null
+++ b/firefox-52-disable-location.services.mozilla.com.patch
@@ -0,0 +1,24 @@
+--- firefox-45.0esr.bak/toolkit/components/search/nsSearchService.js 2016-03-13
++++ firefox-45.0esr/toolkit/components/search/nsSearchService.js 2016-03-13
+@@ -436,6 +436,10 @@
+ return;
+ }
+
++ // Prevent Firefox from contacting location.services.mozilla.com on a new profile
++ Services.prefs.setCharPref("browser.search.region", "US");
++ return;
++
+ // If we have 'isUS' but no 'countryCode' then we are almost certainly
+ // a profile from Fx 34/35 that set 'isUS' based purely on a timezone
+ // check. If this said they were US, we force region to be US.
+@@ -522,6 +526,10 @@
+ countryCode = Services.prefs.getCharPref("browser.search.countryCode");
+ } catch(e) {}
+
++ // No countryCode set, use US as default, don't contact location.services.mozilla.com
++ Services.prefs.setCharPref("browser.search.countryCode", "US");
++ return;
++
+ if (!countryCode) {
+ // We don't have it cached, so fetch it. fetchCountryCode() will call
+ // storeCountryCode if it gets a result (even if that happens after the
diff --git a/firefox-52-disable-reader.patch b/firefox-52-disable-reader.patch
new file mode 100644
index 000000000000..5fb85f37950a
--- /dev/null
+++ b/firefox-52-disable-reader.patch
@@ -0,0 +1,104 @@
+--- firefox-52.0esr.bak/browser/base/content/browser.js 2017-03-09
++++ firefox-52.0esr/browser/base/content/browser.js 2017-03-09
+@@ -38,7 +38,6 @@
+ ["ProcessHangMonitor", "resource:///modules/ProcessHangMonitor.jsm"],
+ ["PromiseUtils", "resource://gre/modules/PromiseUtils.jsm"],
+ ["ReaderMode", "resource://gre/modules/ReaderMode.jsm"],
+- ["ReaderParent", "resource:///modules/ReaderParent.jsm"],
+ ["RecentWindow", "resource:///modules/RecentWindow.jsm"],
+ ["SessionStore", "resource:///modules/sessionstore/SessionStore.jsm"],
+ ["ShortcutUtils", "resource://gre/modules/ShortcutUtils.jsm"],
+@@ -4574,7 +4573,6 @@
+ }
+ }
+ UpdateBackForwardCommands(gBrowser.webNavigation);
+- ReaderParent.updateReaderButton(gBrowser.selectedBrowser);
+
+ gGestureSupport.restoreRotationState();
+
+--- firefox-52.0esr.bak/browser/base/content/browser-sets.inc 2017-03-09
++++ firefox-52.0esr/browser/base/content/browser-sets.inc 2017-03-09
+@@ -43,7 +43,6 @@
+ <command id="View:PageSource" oncommand="BrowserViewSource(window.gBrowser.selectedBrowser);" observes="canViewSource"/>
+ <command id="View:PageInfo" oncommand="BrowserPageInfo();"/>
+ <command id="View:FullScreen" oncommand="BrowserFullScreen();"/>
+- <command id="View:ReaderView" oncommand="ReaderParent.toggleReaderMode(event);"/>
+ <command id="cmd_find"
+ oncommand="gFindBar.onFindCommand();"
+ observes="isImage"/>
+--- firefox-52.0esr.bak/browser/base/content/browser.xul 2017-03-09
++++ firefox-52.0esr/browser/base/content/browser.xul 2017-03-09
+@@ -766,10 +766,6 @@
+ hidden="true"
+ tooltiptext="&pageReportIcon.tooltip;"
+ onmousedown="gPopupBlockerObserver.onReportButtonMousedown(event);"/>
+- <image id="reader-mode-button"
+- class="urlbar-icon"
+- hidden="true"
+- onclick="ReaderParent.buttonClick(event);"/>
+ <toolbarbutton id="urlbar-zoom-button"
+ onclick="FullZoom.reset();"
+ tooltiptext="&urlbar.zoomReset.tooltip;"
+--- firefox-52.0esr.bak/browser/components/nsBrowserGlue.js 2017-03-09
++++ firefox-52.0esr/browser/components/nsBrowserGlue.js 2017-03-09
+@@ -53,7 +53,6 @@
+ ["PluralForm", "resource://gre/modules/PluralForm.jsm"],
+ ["PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm"],
+ ["ProcessHangMonitor", "resource:///modules/ProcessHangMonitor.jsm"],
+- ["ReaderParent", "resource:///modules/ReaderParent.jsm"],
+ ["RecentWindow", "resource:///modules/RecentWindow.jsm"],
+ ["RemotePrompt", "resource:///modules/RemotePrompt.jsm"],
+ ["SelfSupportBackend", "resource:///modules/SelfSupportBackend.jsm"],
+@@ -670,7 +669,6 @@
+ ContentPrefServiceParent.init();
+
+ LoginManagerParent.init();
+- ReaderParent.init();
+ URLBarZoom.init();
+
+ SelfSupportBackend.init();
+--- firefox-52.0esr.bak/browser/components/uitour/UITour.jsm 2017-03-09
++++ firefox-52.0esr/browser/components/uitour/UITour.jsm 2017-03-09
+@@ -34,8 +34,6 @@
+ "resource://gre/modules/PrivateBrowsingUtils.jsm");
+ XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode",
+ "resource://gre/modules/ReaderMode.jsm");
+-XPCOMUtils.defineLazyModuleGetter(this, "ReaderParent",
+- "resource:///modules/ReaderParent.jsm");
+
+ // See LOG_LEVELS in Console.jsm. Common examples: "All", "Info", "Warn", & "Error".
+ const PREF_LOG_LEVEL = "browser.uitour.loglevel";
+@@ -661,15 +654,10 @@
+ }
+
+ case "forceShowReaderIcon": {
+- ReaderParent.forceShowReaderIcon(browser);
+ break;
+ }
+
+ case "toggleReaderMode": {
+- let targetPromise = this.getTarget(window, "readerMode-urlBar");
+- targetPromise.then(target => {
+- ReaderParent.toggleReaderMode({target: target.node});
+- });
+ break;
+ }
+
+@@ -1948,7 +1896,6 @@
+ }
+
+ if (aFeature == "readinglist") {
+- ReaderParent.showReaderModeInfoPanel(browser);
+ } else {
+ log.error("startSubTour: Unknown feature option specified");
+ return;
+--- firefox-52.0esr.bak/browser/modules/moz.build 2017-03-09
++++ firefox-52.0esr/browser/modules/moz.build 2017-03-09
+@@ -35,7 +35,6 @@
+ 'PermissionUI.jsm',
+ 'PluginContent.jsm',
+ 'ProcessHangMonitor.jsm',
+- 'ReaderParent.jsm',
+ 'RecentWindow.jsm',
+ 'RemotePrompt.jsm',
+ 'Sanitizer.jsm',
diff --git a/firefox-52-disable-sponsored-tiles.patch b/firefox-52-disable-sponsored-tiles.patch
new file mode 100644
index 000000000000..91214c648bd9
--- /dev/null
+++ b/firefox-52-disable-sponsored-tiles.patch
@@ -0,0 +1,150 @@
+--- firefox-52.0esr.bak/browser/modules/DirectoryLinksProvider.jsm 2017-03-09
++++ firefox-52.0esr/browser/modules/DirectoryLinksProvider.jsm 2017-03-09
+@@ -50,16 +50,16 @@
+ const DIRECTORY_LINKS_TYPE = "application/json";
+
+ // The preference that tells whether to match the OS locale
+-const PREF_MATCH_OS_LOCALE = "intl.locale.matchOS";
++const PREF_MATCH_OS_LOCALE = "";
+
+ // The preference that tells what locale the user selected
+-const PREF_SELECTED_LOCALE = "general.useragent.locale";
++const PREF_SELECTED_LOCALE = "";
+
+ // The preference that tells where to obtain directory links
+-const PREF_DIRECTORY_SOURCE = "browser.newtabpage.directory.source";
++const PREF_DIRECTORY_SOURCE = "";
+
+ // The preference that tells where to send click/view pings
+-const PREF_DIRECTORY_PING = "browser.newtabpage.directory.ping";
++const PREF_DIRECTORY_PING = "";
+
+ // The preference that tells if newtab is enhanced
+ const PREF_NEWTAB_ENHANCED = "browser.newtabpage.enhanced";
+@@ -189,30 +189,6 @@
+ * @return the selected locale or "en-US" if none is selected
+ */
+ get locale() {
+- let matchOS;
+- try {
+- matchOS = Services.prefs.getBoolPref(PREF_MATCH_OS_LOCALE);
+- }
+- catch (e) {}
+-
+- if (matchOS) {
+- return Services.locale.getLocaleComponentForUserAgent();
+- }
+-
+- try {
+- let locale = Services.prefs.getComplexValue(PREF_SELECTED_LOCALE,
+- Ci.nsIPrefLocalizedString);
+- if (locale) {
+- return locale.data;
+- }
+- }
+- catch (e) {}
+-
+- try {
+- return Services.prefs.getCharPref(PREF_SELECTED_LOCALE);
+- }
+- catch (e) {}
+-
+ return "en-US";
+ },
+
+@@ -283,13 +259,6 @@
+ },
+
+ _fetchAndCacheLinks: function DirectoryLinksProvider_fetchAndCacheLinks(uri) {
+- // Replace with the same display locale used for selecting links data
+- uri = uri.replace("%LOCALE%", this.locale);
+- uri = uri.replace("%CHANNEL%", UpdateUtils.UpdateChannel);
+-
+- return this._downloadJsonData(uri).then(json => {
+- return OS.File.writeAtomic(this._directoryFilePath, json, {tmpPath: this._directoryFilePath + ".tmp"});
+- });
+ },
+
+ /**
+@@ -298,33 +267,6 @@
+ * @return promise resolved to json string, "{}" returned if status != 200
+ */
+ _downloadJsonData: function DirectoryLinksProvider__downloadJsonData(uri) {
+- let deferred = Promise.defer();
+- let xmlHttp = this._newXHR();
+-
+- xmlHttp.onload = function(aResponse) {
+- let json = this.responseText;
+- if (this.status && this.status != 200) {
+- json = "{}";
+- }
+- deferred.resolve(json);
+- };
+-
+- xmlHttp.onerror = function(e) {
+- deferred.reject("Fetching " + uri + " results in error code: " + e.target.status);
+- };
+-
+- try {
+- xmlHttp.open("GET", uri);
+- // Override the type so XHR doesn't complain about not well-formed XML
+- xmlHttp.overrideMimeType(DIRECTORY_LINKS_TYPE);
+- // Set the appropriate request type for servers that require correct types
+- xmlHttp.setRequestHeader("Content-Type", DIRECTORY_LINKS_TYPE);
+- xmlHttp.send();
+- } catch (e) {
+- deferred.reject("Error fetching " + uri);
+- Cu.reportError(e);
+- }
+- return deferred.promise;
+ },
+
+ /**
+@@ -332,30 +274,6 @@
+ * @return promise resolved immediately if no download needed, or upon completion
+ */
+ _fetchAndCacheLinksIfNecessary: function DirectoryLinksProvider_fetchAndCacheLinksIfNecessary(forceDownload=false) {
+- if (this._downloadDeferred) {
+- // fetching links already - just return the promise
+- return this._downloadDeferred.promise;
+- }
+-
+- if (forceDownload || this._needsDownload) {
+- this._downloadDeferred = Promise.defer();
+- this._fetchAndCacheLinks(this._linksURL).then(() => {
+- // the new file was successfully downloaded and cached, so update a timestamp
+- this._lastDownloadMS = Date.now();
+- this._downloadDeferred.resolve();
+- this._downloadDeferred = null;
+- this._callObservers("onManyLinksChanged")
+- },
+- error => {
+- this._downloadDeferred.resolve();
+- this._downloadDeferred = null;
+- this._callObservers("onDownloadFail");
+- });
+- return this._downloadDeferred.promise;
+- }
+-
+- // download is not needed
+- return Promise.resolve();
+ },
+
+ /**
+@@ -962,16 +880,6 @@
+ */
+ _loadInadjacentSites: function DirectoryLinksProvider_loadInadjacentSites() {
+ return this._downloadJsonData(this._inadjacentSitesUrl).then(jsonString => {
+- let jsonObject = {};
+- try {
+- jsonObject = JSON.parse(jsonString);
+- }
+- catch (e) {
+- Cu.reportError(e);
+- }
+-
+- this._inadjacentSites = new Set(jsonObject.domains);
+- });
+ },
+
+ /**
diff --git a/firefox-52-disable-telemetry.patch b/firefox-52-disable-telemetry.patch
new file mode 100644
index 000000000000..76b518f3a27b
--- /dev/null
+++ b/firefox-52-disable-telemetry.patch
@@ -0,0 +1,12 @@
+--- firefox-52.0esr.bak/browser/confvars.sh 2017-03-09 09:11:36.643104656 +0100
++++ firefox-52.0esr/browser/confvars.sh 2017-03-09 11:13:13.798231732 +0100
+@@ -62,3 +62,9 @@
+
+ # Include the DevTools client, not just the server (which is the default)
+ MOZ_DEVTOOLS=all
++
++# Reduce data sharing with Mozilla
++MOZ_DATA_REPORTING=0
++MOZ_TELEMETRY_REPORTING=0
++MOZ_CRASHREPORTER=0
++MOZ_SERVICES_HEALTHREPORT=0
diff --git a/firefox-52-prefs.patch b/firefox-52-prefs.patch
new file mode 100644
index 000000000000..e9406e32f1bc
--- /dev/null
+++ b/firefox-52-prefs.patch
@@ -0,0 +1,260 @@
+--- firefox-52.0esr.bak/browser/app/profile/firefox.js 2017-03-09
++++ firefox-52.0esr/browser/app/profile/firefox.js 2017-03-09
+@@ -206,7 +206,7 @@
+ #endif
+
+ // At startup, check if we're the default browser and prompt user if not.
+-pref("browser.shell.checkDefaultBrowser", true);
++pref("browser.shell.checkDefaultBrowser", false);
+ pref("browser.shell.shortcutFavicons",true);
+ pref("browser.shell.mostRecentDateSetAsDefault", "");
+ #ifdef RELEASE_OR_BETA
+@@ -220,7 +220,7 @@
+
+ // 0 = blank, 1 = home (browser.startup.homepage), 2 = last visited page, 3 = resume previous browser session
+ // The behavior of option 3 is detailed at: http://wiki.mozilla.org/Session_Restore
+-pref("browser.startup.page", 1);
++pref("browser.startup.page", 0);
+ pref("browser.startup.homepage", "chrome://branding/locale/browserconfig.properties");
+ // Whether we should skip the homepage when opening the first-run page
+ pref("browser.startup.firstrunSkipsHomepage", false);
+@@ -294,7 +294,7 @@
+ pref("browser.urlbar.suggest.bookmark", true);
+ pref("browser.urlbar.suggest.openpage", true);
+ pref("browser.urlbar.suggest.searches", false);
+-pref("browser.urlbar.userMadeSearchSuggestionsChoice", false);
++pref("browser.urlbar.userMadeSearchSuggestionsChoice", true);
+ // 4 here means the suggestion notification will be automatically
+ // hidden the 4th day, so it will actually be shown on 3 different days.
+ pref("browser.urlbar.daysBeforeHidingSuggestionsPrompt", 4);
+@@ -344,7 +344,7 @@
+ pref("browser.download.animateNotifications", true);
+
+ // This records whether or not the panel has been shown at least once.
+-pref("browser.download.panel.shown", false);
++pref("browser.download.panel.shown", true);
+
+ #ifndef XP_MACOSX
+ pref("browser.helperApps.deleteTempFileOnExit", true);
+@@ -419,7 +419,7 @@
+ // Tabbed browser
+ pref("browser.tabs.closeWindowWithLastTab", true);
+ pref("browser.tabs.insertRelatedAfterCurrent", true);
+-pref("browser.tabs.warnOnClose", true);
++pref("browser.tabs.warnOnClose", false);
+ pref("browser.tabs.warnOnCloseOtherTabs", true);
+ pref("browser.tabs.warnOnOpen", true);
+ pref("browser.tabs.maxOpenBeforeWarn", 15);
+@@ -596,7 +596,7 @@
+ pref("browser.xul.error_pages.expert_bad_cert", false);
+
+ // Enable captive portal detection.
+-pref("network.captive-portal-service.enabled", true);
++pref("network.captive-portal-service.enabled", false);
+
+ // If true, network link events will change the value of navigator.onLine
+ pref("network.manage-offline-status", true);
+@@ -1155,7 +1155,7 @@
+ // Remembers if the about:newtab intro has been shown
+ // NOTE: This preference is unused but was not removed in case
+ // this information will be valuable in the future.
+-pref("browser.newtabpage.introShown", false);
++pref("browser.newtabpage.introShown", true);
+
+ // Toggles the content of 'about:newtab'. Shows the grid when enabled.
+ pref("browser.newtabpage.enabled", true);
+--- firefox-52.0esr.bak/browser/branding/official/pref/firefox-branding.js 2017-03-09
++++ firefox-52.0esr/browser/branding/official/pref/firefox-branding.js 2017-03-09
+@@ -3,8 +3,7 @@
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+ pref("startup.homepage_override_url", "");
+-pref("startup.homepage_welcome_url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/firstrun/");
+-pref("startup.homepage_welcome_url.additional", "");
++pref("startup.homepage_welcome_url", "about:blank");
+ // Interval: Time between checks for a new version (in seconds)
+ pref("app.update.interval", 43200); // 12 hours
+ // The time interval between the downloading of mar file chunks in the
+--- firefox-52.0esr.bak/build/application.ini 2017-03-09
++++ firefox-52.0esr/build/application.ini 2017-03-09
+@@ -43,7 +43,7 @@
+
+ [XRE]
+ #ifdef MOZ_PROFILE_MIGRATOR
+-EnableProfileMigrator=1
++EnableProfileMigrator=0
+ #endif
+
+ #if MOZ_CRASHREPORTER
+--- firefox-52.0esr.bak/toolkit/components/telemetry/healthreport-prefs.js 2017-03-09
++++ firefox-52.0esr/toolkit/components/telemetry/healthreport-prefs.js 2017-03-09
+@@ -5,6 +5,6 @@
+ pref("datareporting.healthreport.infoURL", "https://www.mozilla.org/legal/privacy/firefox.html#health-report");
+
+ // Health Report is enabled by default on all channels.
+-pref("datareporting.healthreport.uploadEnabled", true);
++pref("datareporting.healthreport.uploadEnabled", false);
+
+ pref("datareporting.healthreport.about.reportUrl", "https://fhr.cdn.mozilla.net/%LOCALE%/v4/");
+--- firefox-52.0esr.bak/modules/libpref/init/all.js 2017-03-09
++++ firefox-52.0esr/modules/libpref/init/all.js 2017-03-09
+@@ -29,7 +29,7 @@
+
+ pref("general.config.obscure_value", 13); // for MCD .cfg files
+
+-pref("general.warnOnAboutConfig", true);
++pref("general.warnOnAboutConfig", false);
+
+ // maximum number of dated backups to keep at any time
+ pref("browser.bookmarks.max_backups", 5);
+@@ -1523,7 +1523,7 @@
+
+ // The maximum number of current global half open sockets allowable
+ // when starting a new speculative connection.
+-pref("network.http.speculative-parallel-limit", 6);
++pref("network.http.speculative-parallel-limit", 0);
+
+ // Whether or not to block requests for non head js/css items (e.g. media)
+ // while those elements load.
+@@ -1859,7 +1859,7 @@
+ pref("network.dir.format", 2);
+
+ // enables the prefetch service (i.e., prefetching of <link rel="next"> URLs).
+-pref("network.prefetch-next", true);
++pref("network.prefetch-next", false);
+
+ // enables the predictive service
+ pref("network.predictor.enabled", true);
+@@ -2179,7 +2179,7 @@
+ pref("services.settings.server", "https://firefox.settings.services.mozilla.com/v1");
+
+ // Blocklist preferences
+-pref("extensions.blocklist.enabled", true);
++pref("extensions.blocklist.enabled", false);
+ // OneCRL freshness checking depends on this value, so if you change it,
+ // please also update security.onecrl.maximum_staleness_in_seconds.
+ pref("extensions.blocklist.interval", 86400);
+@@ -3912,7 +3912,7 @@
+
+ // Middle-mouse handling
+ pref("middlemouse.paste", true);
+-pref("middlemouse.contentLoadURL", true);
++pref("middlemouse.contentLoadURL", false);
+ pref("middlemouse.openNewWindow", true);
+ pref("middlemouse.scrollbarPosition", true);
+
+@@ -3975,7 +3975,7 @@
+
+ // Middle-mouse handling
+ pref("middlemouse.paste", true);
+-pref("middlemouse.contentLoadURL", true);
++pref("middlemouse.contentLoadURL", false);
+ pref("middlemouse.openNewWindow", true);
+ pref("middlemouse.scrollbarPosition", true);
+
+@@ -4371,7 +4371,7 @@
+
+ // Satchel (Form Manager) prefs
+ pref("browser.formfill.debug", false);
+-pref("browser.formfill.enable", true);
++pref("browser.formfill.enable", false);
+ pref("browser.formfill.expire_days", 180);
+ pref("browser.formfill.saveHttpsForms", true);
+ pref("browser.formfill.agedWeight", 2);
+@@ -5061,18 +5061,18 @@
+ pref("dom.mapped_arraybuffer.enabled", true);
+
+ // The tables used for Safebrowsing phishing and malware checks.
+-pref("urlclassifier.malwareTable", "goog-malware-shavar,goog-unwanted-shavar,test-malware-simple,test-unwanted-simple");
++pref("urlclassifier.malwareTable", "");
+
+ #ifdef MOZILLA_OFFICIAL
+ // In the official build, we are allowed to use google's private
+ // phishing list "goog-phish-shavar". See Bug 1288840.
+-pref("urlclassifier.phishTable", "goog-phish-shavar,test-phish-simple");
++pref("urlclassifier.phishTable", "");
+ #else
+-pref("urlclassifier.phishTable", "googpub-phish-shavar,test-phish-simple");
++pref("urlclassifier.phishTable", "");
+ #endif
+
+ // Tables for application reputation.
+-pref("urlclassifier.downloadBlockTable", "goog-badbinurl-shavar");
++pref("urlclassifier.downloadBlockTable", "");
+
+ #ifdef XP_WIN
+ // Only download the whitelist on Windows, since the whitelist is
+@@ -5106,48 +5106,48 @@
+ pref("urlclassifier.alternate_error_page", "blocked");
+
+ // Enable phishing protection
+-pref("browser.safebrowsing.phishing.enabled", true);
++pref("browser.safebrowsing.phishing.enabled", false);
+
+ // Enable malware protection
+-pref("browser.safebrowsing.malware.enabled", true);
++pref("browser.safebrowsing.malware.enabled", false);
+
+-pref("browser.safebrowsing.downloads.enabled", true);
+-pref("browser.safebrowsing.downloads.remote.enabled", true);
++pref("browser.safebrowsing.downloads.enabled", false);
++pref("browser.safebrowsing.downloads.remote.enabled", false);
+ pref("browser.safebrowsing.downloads.remote.timeout_ms", 10000);
+-pref("browser.safebrowsing.downloads.remote.url", "https://sb-ssl.google.com/safebrowsing/clientreport/download?key=%GOOGLE_API_KEY%");
+-pref("browser.safebrowsing.downloads.remote.block_dangerous", true);
+-pref("browser.safebrowsing.downloads.remote.block_dangerous_host", true);
+-pref("browser.safebrowsing.downloads.remote.block_potentially_unwanted", true);
+-pref("browser.safebrowsing.downloads.remote.block_uncommon", true);
++pref("browser.safebrowsing.downloads.remote.url", "");
++pref("browser.safebrowsing.downloads.remote.block_dangerous", false);
++pref("browser.safebrowsing.downloads.remote.block_dangerous_host", false);
++pref("browser.safebrowsing.downloads.remote.block_potentially_unwanted", false);
++pref("browser.safebrowsing.downloads.remote.block_uncommon", false);
+ pref("browser.safebrowsing.debug", false);
+
+ // The protocol version we communicate with google server.
+ pref("browser.safebrowsing.provider.google.pver", "2.2");
+-pref("browser.safebrowsing.provider.google.lists", "goog-badbinurl-shavar,goog-downloadwhite-digest256,goog-phish-shavar,googpub-phish-shavar,goog-malware-shavar,goog-unwanted-shavar");
+-pref("browser.safebrowsing.provider.google.updateURL", "https://safebrowsing.google.com/safebrowsing/downloads?client=SAFEBROWSING_ID&appver=%MAJOR_VERSION%&pver=2.2&key=%GOOGLE_API_KEY%");
+-pref("browser.safebrowsing.provider.google.gethashURL", "https://safebrowsing.google.com/safebrowsing/gethash?client=SAFEBROWSING_ID&appver=%MAJOR_VERSION%&pver=2.2");
+-pref("browser.safebrowsing.provider.google.reportURL", "https://safebrowsing.google.com/safebrowsing/diagnostic?client=%NAME%&hl=%LOCALE%&site=");
++pref("browser.safebrowsing.provider.google.lists", "");
++pref("browser.safebrowsing.provider.google.updateURL", "");
++pref("browser.safebrowsing.provider.google.gethashURL", "");
++pref("browser.safebrowsing.provider.google.reportURL", "");
+
+ // Prefs for v4.
+ pref("browser.safebrowsing.provider.google4.pver", "4");
+-pref("browser.safebrowsing.provider.google4.lists", "goog-phish-proto,googpub-phish-proto,goog-malware-proto,goog-unwanted-proto");
+-pref("browser.safebrowsing.provider.google4.updateURL", "https://safebrowsing.googleapis.com/v4/threatListUpdates:fetch?$ct=application/x-protobuf&key=%GOOGLE_API_KEY%");
+-pref("browser.safebrowsing.provider.google4.gethashURL", "https://safebrowsing.googleapis.com/v4/fullHashes:find?$req=%REQUEST_BASE64%&$ct=application/x-protobuf&key=%GOOGLE_API_KEY%");
+-pref("browser.safebrowsing.provider.google4.reportURL", "https://safebrowsing.google.com/safebrowsing/diagnostic?client=%NAME%&hl=%LOCALE%&site=");
+-
+-pref("browser.safebrowsing.reportPhishMistakeURL", "https://%LOCALE%.phish-error.mozilla.com/?hl=%LOCALE%&url=");
+-pref("browser.safebrowsing.reportPhishURL", "https://%LOCALE%.phish-report.mozilla.com/?hl=%LOCALE%&url=");
+-pref("browser.safebrowsing.reportMalwareMistakeURL", "https://%LOCALE%.malware-error.mozilla.com/?hl=%LOCALE%&url=");
++pref("browser.safebrowsing.provider.google4.lists", "");
++pref("browser.safebrowsing.provider.google4.updateURL", "");
++pref("browser.safebrowsing.provider.google4.gethashURL", "");
++pref("browser.safebrowsing.provider.google4.reportURL", "");
++
++pref("browser.safebrowsing.reportPhishMistakeURL", "");
++pref("browser.safebrowsing.reportPhishURL", "");
++pref("browser.safebrowsing.reportMalwareMistakeURL", "");
+
+ // The table and global pref for blocking plugin content
+-pref("browser.safebrowsing.blockedURIs.enabled", true);
++pref("browser.safebrowsing.blockedURIs.enabled", false);
+ pref("urlclassifier.blockedTable", "test-block-simple,mozplugin-block-digest256");
+
+ // The protocol version we communicate with mozilla server.
+ pref("browser.safebrowsing.provider.mozilla.pver", "2.2");
+-pref("browser.safebrowsing.provider.mozilla.lists", "base-track-digest256,mozstd-trackwhite-digest256,content-track-digest256,mozplugin-block-digest256,mozplugin2-block-digest256");
+-pref("browser.safebrowsing.provider.mozilla.updateURL", "https://shavar.services.mozilla.com/downloads?client=SAFEBROWSING_ID&appver=%MAJOR_VERSION%&pver=2.2");
+-pref("browser.safebrowsing.provider.mozilla.gethashURL", "https://shavar.services.mozilla.com/gethash?client=SAFEBROWSING_ID&appver=%MAJOR_VERSION%&pver=2.2");
++pref("browser.safebrowsing.provider.mozilla.lists", "");
++pref("browser.safebrowsing.provider.mozilla.updateURL", "");
++pref("browser.safebrowsing.provider.mozilla.gethashURL", "");
+ // Set to a date in the past to force immediate download in new profiles.
+ pref("browser.safebrowsing.provider.mozilla.nextupdatetime", "1");
+ // Block lists for tracking protection. The name values will be used as the keys
diff --git a/firefox.desktop b/firefox.desktop
index 084f126a0430..2014e9ecfba9 100644
--- a/firefox.desktop
+++ b/firefox.desktop
@@ -1,12 +1,14 @@
[Desktop Entry]
+Version=1.0
Name=Firefox
GenericName=Web Browser
-GenericName[ar]=متصفح ويب
+GenericName[ar]=متصفح وِب
GenericName[ast]=Restolador Web
GenericName[bn]=ওয়েব ব্রাউজার
GenericName[ca]=Navegador web
GenericName[cs]=Webový prohlížeč
GenericName[da]=Webbrowser
+GenericName[de]=Webbrowser
GenericName[el]=Περιηγητής διαδικτύου
GenericName[es]=Navegador web
GenericName[et]=Veebibrauser
@@ -17,7 +19,7 @@ GenericName[gl]=Navegador Web
GenericName[he]=דפדפן אינטרנט
GenericName[hr]=Web preglednik
GenericName[hu]=Webböngésző
-GenericName[it]=Browser web
+GenericName[it]=Browser Web
GenericName[ja]=ウェブ・ブラウザ
GenericName[ko]=웹 브라우저
GenericName[ku]=Geroka torê
@@ -40,11 +42,11 @@ GenericName[uk]=Веб-браузер
GenericName[vi]=Trình duyệt Web
GenericName[zh_CN]=网络浏览器
GenericName[zh_TW]=網路瀏覽器
-Comment=Browse the World Wide Web
-Comment[ar]=تصفح الشبكة العنكبوتية العالمية
+Comment=Browse the Web
+Comment[ar]=تصفح الوِب
Comment[ast]=Restola pela Rede
Comment[bn]=ইন্টারনেট ব্রাউজ করুন
-Comment[ca]=Navegueu per la web
+Comment[ca]=Navegueu per el web
Comment[cs]=Prohlížení stránek World Wide Webu
Comment[da]=Surf på internettet
Comment[de]=Im Internet surfen
@@ -81,211 +83,151 @@ Comment[uk]=Перегляд сторінок Інтернету
Comment[vi]=Để duyệt các trang web
Comment[zh_CN]=浏览互联网
Comment[zh_TW]=瀏覽網際網路
-Exec=firefox %u
+Exec=/usr/lib/firefox/firefox %u
+Icon=firefox
Terminal=false
Type=Application
-Icon=firefox
-Categories=Network;WebBrowser;
-MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
+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
-Actions=NewTab;NewWindow;NewPrivateWindow;
-
-[Desktop Action NewTab]
-Name=Open new tab
-Name[ach]=Yab dirica matidi manyen
-Name[af]=Open nuwe oortjie
-Name[an]=Ubrir una pestanya nueva
-Name[ar]=افتح لسانًا جديدًا
-Name[as]=নতুন টেব খোলক
-Name[ast]=Abrir llingüeta nueva
-Name[az]=Yeni vərəq aç
-Name[be]=Адкрыць новую ўстаўку
-Name[bg]=Отваряне на нов подпрозорец
-Name[bn_BD]=নতুন ট্যাব খুলুন
-Name[bn_IN]=নতুন ট্যাব খুলুন
-Name[br]=Digeriñ un ivinell nevez
-Name[bs]=Otvori novi tab
-Name[ca]=Obre una pestanya nova
-Name[cs]=Otevřít nový panel
-Name[cy]=Agor tab newydd
-Name[da]=Åbn nyt faneblad
-Name[de]=Neuen Tab öffnen
-Name[dsb]=Nowy rejtark wócyniś
-Name[el]=Άνοιγμα νέας καρτέλας
-Name[eo]=Malfermi novan langeton
-Name[es_AR]=Abrir nueva pestaña
-Name[es_CL]=Abrir nueva pestaña
-Name[es_ES]=Abrir pestaña nueva
-Name[es_MX]=Abrir una pestaña nueva
-Name[et]=Ava uus kaart
-Name[eu]=Ireki fitxa berria
-Name[ff]=Uddit tabbere hesere
-Name[fi]=Avaa uusi välilehti
-Name[fr]=Ouvrir un nouvel onglet
-Name[fy_NL]=Iepenje nij ljepblêd
-Name[ga_IE]=Oscail i gcluaisín nua
-Name[gd]=Fosgail taba ùr
-Name[gl]=Abrir unha nova lapela
-Name[gu_IN]=નવી ટૅબને ખોલો
-Name[he]=פתיחת לשונית חדשה
-Name[hi_IN]=नया टैब खोलें
-Name[hr]=Otvori novu karticu
-Name[hsb]=Nowy rajtark wočinić
-Name[hu]=Új lap megnyitása
-Name[hy_AM]=Բացել նոր ներդիր
-Name[id]=Buka tab baru
-Name[is]=Opna nýjan flipa
-Name[it]=Apri nuova scheda
-Name[ja]=新しいタブ
-Name[kk]=Жаңа бетті ашу
-Name[kn]=ಹೊಸ ಹಾಳೆಯನ್ನು ತೆರೆ
-Name[ko]=새 탭 열기
-Name[lij]=Àrvi nêuvo féuggio
-Name[lt]=Atverti naują kortelę
-Name[mai]=नव टैब खोलू
-Name[mk]=Отвори ново јазиче
-Name[ml]=പുതിയ റ്റാബ് തുറക്കുക
-Name[mr]=नवीन टॅब उघडा
-Name[ms]=Buka tab baru
-Name[nb_NO]=Åpne ny fane
-Name[nl]=Nieuw tabblad openen
-Name[nn_NO]=Opna ny fane
-Name[or]=ନୂତନ ଟ୍ୟାବ ଖୋଲନ୍ତୁ
-Name[pa_IN]=ਨਵੀਂ ਟੈਬ ਖੋਲ੍ਹੋ
-Name[pl]=Otwórz nową kartę
-Name[pt_BR]=Nova aba
-Name[pt_PT]=Abrir novo separador
-Name[rm]=Avrir in nov tab
-Name[ro]=Deschide o filă nouă
-Name[ru]=Открыть новую вкладку
-Name[si]=නව ටැබය විවෘත කරන්න
-Name[sk]=Otvoriť novú kartu
-Name[sl]=Odpri nov zavihek
-Name[son]=Nor loku taaga feeri
-Name[sq]=Hap skedë të re
-Name[sr]=Отвори нови језичак
-Name[sv_SE]=Öppna ny flik
-Name[ta]=புதிய கீற்றைத் திற
-Name[te]=కొత్త టాబ్ తెరువుము
-Name[th]=เปิดแท็บใหม่
-Name[tr]=Yeni sekme aç
-Name[uk]=Відкрити нову вкладку
-Name[uz]=Yangi ichki oyna ochish
-Name[vi]=Mở thẻ mới
-Name[xh]=Vula ithebhu entsha
-Name[zh_CN]=打开新标签页
-Name[zh_TW]=開啟新分頁
-Exec=firefox -new-tab about:newtab
+Categories=Network;WebBrowser;
+Keywords=web;browser;internet;
+Actions=new-window;new-private-window;
-[Desktop Action NewWindow]
-Name=Open new window
-Name[ach]=Yab dirica manyen
-Name[af]=Open nuwe venster
-Name[an]=Ubrir una nueva finestra
-Name[ar]=افتح نافذة جديدة
-Name[as]=নতুন উইন্ডো খোলক
-Name[ast]=Abrir ventana nueva
-Name[az]=Yeni pəncərə aç
-Name[be]=Адкрыць новае акно
-Name[bg]=Отваряне на нов прозорец
-Name[bn_BD]=নতুন উইন্ডো খুলুন
-Name[bn_IN]=নতুন উইন্ডো খুলুন
-Name[br]=Digeriñ ur prenestr nevez
-Name[bs]=Otvori novi prozor
-Name[ca]=Obre una finestra nova
-Name[cs]=Otevřít nové okno
-Name[cy]=Agor ffenestr newydd
-Name[da]=Åbn nyt vindue
-Name[de]=Neues Fenster öffnen
-Name[dsb]=Nowe wokno wócyniś
-Name[el]=Άνοιγμα νέου παραθύρου
-Name[eo]=Malfermi novan fenestron
-Name[es_AR]=Abrir nueva ventana
-Name[es_CL]=Abrir nueva ventana
-Name[es_ES]=Abrir nueva ventana
-Name[es_MX]=Abrir nueva ventana
-Name[et]=Ava uus aken
-Name[eu]=Ireki leiho berria
-Name[ff]=Uddit henorde hesere
-Name[fi]=Avaa uusi ikkuna
-Name[fr]=Ouvrir une nouvelle fenêtre
-Name[fy_NL]=Iepenje nij finster
-Name[ga_IE]=Oscail fuinneog nua
-Name[gd]=Fosgail uinneag ùr
-Name[gl]=Abrir unha nova xanela
-Name[gu_IN]=નવી વિન્ડોને ખોલો
-Name[he]=פתח חלון חדש
-Name[hi_IN]=नई विंडो खोलें
-Name[hr]=Otvori novi prozor
-Name[hsb]=Nowe wokno wočinić
-Name[hu]=Új ablak megnyitása
-Name[hy_AM]=Բացել նոր պատուհան
-Name[id]=Buka jendela baru
-Name[is]=Opna nýjan glugga
-Name[it]=Apri nuova finestra
+[Desktop Action new-window]
+Name=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[kk]=Жаңа терезені ашу
-Name[kn]=ಹೊಸ ವಿಂಡೊವನ್ನು ತೆರೆ
-Name[ko]=새 창 열기
-Name[lij]=Àrvi nêuvo barcón
-Name[lt]=Atverti naują langą
-Name[mai]=नई विंडो खोलू
-Name[mk]=Отвори нов прозорец
-Name[ml]=പുതിയ ജാലകം തുറക്കുക
-Name[mr]=नवीन पटल उघडा
-Name[ms]=Buka tetingkap baru
-Name[nb_NO]=Åpne nytt vindu
-Name[nl]=Een nieuw venster openen
-Name[nn_NO]=Opna nytt vindauge
-Name[or]=ନୂତନ ୱିଣ୍ଡୋ ଖୋଲନ୍ତୁ
-Name[pa_IN]=ਨਵੀਂ ਵਿੰਡੋ ਖੋਲ੍ਹੋ
-Name[pl]=Otwórz nowe okno
+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]=Abrir nova janela
-Name[rm]=Avrir ina nova fanestra
-Name[ro]=Deschide o nouă fereastră
-Name[ru]=Открыть новое окно
-Name[si]=නව කවුළුවක් විවෘත කරන්න
-Name[sk]=Otvoriť nové okno
-Name[sl]=Odpri novo okno
-Name[son]=Zanfun taaga feeri
-Name[sq]=Hap dritare të re
-Name[sr]=Отвори нови прозор
-Name[sv_SE]=Öppna nytt fönster
-Name[ta]=புதிய சாளரத்தை திற
-Name[te]=కొత్త విండో తెరువుము
-Name[th]=เปิดหน้าต่างใหม่
-Name[tr]=Yeni pencere aç
-Name[uk]=Відкрити нове вікно
-Name[uz]=Yangi oyna ochish
-Name[vi]=Mở cửa sổ mới
-Name[xh]=Vula iwindow entsha
-Name[zh_CN]=打开新窗口
-Name[zh_TW]=開啟新視窗
-Exec=firefox -new-window
+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=/usr/lib/firefox/firefox --new-window %u
-[Desktop Action NewPrivateWindow]
-Name=New private window
+[Desktop Action new-private-window]
+Name=New Private Window
Name[ach]=Dirica manyen me mung
Name[af]=Nuwe privaatvenster
-Name[an]=Nueva finestra de navegación privada
+Name[an]=Nueva finestra privada
Name[ar]=نافذة خاصة جديدة
Name[as]=নতুন ব্যক্তিগত উইন্ডো
Name[ast]=Ventana privada nueva
-Name[az]=Yeni məxfi pəncərə
+Name[az]=Yeni Məxfi Pəncərə
Name[be]=Новае акно адасаблення
Name[bg]=Нов прозорец за поверително сърфиране
Name[bn_BD]=নতুন ব্যক্তিগত উইন্ডো
-Name[bn_IN]=নতুন ব্যাক্তিগত উইন্ডো
+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[cy]=Ffenestr Breifat Newydd
Name[da]=Nyt privat vindue
-Name[de]=Neues privates Fenster öffnen
+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
@@ -293,60 +235,76 @@ Name[es_ES]=Nueva ventana privada
Name[es_MX]=Nueva ventana privada
Name[et]=Uus privaatne aken
Name[eu]=Leiho pribatu berria
-Name[ff]=Henorde suturo hesere
+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[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[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 einkagluggi
+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[ko]=새 사생활 보호 모드
+Name[kok]=नवो खाजगी विंडो
+Name[ks]=نْو پرایوٹ وینڈو
Name[lij]=Nêuvo barcón privòu
-Name[lt]=Atverti privačiojo naršymo langą
-Name[mai]=नव निज विंडो
-Name[mk]=Нов прозорец за приватно сурфање
+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 peribadi baharu
+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 w trybie prywatnym
+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ă fără urme nouă
+Name[ro]=Fereastră privată nouă
Name[ru]=Новое приватное окно
-Name[si]=නව පුද්ගලික කවුළුව
+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[sq]=Dritare e Re Private
+Name[sr]=Нови приватан прозор
Name[sv_SE]=Nytt privat fönster
Name[ta]=புதிய தனிப்பட்ட சாளரம்
Name[te]=కొత్త ఆంతరంగిక విండో
-Name[th]=หน้าต่างท่องเว็บแบบส่วนตัวใหม่
+Name[th]=หน้าต่างส่วนตัวใหม่
Name[tr]=Yeni gizli pencere
-Name[uk]=Нове приватне вікно
-Name[uz]=Yangi shaxsiy oyna
+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
+Exec=/usr/lib/firefox/firefox --private-window %u
diff --git a/glibc-2.26-fix.diff b/glibc-2.26-fix.diff
new file mode 100644
index 000000000000..48733ab899bb
--- /dev/null
+++ b/glibc-2.26-fix.diff
@@ -0,0 +1,258 @@
+From 6a0b7c8ecf0734ba1bcdccf8e0ee97e721fd5420 Mon Sep 17 00:00:00 2001
+Message-Id: <6a0b7c8ecf0734ba1bcdccf8e0ee97e721fd5420.1505113337.git.jan.steffens@gmail.com>
+From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= <emilio@crisal.io>
+Date: Sat, 19 Aug 2017 20:14:25 +0200
+Subject: [PATCH] Fix use of struct ucontext (squash 2 commits)
+
+Needed for building with glibc 2.26.
+
+Bug 1385667: Use ucontext_t consistently in breakpad-client. r=ted
+MozReview-Commit-ID: AJhzJdNXP0f
+
+Bug 1394149: Fix remaining uses of ucontext in breakpad-client. r=ted
+MozReview-Commit-ID: 5tP7fXsI7dQ
+---
+ .../linux/dump_writer_common/ucontext_reader.cc | 30 +++++++++++-----------
+ .../linux/dump_writer_common/ucontext_reader.h | 10 ++++----
+ .../linux/handler/exception_handler.cc | 10 ++++----
+ .../linux/handler/exception_handler.h | 2 +-
+ .../linux/microdump_writer/microdump_writer.cc | 2 +-
+ .../linux/minidump_writer/minidump_writer.cc | 2 +-
+ 6 files changed, 28 insertions(+), 28 deletions(-)
+
+diff --git a/toolkit/crashreporter/breakpad-client/linux/dump_writer_common/ucontext_reader.cc b/toolkit/crashreporter/breakpad-client/linux/dump_writer_common/ucontext_reader.cc
+index 999960912e459e1b..303c0ebd32b663c4 100644
+--- a/toolkit/crashreporter/breakpad-client/linux/dump_writer_common/ucontext_reader.cc
++++ b/toolkit/crashreporter/breakpad-client/linux/dump_writer_common/ucontext_reader.cc
+@@ -40,15 +40,15 @@ namespace google_breakpad {
+
+ #if defined(__i386__)
+
+-uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.gregs[REG_ESP];
+ }
+
+-uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.gregs[REG_EIP];
+ }
+
+-void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc,
++void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
+ const struct _libc_fpstate* fp) {
+ const greg_t* regs = uc->uc_mcontext.gregs;
+
+@@ -88,15 +88,15 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc,
+
+ #elif defined(__x86_64)
+
+-uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.gregs[REG_RSP];
+ }
+
+-uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.gregs[REG_RIP];
+ }
+
+-void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc,
++void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
+ const struct _libc_fpstate* fpregs) {
+ const greg_t* regs = uc->uc_mcontext.gregs;
+
+@@ -145,15 +145,15 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc,
+
+ #elif defined(__ARM_EABI__)
+
+-uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.arm_sp;
+ }
+
+-uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.arm_pc;
+ }
+
+-void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc) {
++void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+ out->context_flags = MD_CONTEXT_ARM_FULL;
+
+ out->iregs[0] = uc->uc_mcontext.arm_r0;
+@@ -184,41 +184,41 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc) {
+
+ #elif defined(__aarch64__)
+
+-uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.sp;
+ }
+
+-uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.pc;
+ }
+
+-void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc,
++void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
+ const struct fpsimd_context* fpregs) {
+ out->context_flags = MD_CONTEXT_ARM64_FULL;
+
+ out->cpsr = static_cast<uint32_t>(uc->uc_mcontext.pstate);
+ for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i)
+ out->iregs[i] = uc->uc_mcontext.regs[i];
+ out->iregs[MD_CONTEXT_ARM64_REG_SP] = uc->uc_mcontext.sp;
+ out->iregs[MD_CONTEXT_ARM64_REG_PC] = uc->uc_mcontext.pc;
+
+ out->float_save.fpsr = fpregs->fpsr;
+ out->float_save.fpcr = fpregs->fpcr;
+ my_memcpy(&out->float_save.regs, &fpregs->vregs,
+ MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT * 16);
+ }
+
+ #elif defined(__mips__)
+
+-uintptr_t UContextReader::GetStackPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP];
+ }
+
+-uintptr_t UContextReader::GetInstructionPointer(const struct ucontext* uc) {
++uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) {
+ return uc->uc_mcontext.pc;
+ }
+
+-void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext *uc) {
++void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc) {
+ #if _MIPS_SIM == _ABI64
+ out->context_flags = MD_CONTEXT_MIPS64_FULL;
+ #elif _MIPS_SIM == _ABIO32
+diff --git a/toolkit/crashreporter/breakpad-client/linux/dump_writer_common/ucontext_reader.h b/toolkit/crashreporter/breakpad-client/linux/dump_writer_common/ucontext_reader.h
+index c533e28ba7441e83..039752a2dfb6e589 100644
+--- a/toolkit/crashreporter/breakpad-client/linux/dump_writer_common/ucontext_reader.h
++++ b/toolkit/crashreporter/breakpad-client/linux/dump_writer_common/ucontext_reader.h
+@@ -41,21 +41,21 @@ namespace google_breakpad {
+
+ // Wraps platform-dependent implementations of accessors to ucontext structs.
+ struct UContextReader {
+- static uintptr_t GetStackPointer(const struct ucontext* uc);
++ static uintptr_t GetStackPointer(const ucontext_t* uc);
+
+- static uintptr_t GetInstructionPointer(const struct ucontext* uc);
++ static uintptr_t GetInstructionPointer(const ucontext_t* uc);
+
+ // Juggle a arch-specific ucontext into a minidump format
+ // out: the minidump structure
+ // info: the collection of register structures.
+ #if defined(__i386__) || defined(__x86_64)
+- static void FillCPUContext(RawContextCPU *out, const ucontext *uc,
++ static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
+ const struct _libc_fpstate* fp);
+ #elif defined(__aarch64__)
+- static void FillCPUContext(RawContextCPU *out, const ucontext *uc,
++ static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
+ const struct fpsimd_context* fpregs);
+ #else
+- static void FillCPUContext(RawContextCPU *out, const ucontext *uc);
++ static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
+ #endif
+ };
+
+diff --git a/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.cc b/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.cc
+index 71a51a763938e39d..12df9bc96ec45fea 100644
+--- a/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.cc
++++ b/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.cc
+@@ -439,44 +439,44 @@ bool ExceptionHandler::HandleSignal(int sig, siginfo_t* info, void* uc) {
+ // Fill in all the holes in the struct to make Valgrind happy.
+ memset(&g_crash_context_, 0, sizeof(g_crash_context_));
+ memcpy(&g_crash_context_.siginfo, info, sizeof(siginfo_t));
+- memcpy(&g_crash_context_.context, uc, sizeof(struct ucontext));
++ memcpy(&g_crash_context_.context, uc, sizeof(ucontext_t));
+ #if defined(__aarch64__)
+- struct ucontext* uc_ptr = (struct ucontext*)uc;
++ ucontext_t* uc_ptr = (ucontext_t*)uc;
+ struct fpsimd_context* fp_ptr =
+ (struct fpsimd_context*)&uc_ptr->uc_mcontext.__reserved;
+ if (fp_ptr->head.magic == FPSIMD_MAGIC) {
+ memcpy(&g_crash_context_.float_state, fp_ptr,
+ sizeof(g_crash_context_.float_state));
+ }
+ #elif !defined(__ARM_EABI__) && !defined(__mips__)
+ // FP state is not part of user ABI on ARM Linux.
+- // In case of MIPS Linux FP state is already part of struct ucontext
++ // In case of MIPS Linux FP state is already part of ucontext_t
+ // and 'float_state' is not a member of CrashContext.
+- struct ucontext* uc_ptr = (struct ucontext*)uc;
++ ucontext_t* uc_ptr = (ucontext_t*)uc;
+ if (uc_ptr->uc_mcontext.fpregs) {
+ memcpy(&g_crash_context_.float_state, uc_ptr->uc_mcontext.fpregs,
+ sizeof(g_crash_context_.float_state));
+ }
+ #endif
+ g_crash_context_.tid = syscall(__NR_gettid);
+ if (crash_handler_ != NULL) {
+ if (crash_handler_(&g_crash_context_, sizeof(g_crash_context_),
+ callback_context_)) {
+ return true;
+ }
+ }
+ return GenerateDump(&g_crash_context_);
+ }
+
+ // This is a public interface to HandleSignal that allows the client to
+ // generate a crash dump. This function may run in a compromised context.
+ bool ExceptionHandler::SimulateSignalDelivery(int sig) {
+ siginfo_t siginfo = {};
+ // Mimic a trusted signal to allow tracing the process (see
+ // ExceptionHandler::HandleSignal().
+ siginfo.si_code = SI_USER;
+ siginfo.si_pid = getpid();
+- struct ucontext context;
++ ucontext_t context;
+ getcontext(&context);
+ return HandleSignal(sig, &siginfo, &context);
+ }
+diff --git a/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.h b/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.h
+index 711586fec7ddae59..be1880170e2826b0 100644
+--- a/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.h
++++ b/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.h
+@@ -191,7 +191,7 @@ class ExceptionHandler {
+ struct CrashContext {
+ siginfo_t siginfo;
+ pid_t tid; // the crashing thread.
+- struct ucontext context;
++ ucontext_t context;
+ #if !defined(__ARM_EABI__) && !defined(__mips__)
+ // #ifdef this out because FP state is not part of user ABI for Linux ARM.
+ // In case of MIPS Linux FP state is already part of struct
+diff --git a/toolkit/crashreporter/breakpad-client/linux/microdump_writer/microdump_writer.cc b/toolkit/crashreporter/breakpad-client/linux/microdump_writer/microdump_writer.cc
+index ff20bf36584c876b..a0b90e08fc5f0cff 100644
+--- a/toolkit/crashreporter/breakpad-client/linux/microdump_writer/microdump_writer.cc
++++ b/toolkit/crashreporter/breakpad-client/linux/microdump_writer/microdump_writer.cc
+@@ -571,7 +571,7 @@ class MicrodumpWriter {
+
+ void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); }
+
+- const struct ucontext* const ucontext_;
++ const ucontext_t* const ucontext_;
+ #if !defined(__ARM_EABI__) && !defined(__mips__)
+ const google_breakpad::fpstate_t* const float_state_;
+ #endif
+diff --git a/toolkit/crashreporter/breakpad-client/linux/minidump_writer/minidump_writer.cc b/toolkit/crashreporter/breakpad-client/linux/minidump_writer/minidump_writer.cc
+index 0650bb95c179464a..6b5304bcd605ca3a 100644
+--- a/toolkit/crashreporter/breakpad-client/linux/minidump_writer/minidump_writer.cc
++++ b/toolkit/crashreporter/breakpad-client/linux/minidump_writer/minidump_writer.cc
+@@ -1247,7 +1247,7 @@ class MinidumpWriter {
+ const int fd_; // File descriptor where the minidum should be written.
+ const char* path_; // Path to the file where the minidum should be written.
+
+- const struct ucontext* const ucontext_; // also from the signal handler
++ const ucontext_t* const ucontext_; // also from the signal handler
+ #if !defined(__ARM_EABI__) && !defined(__mips__)
+ const google_breakpad::fpstate_t* const float_state_; // ditto
+ #endif
+--
+2.14.1
+
diff --git a/no-plt.diff b/no-plt.diff
new file mode 100644
index 000000000000..9014f8b791c7
--- /dev/null
+++ b/no-plt.diff
@@ -0,0 +1,48 @@
+diff --git i/security/nss/lib/freebl/mpi/mpi_x86.s w/security/nss/lib/freebl/mpi/mpi_x86.s
+index 8f7e2130c3264754..b3ca1ce5b41b3771 100644
+--- i/security/nss/lib/freebl/mpi/mpi_x86.s
++++ w/security/nss/lib/freebl/mpi/mpi_x86.s
+@@ -22,22 +22,41 @@ is_sse: .long -1
+ #
+ .ifndef NO_PIC
+ .macro GET var,reg
+- movl \var@GOTOFF(%ebx),\reg
++ call thunk.ax
++ addl $_GLOBAL_OFFSET_TABLE_, %eax
++ movl \var@GOTOFF(%eax),\reg
+ .endm
+ .macro PUT reg,var
+- movl \reg,\var@GOTOFF(%ebx)
++ call thunk.dx
++ addl $_GLOBAL_OFFSET_TABLE_, %edx
++ movl \reg,\var@GOTOFF(%edx)
+ .endm
+ .else
+ .macro GET var,reg
+ movl \var,\reg
+ .endm
+ .macro PUT reg,var
+ movl \reg,\var
+ .endm
+ .endif
+
+ .text
+
++.ifndef NO_PIC
++.globl thunk.ax
++.hidden thunk.ax
++.type thunk.ax, @function
++thunk.ax:
++ movl (%esp),%eax
++ ret
++
++.globl thunk.dx
++.hidden thunk.dx
++.type thunk.dx, @function
++thunk.dx:
++ movl (%esp),%edx
++ ret
++.endif
+
+ # ebp - 36: caller's esi
+ # ebp - 32: caller's edi
diff --git a/plugin-crash.diff b/plugin-crash.diff
new file mode 100644
index 000000000000..a9d0ce2e622d
--- /dev/null
+++ b/plugin-crash.diff
@@ -0,0 +1,50 @@
+
+# HG changeset patch
+# User Jan Steffens <jan.steffens@gmail.com>
+# Date 1505475854 -7200
+# Node ID 3cd2263687293a229277037090add3bea2531057
+# Parent 70f5f23a429f3d621e44307c191fa84c77fb2f61
+Bug 1400175 - Stub gdk_screen_get_monitor_workarea in mozgtk2; r?karlt
+
+MozReview-Commit-ID: 72K6U17JuoK
+
+diff --git a/widget/gtk/mozgtk/mozgtk.c b/widget/gtk/mozgtk/mozgtk.c
+--- a/widget/gtk/mozgtk/mozgtk.c
++++ b/widget/gtk/mozgtk/mozgtk.c
+@@ -56,17 +56,16 @@
+ STUB(gdk_screen_get_default)
+ STUB(gdk_screen_get_display)
+ STUB(gdk_screen_get_font_options)
+ STUB(gdk_screen_get_height)
+ STUB(gdk_screen_get_height_mm)
+ STUB(gdk_screen_get_n_monitors)
+ STUB(gdk_screen_get_monitor_at_window)
+ STUB(gdk_screen_get_monitor_geometry)
+-STUB(gdk_screen_get_monitor_workarea)
+ STUB(gdk_screen_get_monitor_height_mm)
+ STUB(gdk_screen_get_number)
+ STUB(gdk_screen_get_resolution)
+ STUB(gdk_screen_get_rgba_visual)
+ STUB(gdk_screen_get_root_window)
+ STUB(gdk_screen_get_system_visual)
+ STUB(gdk_screen_get_width)
+ STUB(gdk_screen_height)
+@@ -514,16 +513,17 @@
+ #ifdef GTK3_SYMBOLS
+ STUB(gdk_device_get_source)
+ STUB(gdk_device_manager_get_client_pointer)
+ STUB(gdk_disable_multidevice)
+ STUB(gdk_device_manager_list_devices)
+ STUB(gdk_display_get_device_manager)
+ STUB(gdk_error_trap_pop_ignored)
+ STUB(gdk_event_get_source_device)
++STUB(gdk_screen_get_monitor_workarea)
+ STUB(gdk_window_get_type)
+ STUB(gdk_window_get_window_type)
+ STUB(gdk_x11_window_get_xid)
+ STUB(gdk_x11_display_get_type)
+ STUB(gdk_wayland_display_get_type)
+ STUB(gtk_box_new)
+ STUB(gtk_cairo_should_draw_window)
+ STUB(gtk_cairo_transform_to_window)
+
diff --git a/upload-symbol-archive b/upload-symbol-archive
new file mode 100755
index 000000000000..3a7b45c82277
--- /dev/null
+++ b/upload-symbol-archive
@@ -0,0 +1,23 @@
+#!/bin/bash -e
+
+die() {
+ echo >&2 "$@"
+ exit 1
+}
+
+(( $# >= 2 )) || die "Usage: $0 TOKEN-FILE SYMBOL-ARCHIVE..."
+token="$1"
+shift
+
+[[ -f $token && -s $token ]] || die "Invalid TOKEN-FILE ${token@Q}"
+
+for zip; do
+ [[ $(file -Ebi "$zip") == application/zip* ]] || die "Invalid SYMBOL-ARCHIVE ${zip@Q}"
+done
+
+for zip; do
+ echo >&2 "Uploading ${zip@Q} ..."
+ curl -X POST -H "Auth-Token: $(<"$token")" -F "${zip##*/}=@$zip" \
+ https://crash-stats.mozilla.com/symbols/upload
+ echo
+done
diff --git a/wifi-disentangle.patch b/wifi-disentangle.patch
new file mode 100644
index 000000000000..8f474b9c0fec
--- /dev/null
+++ b/wifi-disentangle.patch
@@ -0,0 +1,245 @@
+# HG changeset patch
+# Parent 2edd69b245fbc493c3a1cf17c40c63b0280ead12
+Bug 1314968 - Disentangle nsWifiScannerDBus::SendMessage. r?kanru
+
+Make a copy of the function and specialize it for each message sent.
+Avoids the mess of comparing the method name to figure out what to do.
+
+diff --git a/netwerk/wifi/nsWifiScannerDBus.cpp b/netwerk/wifi/nsWifiScannerDBus.cpp
+--- a/netwerk/wifi/nsWifiScannerDBus.cpp
++++ b/netwerk/wifi/nsWifiScannerDBus.cpp
+@@ -34,19 +34,47 @@ nsWifiScannerDBus::Scan()
+ if (!mConnection) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+- return SendMessage("org.freedesktop.NetworkManager",
+- "/org/freedesktop/NetworkManager",
+- "GetDevices");
++ return SendGetDevices();
+ }
+
++// http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html
++// Refer to function dbus_connection_send_with_reply_and_block.
++static const uint32_t DBUS_DEFAULT_TIMEOUT = -1;
++
+ nsresult
+-nsWifiScannerDBus::SendMessage(const char* aInterface,
+- const char* aPath,
+- const char* aFuncCall)
+-{
+- RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
+- dbus_message_new_method_call("org.freedesktop.NetworkManager",
+- aPath, aInterface, aFuncCall));
++nsWifiScannerDBus::SendGetDevices()
++{
++ RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
++ dbus_message_new_method_call("org.freedesktop.NetworkManager",
++ "/org/freedesktop/NetworkManager",
++ "org.freedesktop.NetworkManager",
++ "GetDevices"));
++ if (!msg) {
++ return NS_ERROR_FAILURE;
++ }
++
++ DBusError err;
++ dbus_error_init(&err);
++
++ RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
++ dbus_connection_send_with_reply_and_block(mConnection, msg,
++ DBUS_DEFAULT_TIMEOUT, &err));
++ if (dbus_error_is_set(&err)) {
++ dbus_error_free(&err);
++ return NS_ERROR_FAILURE;
++ }
++
++ return IdentifyDevices(reply);
++}
++
++nsresult
++nsWifiScannerDBus::SendGetDeviceType(const char* aPath)
++{
++ RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
++ dbus_message_new_method_call("org.freedesktop.NetworkManager",
++ aPath,
++ "org.freedesktop.DBus.Properties",
++ "Get"));
+ if (!msg) {
+ return NS_ERROR_FAILURE;
+ }
+@@ -54,58 +82,92 @@ nsWifiScannerDBus::SendMessage(const cha
+ DBusMessageIter argsIter;
+ dbus_message_iter_init_append(msg, &argsIter);
+
+- if (!strcmp(aFuncCall, "Get")) {
+- const char* paramInterface = "org.freedesktop.NetworkManager.Device";
+- if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING,
+- &paramInterface)) {
+- return NS_ERROR_FAILURE;
+- }
+-
+- const char* paramDeviceType = "DeviceType";
+- if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING,
+- &paramDeviceType)) {
+- return NS_ERROR_FAILURE;
+- }
+- } else if (!strcmp(aFuncCall, "GetAll")) {
+- const char* param = "";
+- if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING, &param)) {
+- return NS_ERROR_FAILURE;
+- }
+- }
++ const char* paramInterface = "org.freedesktop.NetworkManager.Device";
++ if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING,
++ &paramInterface)) {
++ return NS_ERROR_FAILURE;
++ }
++
++ const char* paramDeviceType = "DeviceType";
++ if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING,
++ &paramDeviceType)) {
++ return NS_ERROR_FAILURE;
++ }
++
++ DBusError err;
++ dbus_error_init(&err);
++
++ RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
++ dbus_connection_send_with_reply_and_block(mConnection, msg,
++ DBUS_DEFAULT_TIMEOUT, &err));
++ if (dbus_error_is_set(&err)) {
++ dbus_error_free(&err);
++ return NS_ERROR_FAILURE;
++ }
++
++ return IdentifyDeviceType(reply, aPath);
++}
++
++nsresult
++nsWifiScannerDBus::SendGetAccessPoints(const char* aPath)
++{
++ RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
++ dbus_message_new_method_call("org.freedesktop.NetworkManager",
++ aPath,
++ "org.freedesktop.NetworkManager.Device.Wireless",
++ "GetAccessPoints"));
++ if (!msg) {
++ return NS_ERROR_FAILURE;
++ }
+
+ DBusError err;
+ dbus_error_init(&err);
+
+- // http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html
+- // Refer to function dbus_connection_send_with_reply_and_block.
+- const uint32_t DBUS_DEFAULT_TIMEOUT = -1;
+ RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
+ dbus_connection_send_with_reply_and_block(mConnection, msg,
+ DBUS_DEFAULT_TIMEOUT, &err));
+ if (dbus_error_is_set(&err)) {
+ dbus_error_free(&err);
+-
+ // In the GetAccessPoints case, if there are no access points, error is set.
+ // We don't want to error out here.
+- if (!strcmp(aFuncCall, "GetAccessPoints")) {
+- return NS_OK;
+- }
+- return NS_ERROR_FAILURE;
++ return NS_OK;
+ }
+
+- nsresult rv;
+- if (!strcmp(aFuncCall, "GetDevices")) {
+- rv = IdentifyDevices(reply);
+- } else if (!strcmp(aFuncCall, "Get")) {
+- rv = IdentifyDeviceType(reply, aPath);
+- } else if (!strcmp(aFuncCall, "GetAccessPoints")) {
+- rv = IdentifyAccessPoints(reply);
+- } else if (!strcmp(aFuncCall, "GetAll")) {
+- rv = IdentifyAPProperties(reply);
+- } else {
+- rv = NS_ERROR_FAILURE;
+- }
+- return rv;
++ return IdentifyAccessPoints(reply);
++}
++
++nsresult
++nsWifiScannerDBus::SendGetAPProperties(const char* aPath)
++{
++ RefPtr<DBusMessage> msg = already_AddRefed<DBusMessage>(
++ dbus_message_new_method_call("org.freedesktop.NetworkManager",
++ aPath,
++ "org.freedesktop.DBus.Properties",
++ "GetAll"));
++ if (!msg) {
++ return NS_ERROR_FAILURE;
++ }
++
++ DBusMessageIter argsIter;
++ dbus_message_iter_init_append(msg, &argsIter);
++
++ const char* param = "";
++ if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING, &param)) {
++ return NS_ERROR_FAILURE;
++ }
++
++ DBusError err;
++ dbus_error_init(&err);
++
++ RefPtr<DBusMessage> reply = already_AddRefed<DBusMessage>(
++ dbus_connection_send_with_reply_and_block(mConnection, msg,
++ DBUS_DEFAULT_TIMEOUT, &err));
++ if (dbus_error_is_set(&err)) {
++ dbus_error_free(&err);
++ return NS_ERROR_FAILURE;
++ }
++
++ return IdentifyAPProperties(reply);
+ }
+
+ nsresult
+@@ -126,7 +188,7 @@ nsWifiScannerDBus::IdentifyDevices(DBusM
+ return NS_ERROR_FAILURE;
+ }
+
+- rv = SendMessage("org.freedesktop.DBus.Properties", devicePath, "Get");
++ rv = SendGetDeviceType(devicePath);
+ NS_ENSURE_SUCCESS(rv, rv);
+ } while (dbus_message_iter_next(&iter));
+
+@@ -159,8 +221,7 @@ nsWifiScannerDBus::IdentifyDeviceType(DB
+ const uint32_t NM_DEVICE_TYPE_WIFI = 2;
+ nsresult rv = NS_OK;
+ if (deviceType == NM_DEVICE_TYPE_WIFI) {
+- rv = SendMessage("org.freedesktop.NetworkManager.Device.Wireless",
+- aDevicePath, "GetAccessPoints");
++ rv = SendGetAccessPoints(aDevicePath);
+ }
+
+ return rv;
+@@ -183,7 +244,7 @@ nsWifiScannerDBus::IdentifyAccessPoints(
+ return NS_ERROR_FAILURE;
+ }
+
+- rv = SendMessage("org.freedesktop.DBus.Properties", path, "GetAll");
++ rv = SendGetAPProperties(path);
+ NS_ENSURE_SUCCESS(rv, rv);
+ } while (dbus_message_iter_next(&iter));
+
+diff --git a/netwerk/wifi/nsWifiScannerDBus.h b/netwerk/wifi/nsWifiScannerDBus.h
+--- a/netwerk/wifi/nsWifiScannerDBus.h
++++ b/netwerk/wifi/nsWifiScannerDBus.h
+@@ -25,9 +25,10 @@ public:
+ nsresult Scan();
+
+ private:
+- nsresult SendMessage(const char* aInterface,
+- const char* aPath,
+- const char* aFuncCall);
++ nsresult SendGetDevices();
++ nsresult SendGetDeviceType(const char* aPath);
++ nsresult SendGetAccessPoints(const char* aPath);
++ nsresult SendGetAPProperties(const char* aPath);
+ nsresult IdentifyDevices(DBusMessage* aMsg);
+ nsresult IdentifyDeviceType(DBusMessage* aMsg, const char* aDevicePath);
+ nsresult IdentifyAccessPoints(DBusMessage* aMsg);
diff --git a/wifi-fix-interface.patch b/wifi-fix-interface.patch
new file mode 100644
index 000000000000..1980db1837e7
--- /dev/null
+++ b/wifi-fix-interface.patch
@@ -0,0 +1,26 @@
+# HG changeset patch
+# Parent 7a6d836b62779aa61988981c6ca646495574a505
+Bug 1314968 - Explicitly specify the AccessPoint interface name. r?kanru
+
+The DBus specification allows passing an empty string as the interface to the
+org.freedesktop.DBus.Properties.GetAll call to get all properties, throwing away the namespace
+(interface) information.
+
+However, GDBus does not allow this. When NetworkManager moved to using GDBus, Firefox lost the
+ability to retrieve access points from NetworkManager.
+
+Since we're only interested in properties from the org.freedesktop.NetworkManager.AccessPoint
+interface, name it explicitly. This works with both the old and the new NetworkManager.
+
+diff --git a/netwerk/wifi/nsWifiScannerDBus.cpp b/netwerk/wifi/nsWifiScannerDBus.cpp
+--- a/netwerk/wifi/nsWifiScannerDBus.cpp
++++ b/netwerk/wifi/nsWifiScannerDBus.cpp
+@@ -151,7 +151,7 @@ nsWifiScannerDBus::SendGetAll(const char
+ DBusMessageIter argsIter;
+ dbus_message_iter_init_append(msg, &argsIter);
+
+- const char* param = "";
++ const char* param = "org.freedesktop.NetworkManager.AccessPoint";
+ if (!dbus_message_iter_append_basic(&argsIter, DBUS_TYPE_STRING, &param)) {
+ return NS_ERROR_FAILURE;
+ }