merge into default
authorWolfgang Rosenauer <wr@rosenauer.org>
Tue, 19 Nov 2019 22:54:22 +0100
changeset 1113 8e9195853a32
parent 1088 84cdfb476431 (current diff)
parent 1112 8a4f5aea2475 (diff)
child 1114 572ec48f3fe8
merge into default
MozillaFirefox/MozillaFirefox.spec
MozillaFirefox/create-tar.sh
--- a/MozillaFirefox/MozillaFirefox.changes	Sun Mar 17 10:00:10 2019 +0100
+++ b/MozillaFirefox/MozillaFirefox.changes	Tue Nov 19 22:54:22 2019 +0100
@@ -1,4 +1,597 @@
 -------------------------------------------------------------------
+Sun Oct 20 20:19:31 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 70.0
+  * more privacy protections from Enhanced Tracking Protection
+  * Firefox Lockwise passwordmanager
+  * Improvements to core engine components, for better browsing on more sites
+  * Improved privacy and security indicators
+  MFSA 2019-34
+  * CVE-2018-6156 (bmo#1480088)
+    Heap buffer overflow in FEC processing in WebRTC
+  * CVE-2019-15903 (bmo#1584907)
+    Heap overflow in expat library in XML_GetCurrentLineNumber
+  * CVE-2019-11757 (bmo#1577107)
+    Use-after-free when creating index updates in IndexedDB
+  * CVE-2019-11759 (bmo#1577953)
+    Stack buffer overflow in HKDF output
+  * CVE-2019-11760 (bmo#1577719)
+    Stack buffer overflow in WebRTC networking
+  * CVE-2019-11761 (bmo#1561502)
+    Unintended access to a privileged JSONView object
+  * CVE-2019-11762 (bmo#1582857)
+    document.domain-based origin isolation has same-origin-property violation
+  * CVE-2019-11763 (bmo#1584216)
+    Incorrect HTML parsing results in XSS bypass technique
+  * CVE-2019-11765 (bmo#1562582)
+    Incorrect permissions could be granted to a website
+  * CVE-2019-17000 (bmo#1441468)
+    CSP bypass using object tag with data: URI
+  * CVE-2019-17001 (bmo#1587976)
+    CSP bypass using object tag when script-src 'none' is specified
+  * CVE-2019-17002 (bmo#1561056)
+    upgrade-insecure-requests was not being honored for links dragged and dropped
+  * CVE-2019-11764 (bmo#1558522, bmo#1577061, bmo#1548044, bmo#1571223,
+    bmo#1573048, bmo#1578933, bmo#1575217, bmo#1583684, bmo#1586845, bmo#1581950,
+    bmo#1583463, bmo#1586599)
+    Memory safety bugs fixed in Firefox 70 and Firefox ESR 68.2
+- requires
+    rust/cargo >= 1.36
+    NSPR >= 4.22
+    NSS >= 3.46.1
+    rust-cbindgen >= 0.9.1
+- removed obsolete patches
+    mozilla-bmo1573381.patch
+    mozilla-nestegg-big-endian.patch
+
+-------------------------------------------------------------------
+Sun Oct 13 08:58:12 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 69.0.3
+  * Fixed Yahoo mail users being prompted to download files when
+    clicking on emails (bmo#1582848)
+- devel package build can easily be disabled now
+
+-------------------------------------------------------------------
+Thu Oct  3 08:40:05 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 69.0.2
+  * Fixed a crash when editing files on Office 365 websites (bmo#1579858)
+  * Fixed a Linux-only crash when changing the playback speed while
+    watching YouTube videos (bmo#1582222)
+- updated supported locale list
+- Allow to build without profile guided optimizations (boo#1040589)
+  (contributed by Bernhard Wiedemann)
+- Make build verbose (contributed by Martin Liška)
+- remove obsolete kde.js setting (boo#1151186) and related patch
+  firefox-add-kde.js-in-order-to-survive-PGO-build.patch
+- update create-tar.sh to latest revision and adjusted tar_stamps
+- add mozilla-fix-top-level-asm.patch to fix LTO build (w/o PGO)
+- extension preferences moved from branding package to core package
+  (packaging but not branding specific)
+
+-------------------------------------------------------------------
+Thu Sep 19 13:31:16 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 69.0.1
+  * Fixed external programs launching in the background when clicking
+    a link from inside Firefox to launch them (bmo#1570845)
+  * Usability improvements to the Add-ons Manager for users with
+    screen readers (bmo#1567600)
+  * Fixed the Captive Portal notification bar not being dismissable
+    in some situations after login is complete (bmo#1578633)
+  * Fixed the maximum size of fonts in Reader Mode when zoomed (bmo#1578454)
+  * Fixed missing stacks in the Developer Tools Performance section
+    (bmo#1578354)
+  MFSA 2019-31
+  * CVE-2019-11754 (bmo#1580506)
+    Pointer Lock is enabled with no user notification
+- disable DOH by default
+
+-------------------------------------------------------------------
+Thu Sep  5 13:02:39 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 69.0
+  * Enhanced Tracking Protection (ETP) for stronger privacy protections
+  * Block Autoplay feature is enhanced to give users the option to block
+    any video
+  * Users in the US or using the en-US browser, can get a new “New Tab”
+    page experience connecting to the best of Pocket's content.
+  * Support for the Web Authentication HmacSecret extension via
+    Windows Hello introduced.
+  * Support for receiving multiple video codecs with this release makes
+    it easier for WebRTC conferencing services to mix video from
+    different clients.
+  MFSA 2019-25 (boo#1149324)
+  * CVE-2019-11741 (bmo#1539595)
+    Isolate addons.mozilla.org and accounts.firefox.com
+  * CVE-2019-5849 (bmo#1555838)
+    Out-of-bounds read in Skia
+  * CVE-2019-11737 (bmo#1388015)
+    Content security policy directives ignore port and path if host is a wildcard
+  * CVE-2019-11734 (bmo#1352875,bmo#1536227,bmo#1557208,bmo#1560641)
+    Memory safety bugs fixed in Firefox 69
+  * CVE-2019-11735 (bmo#1561404,bmo#1561484,bmo#1568047,bmo#1561912,
+    bmo#1565744,bmo#1568858,bmo#1570358)
+    Memory safety bugs fixed in Firefox 69 and Firefox ESR 68.1
+  * CVE-2019-11740 (bmo#1563133,bmo#1573160)
+    Memory safety bugs fixed in Firefox 69, Firefox ESR 68.1, and Firefox ESR 60.9
+- requires
+  * rust/cargo >= 1.35
+  * rust-cbindgen >= 0.9.0
+  * mozilla-nss >= 3.45
+- rebased patches
+
+-------------------------------------------------------------------
+Wed Sep  4 15:38:40 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- added a bunch of patches mainly for big endian platforms
+  * mozilla-bmo1504834-part1.patch
+  * mozilla-bmo1504834-part2.patch
+  * mozilla-bmo1504834-part3.patch
+  * mozilla-bmo1511604.patch
+  * mozilla-bmo1554971.patch
+  * mozilla-bmo1573381.patch
+  * mozilla-nestegg-big-endian.patch
+  * mozilla-bmo1512162.patch
+
+-------------------------------------------------------------------
+Fri Aug 30 20:49:11 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 68.1.0
+  MFSA 2019-26
+  * CVE-2019-11751 (bmo#1572838; Windows only)
+    Malicious code execution through command line parameters
+  * CVE-2019-11746 (bmo#1564449)
+    Use-after-free while manipulating video
+  * CVE-2019-11744 (bmo#1562033)
+    XSS by breaking out of title and textarea elements using innerHTML
+  * CVE-2019-11742 (bmo#1559715)
+    Same-origin policy violation with SVG filters and canvas to steal
+    cross-origin images
+  * CVE-2019-11736 (bmo#1551913, bmo#1552206; Windows only))
+    File manipulation and privilege escalation in Mozilla Maintenance Service
+  * CVE-2019-11753 (bmo#1574980; Windows only)
+    Privilege escalation with Mozilla Maintenance Service in custom
+    Firefox installation location
+  * CVE-2019-11752 (bmo#1501152)
+    Use-after-free while extracting a key value in IndexedDB
+  * CVE-2019-9812 (bmo#1538008, bmo#1538015)
+    Sandbox escape through Firefox Sync
+  * CVE-2019-11743 (bmo#1560495)
+    Cross-origin access to unload event attributes
+  * CVE-2019-11748 (bmo#1564588)
+    Persistence of WebRTC permissions in a third party context
+  * CVE-2019-11749 (bmo#1565374)
+    Camera information available without prompting using getUserMedia
+  * CVE-2019-11750 (bmo#1568397)
+    Type confusion in Spidermonkey
+  * CVE-2019-11738 (bmo#1452037)
+    Content security policy bypass through hash-based sources in directives
+  * CVE-2019-11747 (bmo#1564481)
+    'Forget about this site' removes sites from pre-loaded HSTS list
+  * CVE-2019-11735i (bmo#1561404,bmo#1561484,bmo#1568047,bmo#1561912,
+    bmo#1565744,bmo#1568858,bmo#1570358)
+    Memory safety bugs fixed in Firefox 69 and Firefox ESR 68.1
+  * CVE-2019-11740 (bmo#1563133,bmo#1573160)
+    Memory safety bugs fixed in Firefox 69, Firefox ESR 68.1, and Firefox ESR 60.9
+- switched package to ESR branch
+- added mozilla-bmo1568145.patch to make builds reproducible
+- removed upstreamed patch mozilla-gcc-internal-compiler-error.patch
+
+-------------------------------------------------------------------
+Sun Aug 18 17:29:25 UTC 2019 - Andreas Stieger <andreas.stieger@gmx.de>
+
+- Mozilla Firefox 68.0.2:
+  * Fixed a bug causing some special characters to be cut off from
+    the end of the search terms when searching from the URL bar
+    (bmo#1560228)
+  * Allow fonts to be loaded via file:// URLs when opening a page
+    locally (bmo#1565942)
+  * Printing emails from the Outlook web app no longer prints only
+    the header and footer (bmo#1567105)
+  * Fixed a bug causing some images not to be displayed on reload,
+    including on Google Maps (bmo# 1565542)
+  * Fixed an error when starting external applications configured
+    as URI handlers (bmo#1567614)
+  MFSA 2019-24 (boo#1145665)
+  * CVE-2019-11733: Stored passwords in 'Saved Logins' can be
+    copied without master password entry (bmo#1565780)
+- drop fix-build-after-y2038-changes-in-glibc.patch, upstream
+
+-------------------------------------------------------------------
+Fri Aug 16 16:49:24 UTC 2019 - Jonathan Brielmaier <jbrielmaier@suse.de>
+
+- Fix crash when typing in the URL bar on ppc64le (bmo#1512162).
+  The upstream patch doesn't resolve the issue on TW, but compiling
+  with -O1 does. Do this until we have a proper fix.
+
+-------------------------------------------------------------------
+Thu Aug  1 14:25:02 UTC 2019 - Guillaume GARDET <guillaume.gardet@opensuse.org>
+
+- Update build constraints to fix arm builds
+
+-------------------------------------------------------------------
+Fri Jul 19 08:11:27 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 68.0.1
+  * Fixed missing Full Screen button when watching videos in full
+    screen mode on HBO GO (bmo#1562837)
+  * Fixed a bug causing incorrect messages to appear for some
+    locales when sites try to request the use of the Storage
+    Access API (bmo#1558503)
+  * Users in Russian regions may have their default search engine
+    changed (bmo#1565315)
+  * Built-in search engines in some locales do not function
+    correctly (bmo#1565779)
+  * SupportMenu policy doesn't always work (bmo#1553290)
+  * Allow the privacy.file_unique_origin pref to be controlled by
+    policy (bmo#1563759)
+
+-------------------------------------------------------------------
+Thu Jul 11 10:51:39 UTC 2019 - Jiri Slaby <jslaby@suse.com>
+
+- add fix-build-after-y2038-changes-in-glibc.patch
+
+-------------------------------------------------------------------
+Wed Jul 10 13:47:41 UTC 2019 - Bernhard Wiedemann <bwiedemann@suse.com>
+
+- Generate langpacks sequentially to avoid file corruption
+  from racy file writes (boo#1137970)
+
+-------------------------------------------------------------------
+Mon Jul  8 13:30:35 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 68.0
+  * Dark mode in reader view
+  * Improved extension security and discovery
+  * Cryptomining and fingerprinting protections are added to strict
+    content blocking settings in Privacy & Security preferences
+  * Camera and microphone access now require an HTTPS connection
+  MFSA 2019-21 (bsc#1140868)
+  * CVE-2019-9811 (bmo#1538007, bmo#1539598, bmo#1563327)
+    Sandbox escape via installation of malicious languagepack
+  * CVE-2019-11711 (bmo#1552541)
+    Script injection within domain through inner window reuse
+  * CVE-2019-11712 (bmo#1543804)
+    Cross-origin POST requests can be made with NPAPI plugins by
+    following 308 redirects
+  * CVE-2019-11713 (bmo#1528481)
+    Use-after-free with HTTP/2 cached stream
+  * CVE-2019-11714 (bmo#1542593)
+    NeckoChild can trigger crash when accessed off of main thread
+  * CVE-2019-11729 (bmo#1515342)
+    Empty or malformed p256-ECDH public keys may trigger a segmentation fault
+  * CVE-2019-11715 (bmo#1555523)
+    HTML parsing error can contribute to content XSS
+  * CVE-2019-11716 (bmo#1552632)
+    globalThis not enumerable until accessed
+  * CVE-2019-11717 (bmo#1548306)
+    Caret character improperly escaped in origins
+  * CVE-2019-11718 (bmo#1408349)
+    Activity Stream writes unsanitized content to innerHTML
+  * CVE-2019-11719 (bmo#1540541)
+    Out-of-bounds read when importing curve25519 private key
+  * CVE-2019-11720 (bmo#1556230)
+    Character encoding XSS vulnerability
+  * CVE-2019-11721 (bmo#1256009)
+    Domain spoofing through unicode latin 'kra' character
+  * CVE-2019-11730 (bmo#1558299)
+    Same-origin policy treats all files in a directory as having the
+    same-origin
+  * CVE-2019-11723 (bmo#1528335)
+    Cookie leakage during add-on fetching across private browsing boundaries
+  * CVE-2019-11724 (bmo#1512511)
+    Retired site input.mozilla.org has remote troubleshooting permissions
+  * CVE-2019-11725 (bmo#1483510)
+    Websocket resources bypass safebrowsing protections
+  * CVE-2019-11727 (bmo#1552208)
+    PKCS#1 v1.5 signatures can be used for TLS 1.3
+  * CVE-2019-11728 (bmo#1552993)
+    Port scanning through Alt-Svc header
+  * CVE-2019-11710 (bmo#1549768, bmo#1548611, bmo#1533842, bmo#1537692,
+    bmo#1540590, bmo#1551907, bmo#1510345, bmo#1535482, bmo#1535848,
+    bmo#1547472, bmo#1547760, bmo#1507696, bmo#1544180)
+    Memory safety bugs fixed in Firefox 68
+  * CVE-2019-11709 (bmo#1547266, bmo#1540759, bmo#1548822, bmo#1550498
+    bmo#1515052, bmo#1539219, bmo#1547757, bmo#1550498, bmo#1533522)
+    Memory safety bugs fixed in Firefox 68 and Firefox ESR 60.8
+- requires
+  * NSS 3.44.1
+  * rust/cargo 1.34
+  * rust-cbindgen 0.8.7
+- rebased patches
+  * mozilla-aarch64-startup-crash.patch
+  * mozilla-kde.patch
+  * mozilla-nongnome-proxies.patch
+  * firefox-kde.patch
+- use new create-tar.sh and add tar_stamps for package definitions
+- added patches imported from SLE flavour
+  * mozilla-gcc-internal-compiler-error.patch
+  * mozilla-bmo1005535.patch
+  * mozilla-ppc-altivec_static_inline.patch
+  * mozilla-reduce-rust-debuginfo.patch
+  * mozilla-s390-bigendian.patch
+  * mozilla-s390-context.patch
+
+-------------------------------------------------------------------
+Mon Jul  2 14:15:17 UTC 2019 - Martin Liška <mliska@suse.cz>
+
+- Enable PGO for x86_64.
+  * added firefox-add-kde.js-in-order-to-survive-PGO-build.patch
+
+-------------------------------------------------------------------
+Thu Jun 20 06:20:59 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 67.0.4
+  MFSA 2019-19 (boo#1138872)
+  * CVE-2019-11708 (bmo#1559858)
+    sandbox escape using Prompt:Open
+
+-------------------------------------------------------------------
+Tue Jun 18 18:36:15 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 67.0.3
+  MFSA 2019-18 (boo#1138614)
+  * CVE-2019-11707 (bmo#1544386)
+    Type confusion in Array.pop
+
+-------------------------------------------------------------------
+Thu Jun 12 14:56:32 UTC 2019 - Manfred Hollstein <manfred.h@gmx.net>
+
+- Mozilla Firefox 67.0.2
+  * Fixed: Fix JavaScript error ("TypeError: data is null in
+    PrivacyFilter.jsm") in console which may significantly degrade
+    sessionstore reliability and performance (bmo#1553413)
+  * Fixed: Proxy authentication dialog box repeatedly pops up
+    asking to authenticate after upgrading to Firefox 67 (bmo#1548804)
+  * Fixed: Pearson MyCloud breaks if FIDO U2F is not Chrome's
+    implementation (bmo#1551282)
+  * Fixed: Starting in safe mode on Linux or macOS causes Firefox
+    to think on the subsequent launch that the profile is too
+    recent to be used with this version of Firefox (bmo#1556612)
+  * Fixed: Linux distribution users can't easily install/use
+    additional/different languages using the built-in preferences
+    UI (bmo#1554744)
+  * Fixed: Developer tools users can't copy the href/src content
+    from various HTML tags via the context menu in the Inspector
+    markup view (bmo#1552275)
+  * Fixed: Custom home page is broken with clearing data on shutdown
+    settings applied (bmo#1554167)
+  * Fixed: Performance-regression for eclipse RAP based applications
+    (bmo#1555962)
+  * Fixed: macOS 10.15 crash fix (bmo#1556076)
+  * Fixed: Can't start two downloads in parallel via <a download>
+    anymore (bmo#1542912)
+
+-------------------------------------------------------------------
+Thu Jun  6 06:49:51 UTC 2019 - Manfred Hollstein <manfred.h@gmx.net>
+
+- Mozilla Firefox 67.0.1
+  * enable enhanced tracking protection by default for new users
+  * upgrade of Facebook container to version 2.0
+  * new version of Firefox Lockwise (password management)
+  * new version of Firefox Monitor
+  * Firefox Send improvements
+
+-------------------------------------------------------------------
+Sun May 19 20:40:30 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 67.0
+  * Firefox 67 will be able to run different Firefox installs side by side
+    https://blog.nightly.mozilla.org/2019/01/14/moving-to-a-profile-per-install-architecture/
+  * Tabs can now be pinned from the Page Actions menu in the address bar
+  * Users can block known cryptominers and fingerprinters in the
+    Custom settings or their Content Blocking preferences
+  * The Import Data from Another Browser feature is now also available
+    from the File menu
+  * Firefox will now protect you against running older versions which
+    can lead to data corruption and stability issues
+  * Easier access to your list of saved logins from the main menu and
+    login autocomplete
+  * We’ve added a toolbar menu for your Firefox Account to provide more
+    transparency for when you are synced, sharing data across devices
+    and with Firefox. Personalize the appearance of the menu with your
+    own avatar
+  * Enable FIDO U2F API, and permit registrations for Google Accounts
+  * Enabled AV1 support on Linux
+  MFSA 2019-13 (boo#1135824)
+  * CVE-2019-9815 (bmo#1546544)
+    Disable hyperthreading on content JavaScript threads on macOS
+  * CVE-2019-9816 (bmo#1536768)
+    Type confusion with object groups and UnboxedObjects
+  * CVE-2019-9817 (bmo#1540221)
+    Stealing of cross-domain images using canvas
+  * CVE-2019-9818 (bmo#1542581) (Windows only)
+    Use-after-free in crash generation server
+  * CVE-2019-9819 (bmo#1532553)
+    Compartment mismatch with fetch API
+  * CVE-2019-9820 (bmo#1536405)
+    Use-after-free of ChromeEventHandler by DocShell
+  * CVE-2019-9821 (bmo#1539125)
+    Use-after-free in AssertWorkerThread
+  * CVE-2019-11691 (bmo#1542465)
+    Use-after-free in XMLHttpRequest
+  * CVE-2019-11692 (bmo#1544670)
+    Use-after-free removing listeners in the event listener manager
+  * CVE-2019-11693 (bmo#1532525)
+    Buffer overflow in WebGL bufferdata on Linux
+  * CVE-2019-7317 (bmo#1542829)
+    Use-after-free in png_image_free of libpng library
+  * CVE-2019-11694 (bmo#1534196) (Windows only)
+    Uninitialized memory memory leakage in Windows sandbox
+  * CVE-2019-11695 (bmo#1445844)
+    Custom cursor can render over user interface outside of web content
+  * CVE-2019-11696 (bmo#1392955)
+    Java web start .JNLP files are not recognized as executable files
+    for download prompts
+  * CVE-2019-11697 (bmo#1440079)
+    Pressing key combinations can bypass installation prompt delays and
+    install extensions
+  * CVE-2019-11698 (bmo#1543191)
+    Theft of user history data through drag and drop of hyperlinks
+    to and from bookmarks
+  * CVE-2019-11700 (bmo#1549833) (Windows only)
+    res: protocol can be used to open known local files
+  * CVE-2019-11699 (bmo#1528939)
+    Incorrect domain name highlighting during page navigation
+  * CVE-2019-11701 (bmo#1518627)
+    webcal: protocol default handler loads vulnerable web page
+  * CVE-2019-9814 (bmo#1527592, bmo#1534536, bmo#1520132, bmo#1543159,
+    bmo#1539393, bmo#1459932, bmo#1459182, bmo#1516425)
+    Memory safety bugs fixed in Firefox 67
+  * CVE-2019-9800 (bmo#1540166, bmo#1534593, bmo#1546327, bmo#1540136,
+    bmo#1538736, bmo#1538042, bmo#1535612, bmo#1499719, bmo#1499108,
+    bmo#1538619, bmo#1535194, bmo#1516325, bmo#1542324, bmo#1542097,
+    bmo#1532465, bmo#1533554, bmo#1541580)
+    Memory safety bugs fixed in Firefox 67 and Firefox ESR 60.7
+- requires
+  * rust/cargo >= 1.32
+  * mozilla-nspr >= 4.21
+  * mozilla-nss >= 3.43
+  * rust-cbindgen >= 0.8.2
+- rebased patches
+- KDE integration for default browser detection is broken in this revision
+
+-------------------------------------------------------------------
+Fri May 17 12:04:49 UTC 2019 - Guillaume GARDET <guillaume.gardet@opensuse.org>
+
+- Fix armv7 build with:
+  * mozilla-disable-wasm-emulate-arm-unaligned-fp-access.patch
+
+-------------------------------------------------------------------
+Fri May 10 10:30:05 UTC 2019 - Manfred Hollstein <manfred.h@gmx.net>
+
+- Mozilla Firefox 66.0.5
+  * Fixed: Further improvements to re-enable web extensions which
+    had been disabled for users with a master password set (bmo#1549249)
+
+-------------------------------------------------------------------
+Sun May  5 20:21:02 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 66.0.4 (boo#1134126)
+  * fix extension certificate chain
+    https://blog.mozilla.org/addons/2019/05/04/update-regarding-add-ons-in-firefox/
+
+-------------------------------------------------------------------
+Thu Apr 11 09:16:17 UTC 2019 - Manfred Hollstein <manfred.h@gmx.net>
+
+- Mozilla Firefox 66.0.3
+  * Fixed: Address bar on tablets running Windows 10 now behaves
+    correctly (bmo#1498973)
+  * Fixed: Performance issues with some HTML5 games (bmo#1537609)
+  * Fixed a bug with keypress events in IBM cloud applications
+    (bmo#1538970)
+  * Fix for keypress events in some Microsoft cloud applications
+    (bmo#1539618)
+  * Changed: Updated Baidu search plugin
+
+-------------------------------------------------------------------
+Thu Mar 28 19:01:41 UTC 2019 - Manfred Hollstein <manfred.h@gmx.net>
+
+- Mozilla Firefox 66.0.2
+  * Fixed Web compatibility issues with Office 365, iCloud and
+    IBM WebMail caused by recent changes to the handling of
+    keyboard events (bmo#1538966)
+  * Crash fixes (bmo#1521370, bmo#1539118)
+
+-------------------------------------------------------------------
+Thu Mar 28 09:58:36 UTC 2019 - Guillaume GARDET <guillaume.gardet@opensuse.org>
+
+- Add patch to fix aarch64 build:
+  * mozilla-fix-aarch64-libopus.patch (bmo#1539737)
+
+-------------------------------------------------------------------
+Fri Mar 22 22:22:08 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 66.0.1
+  MFSA 2019-09 (bsc#1130262)
+  * CVE-2019-9810 (bmo#1537924)
+    IonMonkey MArraySlice has incorrect alias information
+  * CVE-2019-9813 (bmo#1538006)
+    Ionmonkey type confusion with __proto__ mutations
+
+-------------------------------------------------------------------
+Sun Mar 17 10:08:51 UTC 2019 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 66.0
+  * Increased content processes to 8
+  * Added capability to search through open tabs from the tab overflow menu
+  * New backend for the storage.local WebExtensions API, providing
+    I/O performance improvements when the extension updates a small
+    subset of the stored data
+  * WebExtension keyboard shortcuts can now be managed or overridden
+    from about:addons
+  * Improved scrolling behavior: Firefox will now attempt to keep content
+    from jumping around while a page is loading by supporting scroll
+    anchoring
+  * New about:privatebrowsing with search
+  * A certificate error page now notifies the user of the name of the
+    certificate issuer that breaks HTTPs connections on intercepted
+    connections to help troubleshooting possible anti-virus software
+    issues.
+  * Fixed an performance issue some Linux users experienced with the
+    Downloads panel (bmo#1517101)
+  * Firefox now blocks all autoplay media with sound by default. Users
+    can add individual sites to an exceptions list or turn the blocking
+    off.
+  * System title bar is hidden by default to match Gnome guideline
+  MFSA 2019-07 (bsc#1129821)
+  * CVE-2019-9790 (bmo#1525145)
+    Use-after-free when removing in-use DOM elements
+  * CVE-2019-9791 (bmo#1530958)
+    Type inference is incorrect for constructors entered through on-stack
+    replacement with IonMonkey
+  * CVE-2019-9792 (bmo#1532599)
+    IonMonkey leaks JS_OPTIMIZED_OUT magic value to script
+  * CVE-2019-9793 (bmo#1528829)
+    Improper bounds checks when Spectre mitigations are disabled
+  * CVE-2019-9794 (bmo#1530103) (Windows only)
+    Command line arguments not discarded during execution
+  * CVE-2019-9795 (bmo#1514682)
+    Type-confusion in IonMonkey JIT compiler
+  * CVE-2019-9796 (bmo#1531277)
+    Use-after-free with SMIL animation controller
+  * CVE-2019-9797 (bmo#1528909)
+    Cross-origin theft of images with createImageBitmap
+  * CVE-2019-9798 (bmo#1527534) (Android only)
+    Library is loaded from world writable APITRACE_LIB location
+  * CVE-2019-9799 (bmo#1505678)
+    Information disclosure via IPC channel messages
+  * CVE-2019-9801 (bmo#1527717) (Windows only)
+    Windows programs that are not 'URL Handlers' are exposed to web content
+  * CVE-2019-9802 (bmo#1415508)
+    Chrome process information leak
+  * CVE-2019-9803 (bmo#1515863, bmo#1437009)
+    Upgrade-Insecure-Requests incorrectly enforced for same-origin navigation
+  * CVE-2019-9804 (bmo#1518026) (MacOS only)
+    Code execution through 'Copy as cURL' in Firefox Developer Tools on macOS
+  * CVE-2019-9805 (bmo#1521360)
+    Potential use of uninitialized memory in Prio
+  * CVE-2019-9806 (bmo#1525267)
+    Denial of service through successive FTP authorization prompts
+  * CVE-2019-9807 (bmo#1362050)
+    Text sent through FTP connection can be incorporated into alert messages
+  * CVE-2019-9809 (bmo#1282430, bmo#1523249)
+    Denial of service through FTP modal alert error messages
+  * CVE-2019-9808 (bmo#1434634)
+    WebRTC permissions can display incorrect origin with data: and blob: URLs
+  * CVE-2019-9789 bmo#1520483, bmo#1522987, bmo#1528199, bmo#1519337,
+    bmo#1525549, bmo#1516179, bmo#1518524, bmo#1518331, bmo#1526579,
+    bmo#1512567, bmo#1524335, bmo#1448505, bmo#1518821
+    Memory safety bugs fixed in Firefox 66
+  * CVE-2019-9788 bmo#1518001, bmo#1521304, bmo#1521214, bmo#1506665,
+    bmo#1516834, bmo#1518774, bmo#1524755, bmo#1523362, bmo#1524214, bmo#1529203
+    Memory safety bugs fixed in Firefox 66 and Firefox ESR 60.6
+- updated build/runtime requirements
+  * mozilla-nss >= 3.42.1
+  * cargo/rust >= 1.31
+  * rust-cbindgen >= 0.6.8
+  * nasm >= 2.13 (new)
+- removed obsolete patch
+  * mozilla-bmo256180.patch
+
+-------------------------------------------------------------------
 Tue Mar  5 10:17:01 UTC 2019 - Stephan Kulow <coolo@suse.com>
 
 - Do not hardcode nodejs8 but leave the prefer to the distribution
--- a/MozillaFirefox/MozillaFirefox.spec	Sun Mar 17 10:00:10 2019 +0100
+++ b/MozillaFirefox/MozillaFirefox.spec	Tue Nov 19 22:54:22 2019 +0100
@@ -2,7 +2,7 @@
 # spec file for package MozillaFirefox
 #
 # Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
-#               2006-2019 Wolfgang Rosenauer
+#               2006-2019 Wolfgang Rosenauer <wr@rosenauer.org>
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,14 +18,14 @@
 
 
 # changed with every update
-%define major          65
-%define mainver        %major.0.1
-%define orig_version   65.0.1
+%define major          70
+%define mainver        %major.0
+%define orig_version   70.0
 %define orig_suffix    %{nil}
 %define update_channel beta
 %define branding       1
-%define releasedate    20190211233335
-%define source_prefix  firefox-%{orig_version}
+%define devpkg         1
+%define releasedate    20191016161957
 
 # always build with GCC as SUSE Security Team requires that
 %define clang_build 0
@@ -33,6 +33,8 @@
 # PIE, full relro
 %define build_hardened 1
 
+%bcond_with only_print_mozconfig
+
 # Firefox only supports i686
 %ifarch %ix86
 ExclusiveArch:  i586 i686
@@ -43,6 +45,7 @@
 # general build definitions
 %define progname firefox
 %define pkgname  MozillaFirefox
+%define srcname  firefox
 %define appname  Firefox
 %define progdir %{_prefix}/%_lib/%{progname}
 %define gnome_dir     %{_prefix}
@@ -62,6 +65,7 @@
 BuildRequires:  alsa-devel
 BuildRequires:  autoconf213
 BuildRequires:  dbus-1-glib-devel
+BuildRequires:  dejavu-fonts
 BuildRequires:  fdupes
 BuildRequires:  memory-constraints
 %if 0%{?suse_version} <= 1320
@@ -69,7 +73,7 @@
 %else
 BuildRequires:  gcc-c++
 %endif
-BuildRequires:  cargo >= 1.30
+BuildRequires:  cargo >= 1.36
 BuildRequires:  libXcomposite-devel
 BuildRequires:  libcurl-devel
 BuildRequires:  libidl-devel
@@ -77,22 +81,26 @@
 BuildRequires:  libnotify-devel
 BuildRequires:  libproxy-devel
 BuildRequires:  makeinfo
-BuildRequires:  mozilla-nspr-devel >= 4.20
-BuildRequires:  mozilla-nss-devel >= 3.41
-BuildRequires:  nodejs >= 8.11
+BuildRequires:  mozilla-nspr-devel >= 4.22
+BuildRequires:  mozilla-nss-devel >= 3.46.1
+BuildRequires:  nasm >= 2.13
+BuildRequires:  nodejs8 >= 8.11
 BuildRequires:  python-devel
 BuildRequires:  python2-xml
 BuildRequires:  python3 >= 3.5
-BuildRequires:  rust >= 1.30
-BuildRequires:  rust-cbindgen >= 0.6.7
+BuildRequires:  rust >= 1.36
+BuildRequires:  rust-cbindgen >= 0.9.1
 BuildRequires:  startup-notification-devel
 BuildRequires:  unzip
 BuildRequires:  update-desktop-files
 BuildRequires:  xorg-x11-libXt-devel
+%if 0%{?do_profiling}
+BuildRequires:  xvfb-run
+%endif
 BuildRequires:  yasm
 BuildRequires:  zip
 %if 0%{?suse_version} < 1550
-BuildRequires:  pkgconfig(gconf-2.0)
+BuildRequires:  pkgconfig(gconf-2.0) >= 1.2.1
 %endif
 BuildRequires:  pkgconfig(gdk-x11-2.0)
 BuildRequires:  pkgconfig(glib-2.0) >= 2.22
@@ -131,12 +139,13 @@
 License:        MPL-2.0
 Group:          Productivity/Networking/Web/Browsers
 Url:            http://www.mozilla.org/
-Source:         http://ftp.mozilla.org/pub/firefox/releases/%{version}/source/firefox-%{orig_version}%{orig_suffix}.source.tar.xz
+%if !%{with only_print_mozconfig}
+Source:         http://ftp.mozilla.org/pub/%{srcname}/releases/%{version}%{orig_suffix}/source/%{srcname}-%{orig_version}%{orig_suffix}.source.tar.xz
 Source1:        MozillaFirefox.desktop
 Source2:        MozillaFirefox-rpmlintrc
 Source3:        mozilla.sh.in
+Source4:        tar_stamps
 Source5:        source-stamp.txt
-Source6:        kde.js
 Source7:        l10n-%{orig_version}%{orig_suffix}.tar.xz
 Source8:        firefox-mimeinfo.xml
 Source9:        firefox.js
@@ -144,40 +153,56 @@
 Source11:       firefox.1
 Source12:       mozilla-get-app-id
 Source13:       spellcheck.js
-Source14:       create-tar.sh
+Source14:       https://github.com/openSUSE/firefox-scripts/raw/master/create-tar.sh
 Source15:       firefox-appdata.xml
-Source16:       MozillaFirefox.changes
+Source16:       %{name}.changes
 # Set up API keys, see http://www.chromium.org/developers/how-tos/api-keys
 # Note: these are for the openSUSE Firefox builds ONLY. For your own distribution,
 # please get your own set of keys.
 Source18:       mozilla-api-key
 Source19:       google-api-key
-Source20:       http://ftp.mozilla.org/pub/firefox/releases/%{version}/source/firefox-%{orig_version}%{orig_suffix}.source.tar.xz.asc
-Source21:       mozilla.keyring
+Source20:       https://ftp.mozilla.org/pub/%{srcname}/releases/%{version}%{orig_suffix}/source/%{srcname}-%{orig_version}%{orig_suffix}.source.tar.xz.asc
+Source21:       https://ftp.mozilla.org/pub/%{srcname}/releases/%{version}%{orig_suffix}/KEY#/mozilla.keyring
 # Gecko/Toolkit
 Patch1:         mozilla-nongnome-proxies.patch
 Patch2:         mozilla-kde.patch
 Patch3:         mozilla-ntlm-full-path.patch
 Patch4:         mozilla-openaes-decl.patch
-Patch7:         mozilla-aarch64-startup-crash.patch
-Patch8:         mozilla-bmo256180.patch
-Patch9:         mozilla-bmo1463035.patch
-Patch10:        mozilla-cubeb-noreturn.patch
+Patch5:         mozilla-aarch64-startup-crash.patch
+Patch6:         mozilla-bmo1463035.patch
+Patch7:         mozilla-cubeb-noreturn.patch
+Patch8:         mozilla-fix-aarch64-libopus.patch
+Patch9:         mozilla-disable-wasm-emulate-arm-unaligned-fp-access.patch
+Patch10:        mozilla-s390-context.patch
+Patch11:        mozilla-s390-bigendian.patch
+Patch12:        mozilla-reduce-rust-debuginfo.patch
+Patch13:        mozilla-ppc-altivec_static_inline.patch
+Patch14:        mozilla-bmo1005535.patch
+Patch15:        mozilla-bmo1568145.patch
+Patch16:        mozilla-bmo1504834-part1.patch
+Patch17:        mozilla-bmo1504834-part2.patch
+Patch18:        mozilla-bmo1504834-part3.patch
+Patch19:        mozilla-bmo1511604.patch
+Patch20:        mozilla-bmo1554971.patch
+Patch21:        mozilla-bmo1512162.patch
+Patch22:        mozilla-fix-top-level-asm.patch
 # Firefox/browser
 Patch101:       firefox-kde.patch
 Patch102:       firefox-branded-icons.patch
+%endif # only_print_mozconfig
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 Requires(post):   coreutils shared-mime-info desktop-file-utils
 Requires(postun): shared-mime-info desktop-file-utils
-%if %branding
-Requires:       %{name}-branding > 44.0
-%endif
+Requires:       %{name}-branding >= 68
 Requires:       mozilla-nspr >= %(rpm -q --queryformat '%%{VERSION}' mozilla-nspr)
 Requires:       mozilla-nss >= %(rpm -q --queryformat '%%{VERSION}' mozilla-nss)
 Recommends:     libcanberra0
 Recommends:     libpulse0
 # addon leads to startup crash (bnc#908892)
 Obsoletes:      tracker-miner-firefox < 0.15
+%if 0%{?devpkg} == 0
+Obsoletes:      %{name}-devel < %{version}
+%endif
 # libproxy's mozjs pacrunner crashes FF (bnc#759123)
 %if 0%{?suse_version} < 1220
 Obsoletes:      libproxy1-pacrunner-mozjs <= 0.4.7
@@ -189,6 +214,7 @@
 compliance and performance.  Its functionality can be enhanced via a
 plethora of extensions.
 
+%if 0%{?devpkg}
 %package devel
 Summary:        Devel package for %{appname}
 Group:          Development/Tools/Other
@@ -199,12 +225,13 @@
 
 %description devel
 Development files for %{appname} to make packaging of addons easier.
+%endif
 
 %if %localize
 %package translations-common
 Summary:        Common translations for %{appname}
 Group:          System/Localization
-Provides:       locale(%{name}:ar;ca;cs;da;de;en_GB;el;es_AR;es_CL;es_ES;fi;fr;hu;it;ja;ko;nb_NO;nl;pl;pt_BR;pt_PT;ru;sv_SE;zh_CN;zh_TW)
+Provides:       locale(%{name}:ar;ca;cs;da;de;el;en_GB;es_AR;es_CL;es_ES;fi;fr;hu;it;ja;ko;nb_NO;nl;pl;pt_BR;pt_PT;ru;sv_SE;zh_CN;zh_TW)
 Requires:       %{name} = %{version}
 Obsoletes:      %{name}-translations < %{version}-%{release}
 
@@ -215,7 +242,7 @@
 %package translations-other
 Summary:        Extra translations for %{appname}
 Group:          System/Localization
-Provides:       locale(%{name}:ach;af;an;as;ast;az;bg;bn_BD;bn_IN;br;bs;cak;cy;dsb;en_ZA;eo;es_MX;et;eu;fa;ff;fy_NL;ga_IE;gd;gl;gn;gu_IN;he;hi_IN;hr;hsb;hy_AM;id;is;ka;kab;kk;km;kn;lij;lt;lv;mai;mk;ml;mr;ms;ne-NP;nn_NO;oc;or;pa_IN;rm;ro;si;sk;sl;son;sq;sr;ta;te;th;tr;uk;uz;vi;xh)
+Provides:       locale(%{name}:ach;af;an;ast;az;be;bg;bn;br;bs;cak;cy;dsb;en_CA;eo;es_MX;et;eu;fa;ff;fy_NL;ga_IE;gd;gl;gn;gu_IN;he;hi_IN;hr;hsb;hy_AM;ia;id;is;ka;kab;kk;km;kn;lij;lt;lv;mk;mr;ms;my;ne_NP;nn_NO;oc;pa_IN;rm;ro;si;sk;sl;son;sq;sr;ta;te;th;tr;uk;ur;uz;vi;xh)
 Requires:       %{name} = %{version}
 Obsoletes:      %{name}-translations < %{version}-%{release}
 
@@ -224,7 +251,6 @@
 of %{appname}.
 %endif
 
-%if %branding
 %package branding-upstream
 Summary:        Upstream branding for %{appname}
 Group:          Productivity/Networking/Web/Browsers
@@ -243,7 +269,6 @@
 
 %description branding-upstream
 This package provides upstream look and feel for %{appname}.
-%endif
 
 %if %crashreporter
 %package buildsymbols
@@ -255,28 +280,56 @@
 symbols meant for upload to Mozilla's crash collector database.
 %endif
 
+%if !%{with only_print_mozconfig}
 %prep
 %if %localize
-%setup -q -n %{source_prefix} -b 7 -b 10
+
+# If generated incorrectly, the tarball will be ~270B in
+# size, so 1MB seems like good enough limit to check.
+MINSIZE=1048576
+if (( $(stat -Lc%s "%{SOURCE7}") < MINSIZE)); then
+    echo "Translations tarball %{SOURCE7} not generated properly."
+    exit 1
+fi
+
+%setup -q -n %{srcname}-%{orig_version} -b 7 -b 10
 %else
-%setup -q -n %{source_prefix}
+%setup -q -n %{srcname}-%{orig_version}
 %endif
-cd $RPM_BUILD_DIR/%{source_prefix}
+cd $RPM_BUILD_DIR/%{srcname}-%{orig_version}
 %patch1 -p1
 %patch2 -p1
 %patch3 -p1
 %patch4 -p1
+%patch5 -p1
+%patch6 -p1
 %patch7 -p1
 %patch8 -p1
 %patch9 -p1
 %patch10 -p1
+%ifarch s390x ppc64
+%patch11 -p1
+%endif
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+%patch20 -p1
+%patch21 -p1
+%patch22 -p1
 # Firefox
 %patch101 -p1
 %patch102 -p1
+%endif # only_print_mozconfig
 
 %build
+%if !%{with only_print_mozconfig}
 # no need to add build time to binaries
-modified="$(sed -n '/^----/n;s/ - .*$//;p;q' "%{_sourcedir}/MozillaFirefox.changes")"
+modified="$(sed -n '/^----/n;s/ - .*$//;p;q' "%{_sourcedir}/%{name}.changes")"
 DATE="\"$(date -d "${modified}" "+%%b %%e %%Y")\""
 TIME="\"$(date -d "${modified}" "+%%R")\""
 find . -regex ".*\.c\|.*\.cpp\|.*\.h" -exec sed -i "s/__DATE__/${DATE}/g;s/__TIME__/${TIME}/g" {} +
@@ -287,6 +340,9 @@
   exit 1
 fi
 source %{SOURCE5}
+%endif # only_print_mozconfig
+
+export CARGO_HOME=${RPM_BUILD_DIR}/%{srcname}-%{orig_version}/.cargo
 export MOZ_SOURCE_CHANGESET=$REV
 export SOURCE_REPO=$REPO
 export source_repo=$REPO
@@ -317,8 +373,18 @@
 %endif
 export CXXFLAGS="$CFLAGS"
 export MOZCONFIG=$RPM_BUILD_DIR/mozconfig
-%limit_build -m 1500
+%if %{with only_print_mozconfig}
+echo "export CC=$CC"
+echo "export CXX=$CXX"
+echo "export CFLAGS=\"$CFLAGS\""
+echo "export LDFLAGS=\"$LDFLAGS\""
+echo "export RUSTFLAGS=\"$RUSTFLAGS\""
+echo ""
+cat << EOF
+%else
+%limit_build -m 2000
 cat << EOF > $MOZCONFIG
+%endif
 mk_add_options MOZILLA_OFFICIAL=1
 mk_add_options BUILD_OFFICIAL=1
 mk_add_options MOZ_MAKE_FLAGS=%{?jobs:-j%jobs}
@@ -339,7 +405,7 @@
 ac_add_options --enable-debug-symbols
 %endif
 %if 0%{?suse_version} > 1549
-%ifnarch aarch64 ppc64 ppc64le
+%ifnarch aarch64 ppc64 ppc64le s390x
 ac_add_options --disable-elf-hack
 %endif
 %endif
@@ -359,7 +425,8 @@
 #ac_add_options --enable-chrome-format=jar
 ac_add_options --enable-update-channel=%{update_channel}
 ac_add_options --with-mozilla-api-keyfile=%{SOURCE18}
-ac_add_options --with-google-api-keyfile=%{SOURCE19}
+ac_add_options --with-google-location-service-api-keyfile=%{SOURCE19}
+ac_add_options --with-google-safebrowsing-api-keyfile=%{SOURCE19}
 ac_add_options --with-unsigned-addon-scopes=app
 %if %branding
 ac_add_options --enable-official-branding
@@ -380,14 +447,36 @@
 %ifarch aarch64 %arm s390x
 ac_add_options --disable-webrtc
 %endif
+# mitigation/workaround for bmo#1512162
+%ifarch s390x
+ac_add_options --enable-optimize="-O1"
+%endif
 %ifarch x86_64
 # LTO needs newer toolchain stack only (at least GCC 8.2.1 (r268506)
 %if 0%{?suse_version} > 1500
 ac_add_options --enable-lto
+%if 0%{?do_profiling}
+ac_add_options MOZ_PGO=1
+%endif
 %endif
 %endif
 EOF
-./mach build
+%if !%{with only_print_mozconfig}
+%ifarch ppc64 s390x s390
+# NOTE: Currently, system-icu is too old, so we can't build with that,
+#       but have to generate the .dat-file freshly. This seems to be a
+#       less fragile approach anyways.
+# ac_add_options --with-system-icu
+echo "Generate big endian version of config/external/icu/data/icud58l.dat"
+./mach python intl/icu_sources_data.py .
+ls -l config/external/icu/data
+rm -f config/external/icu/data/icudt*l.dat
+%endif
+%if 0%{?do_profiling}
+xvfb-run --server-args="-screen 0 1920x1080x24" \
+%endif
+./mach build -v
+%endif # only_print_mozconfig
 
 %install
 cd $RPM_BUILD_DIR/obj
@@ -403,25 +492,29 @@
 grep amazondotcom dist/firefox/browser/omni.ja
 # copy tree into RPM_BUILD_ROOT
 mkdir -p %{buildroot}%{progdir}
-cp -rf $RPM_BUILD_DIR/obj/dist/firefox/* %{buildroot}%{progdir}
+cp -rf $RPM_BUILD_DIR/obj/dist/%{srcname}/* %{buildroot}%{progdir}
 mkdir -p %{buildroot}%{progdir}/distribution/extensions
 mkdir -p %{buildroot}%{progdir}/browser/defaults/preferences/
+# renaming executables (for regular vs. ESR)
+%if "%{srcname}" != "%{progname}"
+mv %{buildroot}%{progdir}/%{srcname} %{buildroot}%{progdir}/%{progname}
+mv %{buildroot}%{progdir}/%{srcname}-bin %{buildroot}%{progdir}/%{progname}-bin
+%endif
 # install gre prefs
 install -m 644 %{SOURCE13} %{buildroot}%{progdir}/defaults/pref/
 # install browser prefs
-install -m 644 %{SOURCE6} %{buildroot}%{progdir}/browser/defaults/preferences/kde.js
 install -m 644 %{SOURCE9} %{buildroot}%{progdir}/browser/defaults/preferences/firefox.js
-# install additional locales
+# build additional locales
 %if %localize
 mkdir -p %{buildroot}%{progdir}/browser/extensions
 truncate -s 0 %{_tmppath}/translations.{common,other}
-sed -r '/^(ja-JP-mac|en-US|)$/d;s/ .*$//' $RPM_BUILD_DIR/%{source_prefix}/browser/locales/shipped-locales \
-    | xargs -P 8 -n 1 -I {} /bin/sh -c '
+sed -r '/^(ja-JP-mac|en-US|)$/d;s/ .*$//' $RPM_BUILD_DIR/%{srcname}-%{orig_version}/browser/locales/shipped-locales \
+    | xargs -n 1 -I {} /bin/sh -c '
         locale=$1
         pushd $RPM_BUILD_DIR/compare-locales
         PYTHONPATH=lib \
             scripts/compare-locales -m ../l10n-merged/$locale \
-            ../%{source_prefix}/browser/locales/l10n.ini ../l10n $locale
+            ../%{srcname}-%{orig_version}/browser/locales/l10n.ini ../l10n $locale
         popd
         LOCALE_MERGEDIR=$RPM_BUILD_DIR/l10n-merged/$locale \
             make -C browser/locales langpack-$locale
@@ -432,7 +525,7 @@
         rm -rf %{buildroot}%{progdir}/browser/extensions/langpack-$locale@firefox.mozilla.org/hyphenation
         # check against the fixed common list and sort into the right filelist
         _matched=0
-        for _match in ar ca cs da de en-GB el es-AR es-CL es-ES fi fr hu it ja ko nb-NO nl pl pt-BR pt-PT ru sv-SE zh-CN zh-TW; do
+        for _match in ar ca cs da de el en-GB es-AR es-CL es-ES fi fr hu it ja ko nb-NO nl pl pt-BR pt-PT ru sv-SE zh-CN zh-TW; do
             [ "$_match" = "$locale" ] && _matched=1
         done
         [ $_matched -eq 1 ] && _l10ntarget=common || _l10ntarget=other
@@ -457,7 +550,7 @@
 mkdir --parents %{buildroot}/usr/bin
 sed "s:%%PREFIX:%{_prefix}:g
 s:%%PROGDIR:%{progdir}:g
-s:%%APPNAME:firefox:g
+s:%%APPNAME:%{progname}:g
 s:%%PROFILE:.mozilla/firefox:g" \
   %{SOURCE3} > %{buildroot}%{progdir}/%{progname}.sh
 chmod 755 %{buildroot}%{progdir}/%{progname}.sh
@@ -474,7 +567,8 @@
 cp %{SOURCE8} %{buildroot}%{_datadir}/mime/packages/%{progname}.xml
 # appdata
 mkdir -p %{buildroot}%{_datadir}/appdata
-cp %{SOURCE15} %{buildroot}%{_datadir}/appdata/%{desktop_file_name}.appdata.xml
+sed "s:firefox.desktop:%{desktop_file_name}:g" \
+  %{SOURCE15} > %{buildroot}%{_datadir}/appdata/%{desktop_file_name}.appdata.xml
 # install man-page
 mkdir -p %{buildroot}%{_mandir}/man1/
 cp %{SOURCE11} %{buildroot}%{_mandir}/man1/%{progname}.1
@@ -504,6 +598,7 @@
 rm -f %{buildroot}%{progdir}/LICENSE
 rm -f %{buildroot}%{progdir}/precomplete
 rm -f %{buildroot}%{progdir}/update-settings.ini
+%if 0%{?devpkg}
 # devel
 mkdir -p %{buildroot}%{_bindir}
 install -m 755 %SOURCE12 %{buildroot}%{_bindir}
@@ -525,12 +620,7 @@
    %%{__unzip} -q -d "$extdir" "%%1" \
    %%{nil}
 FIN
-# just dumping an xpi file there doesn't work...
-#%%firefox_ext_install() \
-#       extdir="%%{buildroot}%%{firefox_extdir}" \
-#       mkdir -p "$extdir" \
-#       cp "%%1" "$extdir" \
-#       %%{nil}
+%endif
 # fdupes
 %fdupes %{buildroot}%{progdir}
 %fdupes %{buildroot}%{_datadir}
@@ -584,8 +674,8 @@
 %{progdir}/gtk2/libmozgtk.so
 %{progdir}/gmp-clearkey/
 %attr(755,root,root) %{progdir}/%{progname}.sh
-%{progdir}/firefox
-%{progdir}/firefox-bin
+%{progdir}/%{progname}
+%{progdir}/%{progname}-bin
 %{progdir}/application.ini
 %{progdir}/chrome.manifest
 %{progdir}/dependentlibs.list
@@ -616,13 +706,14 @@
 %doc %{_mandir}/man1/%{progname}.1.gz
 %{_datadir}/appdata/
 
+%if 0%{?devpkg}
 %files devel
 %defattr(-,root,root)
 %{_bindir}/mozilla-get-app-id
 %config %{_sysconfdir}/rpm/macros.%{progname}
+%endif
 
 %if %localize
-
 %files translations-common -f %{_tmppath}/translations.common
 %defattr(-,root,root)
 %dir %{progdir}
@@ -636,11 +727,9 @@
 
 # this package does not need to provide files but is needed to fulfill
 # requirements if no other branding package is to be installed
-%if %branding
 %files branding-upstream
 %defattr(-,root,root)
 %dir %{progdir}
-%endif
 
 %if %crashreporter
 %files buildsymbols
--- a/MozillaFirefox/_constraints	Sun Mar 17 10:00:10 2019 +0100
+++ b/MozillaFirefox/_constraints	Tue Nov 19 22:54:22 2019 +0100
@@ -2,7 +2,7 @@
 <constraints>
   <hardware>
     <disk>
-      <size unit="G">22</size>
+      <size unit="G">25</size>
     </disk>
     <memory>
       <size unit="G">8</size>
@@ -12,11 +12,23 @@
     <conditions>
       <arch>armv6l</arch>
       <arch>armv7l</arch>
+    </conditions>
+    <hardware>
+      <disk>
+        <size unit="G">12</size>
+      </disk>
+      <memory>
+        <size unit="G">5</size>
+      </memory>
+    </hardware>
+  </overwrite>
+  <overwrite>
+    <conditions>
       <arch>aarch64</arch>
     </conditions>
     <hardware>
       <memory>
-        <size unit="G">9</size>
+        <size unit="G">12</size>
       </memory>
     </hardware>
   </overwrite>
--- a/MozillaFirefox/create-tar.sh	Sun Mar 17 10:00:10 2019 +0100
+++ b/MozillaFirefox/create-tar.sh	Tue Nov 19 22:54:22 2019 +0100
@@ -1,20 +1,126 @@
 #!/bin/bash
 
-# TODO
-# http://ftp.mozilla.org/pub/firefox/candidates/48.0-candidates/build2/linux-x86_64/en-US/firefox-48.0.json
-# "moz_source_stamp": "c1de04f39fa956cfce83f6065b0e709369215ed5"
-# http://ftp.mozilla.org/pub/firefox/candidates/48.0-candidates/build2/l10n_changesets.txt
+function print_usage_and_exit() {
+  echo "Usage: create-tar.sh tar_stamps"
+  echo ""
+  echo "Where tar_stamps should look like this:"
+  echo ""
+  cat << EOF
+# Node ID: 64ee63facd4ff96b3e8590cff559d7e97ac6b061
+PRODUCT="firefox" # "firefox" or "thunderbird"
+CHANNEL="esr60"
+VERSION="60.7.0"
+VERSION_SUFFIX="esr"
+RELEASE_TAG="" # Needs only to be set if no tar-ball can be downloaded
+PREV_VERSION="60.6.3" # Prev. version only needed for locales (leave empty to force l10n-generation)
+PREV_VERSION_SUFFIX="esr"
+#SKIP_LOCALES="" # Uncomment to skip l10n and compare-locales-generation
+EOF
+
+exit 1
+}
+
+if [ $# -ne 1 ]; then
+  print_usage_and_exit
+fi
+
+# Sourcing the given tar_stamps-file to have the variables available
+source "$1" || print_usage_and_exit
+
+# Internal variables
+BRANCH="releases/mozilla-$CHANNEL"
+if [ "$PRODUCT" = "firefox" ]; then
+  LOCALE_FILE="firefox-$VERSION/browser/locales/l10n-changesets.json"
+else
+  LOCALE_FILE="thunderbird-$VERSION/comm/mail/locales/l10n-changesets.json"
+fi
+
+SOURCE_TARBALL="$PRODUCT-$VERSION$VERSION_SUFFIX.source.tar.xz"
+FTP_URL="https://ftp.mozilla.org/pub/$PRODUCT/releases/$VERSION$VERSION_SUFFIX/source"
+# Make first letter of PRODCUT upper case
+PRODUCT_CAP="${PRODUCT^}"
+LOCALES_URL="https://product-details.mozilla.org/1.0/l10n/$PRODUCT_CAP"
+# Exit script on CTRL+C
+trap "exit" INT
+
+function check_tarball_source () {
+  TARBALL=$1
+  # Print out what is going to be done:
+  if [ -e $TARBALL ]; then
+      echo "Reuse existing file"
+  elif wget --spider $FTP_URL/$TARBALL 2> /dev/null; then
+      echo "Download file"
+  else
+      echo "Mercurial checkout"
+  fi
+}
 
-CHANNEL="beta"
-BRANCH="releases/mozilla-$CHANNEL"
-RELEASE_TAG="1ea7b51ef5bb91bdc34fb7406fd4d35ed7961363"
-VERSION="65.0.1"
-VERSION_SUFFIX=""
-LOCALE_FILE="firefox-$VERSION/browser/locales/l10n-changesets.json"
+function ask_cont_abort_question() {
+  while true; do
+    read -p "$1 [(c)ontinue/(a)bort] " ca
+    case $ca in
+        [Cc]* ) return 0 ;;
+        [Aa]* ) return 1 ;;
+        * ) echo "Please answer c or a.";;
+    esac
+  done
+}
+
+function check_for_binary() {
+  if ! test -x $1; then
+    echo "$1 is missing: execute zypper in $2"
+    exit 5
+  fi
+}
+
+function locales_get() {
+  TMP_VERSION="$1"
+  URL_TO_CHECK="${LOCALES_URL}-${TMP_VERSION}"
+
+  LAST_FOUND=""
+  # Unfortunately, locales-files are not associated to releases, but to builds.
+  # And since we don't know which build was the final build, we go from 9 downwards
+  # try to find the latest one that exists (assuming there are no more than 9 builds).
+  # Error only if not even the first one exists
+  for BUILD_ID in $(seq 9 -1 0); do
+    FINAL_URL="${URL_TO_CHECK}-build${BUILD_ID}.json"
+    if wget --quiet --spider "$FINAL_URL"; then
+      LAST_FOUND="$FINAL_URL"
+      break
+    fi
+  done
+
+  if [ "$LAST_FOUND" != "" ]; then
+    echo "$LAST_FOUND"
+    return 0
+  else
+    echo "Error: Could not find locales-file (json) for Firefox $TMP_VERSION !"  1>&2
+    return 1
+  fi
+}
+
+function locales_parse() {
+  URL="$1"
+  curl -s "$URL" | python -c "import json; import sys; \
+             print('\n'.join(['{} {}'.format(key, value['changeset']) \
+                for key, value in sorted(json.load(sys.stdin)['locales'].items())]));"
+}
+
+function locales_unchanged() {
+  # If no json-file for one of the versions can be found, we say "they changed"
+  prev_url=$(locales_get "$PREV_VERSION$PREV_VERSION_SUFFIX") || return 1
+  curr_url=$(locales_get "$VERSION$VERSION_SUFFIX")      || return 1
+
+  prev_content=$(locales_parse "$prev_url") || exit 1
+  curr_content=$(locales_parse "$curr_url") || exit 1
+
+  diff -y --suppress-common-lines -d <(echo "$prev_content") <(echo "$curr_content")
+}
 
 # check required tools
-test -x /usr/bin/hg || ( echo "hg missing: execute zypper in mercurial"; exit 5 )
-test -x /usr/bin/jq || ( echo "jq missing: execute zypper in jq"; exit 5 )
+check_for_binary /usr/bin/hg "mercurial"
+check_for_binary /usr/bin/jq "jq"
+which python > /dev/null || exit 1
 
 # use parallel compression, if available
 compression='-J'
@@ -23,69 +129,153 @@
   compression='-Ipixz'
 fi
 
+if [ -z ${SKIP_LOCALES+x} ]; then
+  # TODO: Thunderbird has usually "default" as locale entry. 
+  # There we probably need to double-check Firefox-locals
+  # For now, just download every time for Thunderbird
+  if [ "$PRODUCT" = "firefox" ] && [ "$PREV_VERSION" != "" ] && locales_unchanged; then
+    printf "%-40s: Did not change. Skipping.\n" "locales"
+    LOCALES_CHANGED=0
+  else
+    printf "%-40s: Need to download.\n" "locales"
+    LOCALES_CHANGED=1
+  fi
+else 
+  printf "%-40s: User forced skip (SKIP_LOCALES set)\n" "locales"
+fi
+
+# Check what is going to be done and ask for consent
+for ff in $SOURCE_TARBALL $SOURCE_TARBALL.asc; do
+  printf "%-40s: %s\n" $ff "$(check_tarball_source $ff)"
+done
+
+$(ask_cont_abort_question "Is this ok?") || exit 0
+
+# Try to download tar-ball from officiall mozilla-mirror
+if [ ! -e $SOURCE_TARBALL ]; then
+  wget https://ftp.mozilla.org/pub/$PRODUCT/releases/$VERSION$VERSION_SUFFIX/source/$SOURCE_TARBALL
+fi
+# including signature
+if [ ! -e $SOURCE_TARBALL.asc ]; then
+  wget https://ftp.mozilla.org/pub/$PRODUCT/releases/$VERSION$VERSION_SUFFIX/source/$SOURCE_TARBALL.asc
+fi
+
 # we might have an upstream archive already and can skip the checkout
-if [ -e firefox-$VERSION$VERSION_SUFFIX.source.tar.xz ]; then
-  echo "skip firefox checkout and use available archive"
-  # still need to extract the locale information from the archive
-  echo "extract locale changesets"
-  tar -xf firefox-$VERSION$VERSION_SUFFIX.source.tar.xz $LOCALE_FILE
+if [ -e $SOURCE_TARBALL ]; then
+  if [ -z ${SKIP_LOCALES+x} ] && [ $LOCALES_CHANGED -ne 0 ]; then
+    # still need to extract the locale information from the archive
+    echo "extract locale changesets"
+    tar -xf $SOURCE_TARBALL $LOCALE_FILE
+  fi
 else
+  # We are working on a version that is not yet published on the mozilla mirror
+  # so we have to actually check out the repo
+
   # mozilla
-  if [ -d firefox-$VERSION ]; then
-    pushd firefox-$VERSION
+  if [ -d $PRODUCT-$VERSION ]; then
+    pushd $PRODUCT-$VERSION || exit 1
     _repourl=$(hg paths)
     case "$_repourl" in
       *$BRANCH*)
         echo "updating previous tree"
         hg pull
-        popd
+        popd || exit 1
         ;;
       * )
         echo "removing obsolete tree"
-        popd
-        rm -rf firefox-$VERSION
+        popd || exit 1
+        rm -rf $PRODUCT-$VERSION
         ;;
     esac
   fi
-  if [ ! -d firefox-$VERSION ]; then
+  if [ ! -d $PRODUCT-$VERSION ]; then
     echo "cloning new $BRANCH..."
-    hg clone http://hg.mozilla.org/$BRANCH firefox-$VERSION
+    hg clone http://hg.mozilla.org/$BRANCH $PRODUCT-$VERSION
+    if [ "$PRODUCT" = "thunderbird" ]; then
+      hg clone http://hg.mozilla.org/releases/comm-$CHANNEL $PRODUCT-$VERSION/comm
+    fi
   fi
-  pushd firefox-$VERSION
-  hg update --check
-  [ "$RELEASE_TAG" == "default" ] || hg update -r $RELEASE_TAG
+  pushd $PRODUCT-$VERSION || exit 1
+
+  # parse out the Firefox-release tag for this Thunderbird-checkout
+  if [ "$PRODUCT" = "thunderbird" ]; then
+    FF_RELEASE_TAG=$(grep ^GECKO_HEAD_REV ./comm/.gecko_rev.yml | awk -F ' ' '{print $2}') || exit 1
+    echo "Parsed Firefox base ID from .gecko_rev.yml: $FF_RELEASE_TAG"
+  else
+    FF_RELEASE_TAG="$RELEASE_TAG"
+  fi
+
+  hg update --check $FF_RELEASE_TAG
+  [ "$FF_RELEASE_TAG" == "default" ] || hg update -r $FF_RELEASE_TAG
   # get repo and source stamp
   echo -n "REV=" > ../source-stamp.txt
   hg -R . parent --template="{node|short}\n" >> ../source-stamp.txt
   echo -n "REPO=" >> ../source-stamp.txt
   hg showconfig paths.default 2>/dev/null | head -n1 | sed -e "s/^ssh:/http:/" >> ../source-stamp.txt
-  popd
+
+  if [ "$PRODUCT" = "thunderbird" ]; then
+    pushd comm || exit 1
+    hg update --check $RELEASE_TAG
+    popd || exit 1
+    rm -rf thunderbird-${VERSION}/{,comm/}other-licenses/7zstub
+  fi
+  popd || exit 1
 
   echo "creating archive..."
-  tar $compression -cf firefox-$VERSION$VERSION_SUFFIX.source.tar.xz --exclude=.hgtags --exclude=.hgignore --exclude=.hg --exclude=CVS firefox-$VERSION
+  tar $compression -cf $PRODUCT-$VERSION$VERSION_SUFFIX.source.tar.xz --exclude=.hgtags --exclude=.hgignore --exclude=.hg --exclude=CVS $PRODUCT-$VERSION
+fi
+
+if [ ! -z ${SKIP_LOCALES+x} ]; then
+  echo "Skipping locales-creation."
+  exit 0
 fi
 
-# l10n
-echo "fetching locales..."
-test ! -d l10n && mkdir l10n
-jq -r 'to_entries[]| "\(.key) \(.value|.revision)"' $LOCALE_FILE | \
-  while read locale changeset ; do
-    case $locale in
-      ja-JP-mac|en-US)
-        ;;
-      *)
-        echo "reading changeset information for $locale"
-        echo "fetching $locale changeset $changeset ..."
-        hg clone http://hg.mozilla.org/l10n-central/$locale l10n/$locale
-        [ "$RELEASE_TAG" == "default" ] || hg -R l10n/$locale up -C -r $changeset
-        ;;
-    esac
-  done
-echo "creating l10n archive..."
-tar $compression -cf l10n-$VERSION$VERSION_SUFFIX.tar.xz --exclude=.hgtags --exclude=.hgignore --exclude=.hg l10n
+if [ $LOCALES_CHANGED -ne 0 ]; then
+  # l10n
+  echo "fetching locales..."
+  test ! -d l10n && mkdir l10n
+  jq -r 'to_entries[]| "\(.key) \(.value|.revision)"' $LOCALE_FILE | \
+    while read locale changeset ; do
+      case $locale in
+        ja-JP-mac|en-US)
+          ;;
+        *)
+          echo "reading changeset information for $locale"
+          echo "fetching $locale changeset $changeset ..."
+          if [ -d "l10n/$locale/.hg" ]; then
+            pushd "l10n/$locale" || exit 1
+            hg pull
+            popd || exit 1
+          else
+            hg clone "http://hg.mozilla.org/l10n-central/$locale" "l10n/$locale"
+          fi
+          [ "$RELEASE_TAG" == "default" ] || hg -R "l10n/$locale" up -C -r "$changeset"
+          ;;
+      esac
+    done
+  echo "creating l10n archive..."
+  if [ "$PRODUCT" = "thunderbird" ]; then
+    TB_TAR_FLAGS="--exclude=browser --exclude=suite"
+  fi
+  tar $compression -cf l10n-$VERSION$VERSION_SUFFIX.tar.xz \
+  --exclude=.hgtags --exclude=.hgignore --exclude=.hg \
+  $TB_TAR_FLAGS \
+  l10n
+elif [ -f "l10n-$PREV_VERSION$PREV_VERSION_SUFFIX.tar.xz" ]; then
+  # Locales did not change, but the old tar-ball is in this directory
+  # Simply rename it:
+  echo "Moving l10n-$PREV_VERSION$PREV_VERSION_SUFFIX.tar.xz to l10n-$VERSION$VERSION_SUFFIX.tar.xz"
+  mv "l10n-$PREV_VERSION$PREV_VERSION_SUFFIX.tar.xz" "l10n-$VERSION$VERSION_SUFFIX.tar.xz"
+fi
 
 # compare-locales
 echo "creating compare-locales"
-hg clone http://hg.mozilla.org/build/compare-locales
+if [ -d compare-locales/.hg ]; then
+  pushd compare-locales || exit 1
+  hg pull
+  popd || exit 1
+else
+  hg clone http://hg.mozilla.org/build/compare-locales
+fi
 tar $compression -cf compare-locales.tar.xz --exclude=.hgtags --exclude=.hgignore --exclude=.hg compare-locales
 
--- a/MozillaFirefox/firefox.js	Sun Mar 17 10:00:10 2019 +0100
+++ b/MozillaFirefox/firefox.js	Tue Nov 19 22:54:22 2019 +0100
@@ -1,3 +1,7 @@
 pref("intl.locale.requested", "");
-pref("browser.preferences.instantApply", true);
 pref("geo.wifi.uri", "https://location.services.mozilla.com/v1/geolocate?key=%MOZILLA_API_KEY%");
+/* Disable DoH by default */
+pref("network.trr.mode", 5);
+// do not disable system-global or app-global extensions
+pref("extensions.autoDisableScopes", 3);
+pref("extensions.shownSelectionUI", true);
--- a/MozillaFirefox/kde.js	Sun Mar 17 10:00:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-pref("browser.preferences.instantApply", false);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1005535.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-bmo1005535.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1504834-part1.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-bmo1504834-part1.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1504834-part2.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-bmo1504834-part2.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1504834-part3.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-bmo1504834-part3.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1511604.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-bmo1511604.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1512162.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-bmo1512162.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1554971.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-bmo1554971.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1568145.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-bmo1568145.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-bmo256180.patch	Sun Mar 17 10:00:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-bmo256180.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-disable-wasm-emulate-arm-unaligned-fp-access.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-disable-wasm-emulate-arm-unaligned-fp-access.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-fix-aarch64-libopus.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-fix-aarch64-libopus.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-fix-top-level-asm.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,42 @@
+From 91bb79836ee274855393bdf6ab10e24899b1b349 Mon Sep 17 00:00:00 2001
+From: Martin Liska <mliska@suse.cz>
+Date: Fri, 17 May 2019 14:41:35 +0200
+Subject: [PATCH] Fix top-level asm issue.
+
+---
+ security/sandbox/linux/moz.build | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/security/sandbox/linux/moz.build b/security/sandbox/linux/moz.build
+index aae85843e9f6..208368dfd189 100644
+--- a/security/sandbox/linux/moz.build
++++ b/security/sandbox/linux/moz.build
+@@ -61,7 +61,6 @@ UNIFIED_SOURCES += [
+     '../chromium/sandbox/linux/bpf_dsl/policy_compiler.cc',
+     '../chromium/sandbox/linux/bpf_dsl/syscall_set.cc',
+     '../chromium/sandbox/linux/seccomp-bpf/die.cc',
+-    '../chromium/sandbox/linux/seccomp-bpf/syscall.cc',
+     'broker/SandboxBrokerCommon.cpp',
+     'Sandbox.cpp',
+     'SandboxBrokerClient.cpp',
+@@ -77,6 +76,7 @@ UNIFIED_SOURCES += [
+ SOURCES += [
+     '../chromium/base/strings/safe_sprintf.cc',
+     '../chromium/base/third_party/icu/icu_utf.cc',
++    '../chromium/sandbox/linux/seccomp-bpf/syscall.cc',
+     '../chromium/sandbox/linux/seccomp-bpf/trap.cc',
+     '../chromium/sandbox/linux/services/syscall_wrappers.cc',
+ ]
+@@ -96,6 +96,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
+     SOURCES['../chromium/sandbox/linux/services/syscall_wrappers.cc'].flags += [
+         '-Wno-empty-body',
+     ]
++    SOURCES['../chromium/sandbox/linux/seccomp-bpf/syscall.cc'].flags += [
++        '-fno-lto'
++    ]
+ 
+ # gcc lto likes to put the top level asm in syscall.cc in a different partition
+ # from the function using it which breaks the build.  Work around that by
+-- 
+2.23.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-ppc-altivec_static_inline.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-ppc-altivec_static_inline.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-reduce-rust-debuginfo.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-reduce-rust-debuginfo.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-s390-bigendian.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-s390-bigendian.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-s390-context.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,1 @@
+../mozilla-s390-context.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla.keyring	Sun Mar 17 10:00:10 2019 +0100
+++ b/MozillaFirefox/mozilla.keyring	Tue Nov 19 22:54:22 2019 +0100
@@ -12,258 +12,322 @@
 uid           [  full  ] Mozilla Software Releases <release@mozilla.com>
 sub   rsa4096 2015-07-17 [S] [expires: 2017-07-16]
 sub   rsa4096 2017-06-22 [S] [expires: 2019-06-22]
+sub   rsa4096 2019-05-30 [S] [expires: 2021-05-29]
 
 -----BEGIN PGP PUBLIC KEY BLOCK-----
-Version: SKS 1.1.5
-Comment: Hostname: keyserver.mozilla.org
 
-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
-MuTo71rAVDLtxerc+GNq0GI=
-=YjV6
+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
+=xFcH
 -----END PGP PUBLIC KEY BLOCK-----
--- a/MozillaFirefox/source-stamp.txt	Sun Mar 17 10:00:10 2019 +0100
+++ b/MozillaFirefox/source-stamp.txt	Tue Nov 19 22:54:22 2019 +0100
@@ -1,2 +1,2 @@
-REV=1ea7b51ef5bb
+REV=990d9f90f0f5c02b8af12d784dc76ab40ea84781
 REPO=http://hg.mozilla.org/releases/mozilla-release
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/tar_stamps	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,9 @@
+PRODUCT="firefox"
+CHANNEL="release"
+VERSION="70.0"
+VERSION_SUFFIX=""
+RELEASE_TAG="990d9f90f0f5c02b8af12d784dc76ab40ea84781"
+PREV_VERSION=""
+PREV_VERSION_SUFFIX=""
+#SKIP_LOCALES="" # Uncomment to skip l10n and compare-locales-generation
+
--- a/firefox-branded-icons.patch	Sun Mar 17 10:00:10 2019 +0100
+++ b/firefox-branded-icons.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -1,6 +1,6 @@
 # HG changeset patch
 # Parent e0751ad74e835e80041a61ea00c2a63bf6fbe2de
-# Parent  8a401a01454e9f5e8a357262d774e0ff348d9bc1
+# Parent  b75f4c79d0757cd16065811d34a563bdb5cfb15e
 
 diff --git a/browser/branding/branding-common.mozbuild b/browser/branding/branding-common.mozbuild
 --- a/browser/branding/branding-common.mozbuild
@@ -10,13 +10,13 @@
              'VisualElements_150.png',
              'VisualElements_70.png',
          ]
-     elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
+     elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk':
          FINAL_TARGET_FILES.chrome.icons.default += [
              'default128.png',
              'default16.png',
-+	    'default22.png',
-+	    'default24.png',
-+	    'default256.png',
++            'default22.png',
++            'default24.png',
++            'default256.png',
              'default32.png',
              'default48.png',
              'default64.png',
@@ -24,7 +24,7 @@
 diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
 --- a/browser/installer/package-manifest.in
 +++ b/browser/installer/package-manifest.in
-@@ -404,20 +404,23 @@
+@@ -246,20 +246,23 @@
  @RESPATH@/browser/chrome/pdfjs.manifest
  @RESPATH@/browser/chrome/pdfjs/*
  @RESPATH@/chrome/toolkit@JAREXT@
@@ -46,5 +46,5 @@
  ; [Webide Files]
  @RESPATH@/browser/chrome/webide@JAREXT@
  @RESPATH@/browser/chrome/webide.manifest
- @RESPATH@/browser/@PREF_DIR@/webide.js
  
+ ; [DevTools Startup Files]
--- a/firefox-kde.patch	Sun Mar 17 10:00:10 2019 +0100
+++ b/firefox-kde.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -1,1493 +1,21 @@
 # HG changeset patch
-# Parent  693f0baece29cc958a7d91b89fd12e3b89a502e3
+# User msirringhaus@suse.de
+# Date 1559300151 -7200
+#      Fri May 31 12:55:51 2019 +0200
+# Node ID 54d41b0033b8d649d842a1f862c6fed8b9874dec
+# Parent  4faaad3619f286bd6077754d8e59d339a5142b80
+How to apply this patch:
+1. Import and apply it
+2. cp browser/base/content/browser.xul browser/base/content/browser-kde.xul
+3. Find editBookmarkPanelDoneButton
+4. Replace #ifndef with #ifdef in the line above (this hanges the button order from Gnome-style to KDE-style)
+5. hg qrefresh
 
-diff --git a/browser/base/content/browser-kde.xul b/browser/base/content/browser-kde.xul
-new file mode 100644
---- /dev/null
-+++ b/browser/base/content/browser-kde.xul
-@@ -0,0 +1,1395 @@
-+#filter substitution
-+<?xml version="1.0"?>
-+# -*- Mode: HTML -*-
-+#
-+# This Source Code Form is subject to the terms of the Mozilla Public
-+# License, v. 2.0. If a copy of the MPL was not distributed with this
-+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-+
-+<!-- The "global.css" stylesheet is imported first to allow other stylesheets to
-+     override rules using selectors with the same specificity. This applies to
-+     both "content" and "skin" packages, which bug 1385444 will unify later. -->
-+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-+
-+<!-- While these stylesheets are defined in Toolkit, they are only used in the
-+     main browser window, so we can load them here. Bug 1474241 is on file to
-+     consider moving these widgets to the "browser" folder. -->
-+<?xml-stylesheet href="chrome://global/content/tabprompts.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://global/skin/tabprompts.css" type="text/css"?>
-+
-+<?xml-stylesheet href="chrome://browser/content/browser.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/content/tabbrowser.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/content/downloads/downloads.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/content/places/places.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/content/usercontext/usercontext.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/skin/controlcenter/panel.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/skin/customizableui/panelUI.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/skin/downloads/downloads.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/skin/searchbar.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/skin/places/tree-icons.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/skin/places/editBookmark.css" type="text/css"?>
-+<?xml-stylesheet href="chrome://browser/skin/compacttheme.css" type="text/css" alternate="yes" title="Light/Dark"?>
-+
-+# All DTD information is stored in a separate file so that it can be shared by
-+# hiddenWindow.xul.
-+<!DOCTYPE window [
-+#include browser-doctype.inc
-+]>
-+
-+<window id="main-window"
-+        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-+        xmlns:svg="http://www.w3.org/2000/svg"
-+        xmlns:html="http://www.w3.org/1999/xhtml"
-+        xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-+        title="&mainWindow.title;"
-+        title_normal="&mainWindow.title;"
-+#ifdef XP_MACOSX
-+        title_privatebrowsing="&mainWindow.title;&mainWindow.titlemodifiermenuseparator;&mainWindow.titlePrivateBrowsingSuffix;"
-+        titledefault="&mainWindow.title;"
-+        titlemodifier=""
-+        titlemodifier_normal=""
-+        titlemodifier_privatebrowsing="&mainWindow.titlePrivateBrowsingSuffix;"
-+#else
-+        title_privatebrowsing="&mainWindow.titlemodifier; &mainWindow.titlePrivateBrowsingSuffix;"
-+        titlemodifier="&mainWindow.titlemodifier;"
-+        titlemodifier_normal="&mainWindow.titlemodifier;"
-+        titlemodifier_privatebrowsing="&mainWindow.titlemodifier; &mainWindow.titlePrivateBrowsingSuffix;"
-+#endif
-+#ifdef XP_WIN
-+        chromemargin="0,2,2,2"
-+#else
-+        chromemargin="0,-1,-1,-1"
-+#endif
-+        tabsintitlebar="true"
-+        titlemenuseparator="&mainWindow.titlemodifiermenuseparator;"
-+        windowtype="navigator:browser"
-+        macanimationtype="document"
-+        screenX="4" screenY="4"
-+        fullscreenbutton="true"
-+        sizemode="normal"
-+        retargetdocumentfocus="urlbar"
-+        persist="screenX screenY width height sizemode"
-+#ifdef BROWSER_XHTML
-+        hidden="true"
-+        mozpersist=""
-+#endif
-+        >
-+
-+# All JS files which are needed by browser.xul and other top level windows to
-+# support MacOS specific features *must* go into the global-scripts.inc file so
-+# that they can be shared with macWindow.inc.xul.
-+#include global-scripts.inc
-+
-+<script type="application/javascript"
-+#ifdef BROWSER_XHTML
-+xmlns="http://www.w3.org/1999/xhtml"
-+#endif
-+>
-+  Services.scriptloader.loadSubScript("chrome://global/content/contentAreaUtils.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-captivePortal.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-compacttheme.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-contentblocking.js", this);
-+#ifdef MOZ_DATA_REPORTING
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-data-submission-info-bar.js", this);
-+#endif
-+#ifndef MOZILLA_OFFICIAL
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-development-helpers.js", this);
-+#endif
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-media.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-pageActions.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-plugins.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-sidebar.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/browser-tabsintitlebar.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/tabbrowser.js", this);
-+  Services.scriptloader.loadSubScript("chrome://browser/content/search/searchbar.js", this);
-+
-+  window.onload = gBrowserInit.onLoad.bind(gBrowserInit);
-+  window.onunload = gBrowserInit.onUnload.bind(gBrowserInit);
-+  window.onclose = WindowIsClosing;
-+
-+#ifdef BROWSER_XHTML
-+  window.addEventListener("readystatechange", () => {
-+    // We initially hide the window to prevent layouts during parse. This lets us
-+    // avoid accidental XBL construction and better match browser.xul (see Bug 1497975).
-+    gBrowserInit.onBeforeInitialXULLayout();
-+    document.documentElement.removeAttribute("hidden");
-+  }, { once: true, capture: true });
-+#else
-+  window.addEventListener("MozBeforeInitialXULLayout",
-+    gBrowserInit.onBeforeInitialXULLayout.bind(gBrowserInit), { once: true });
-+#endif
-+  // The listener of DOMContentLoaded must be set on window, rather than
-+  // document, because the window can go away before the event is fired.
-+  // In that case, we don't want to initialize anything, otherwise we
-+  // may be leaking things because they will never be destroyed after.
-+  window.addEventListener("DOMContentLoaded",
-+    gBrowserInit.onDOMContentLoaded.bind(gBrowserInit), { once: true });
-+</script>
-+
-+# All sets except for popupsets (commands, keys, and stringbundles)
-+# *must* go into the browser-sets.inc file so that they can be shared with other
-+# top level windows in macWindow.inc.xul.
-+#include browser-sets.inc
-+
-+  <popupset id="mainPopupSet">
-+    <menupopup id="tabContextMenu"
-+               onpopupshowing="if (event.target == this) TabContextMenu.updateContextMenu(this);"
-+               onpopuphidden="if (event.target == this) TabContextMenu.contextTab = null;">
-+      <menuitem id="context_reloadTab" label="&reloadTab.label;" accesskey="&reloadTab.accesskey;"
-+                oncommand="gBrowser.reloadTab(TabContextMenu.contextTab);"/>
-+      <menuitem id="context_reloadSelectedTabs" label="&reloadTabs.label;" hidden="true"
-+                accesskey="&reloadTabs.accesskey;"
-+                oncommand="gBrowser.reloadMultiSelectedTabs();"/>
-+      <menuitem id="context_toggleMuteTab" oncommand="TabContextMenu.contextTab.toggleMuteAudio();"/>
-+      <menuitem id="context_toggleMuteSelectedTabs" hidden="true"
-+                oncommand="gBrowser.toggleMuteAudioOnMultiSelectedTabs(TabContextMenu.contextTab);"/>
-+      <menuitem id="context_pinTab" label="&pinTab.label;"
-+                accesskey="&pinTab.accesskey;"
-+                oncommand="gBrowser.pinTab(TabContextMenu.contextTab);"/>
-+      <menuitem id="context_unpinTab" label="&unpinTab.label;" hidden="true"
-+                accesskey="&unpinTab.accesskey;"
-+                oncommand="gBrowser.unpinTab(TabContextMenu.contextTab);"/>
-+      <menuitem id="context_pinSelectedTabs" label="&pinSelectedTabs.label;" hidden="true"
-+                accesskey="&pinSelectedTabs.accesskey;"
-+                oncommand="gBrowser.pinMultiSelectedTabs();"/>
-+      <menuitem id="context_unpinSelectedTabs" label="&unpinSelectedTabs.label;" hidden="true"
-+                accesskey="&unpinSelectedTabs.accesskey;"
-+                oncommand="gBrowser.unpinMultiSelectedTabs();"/>
-+      <menuitem id="context_duplicateTab" label="&duplicateTab.label;"
-+                accesskey="&duplicateTab.accesskey;"
-+                oncommand="duplicateTabIn(TabContextMenu.contextTab, 'tab');"/>
-+      <menuitem id="context_duplicateTabs" label="&duplicateTabs.label;"
-+                accesskey="&duplicateTabs.accesskey;"
-+                oncommand="TabContextMenu.duplicateSelectedTabs();"/>
-+      <menuseparator/>
-+      <menuitem id="context_selectAllTabs" label="&selectAllTabs.label;" accesskey="&selectAllTabs.accesskey;"
-+                oncommand="gBrowser.selectAllTabs();"/>
-+      <menuitem id="context_bookmarkSelectedTabs"
-+                hidden="true"
-+                label="&bookmarkSelectedTabs.label;"
-+                accesskey="&bookmarkSelectedTabs.accesskey;"
-+                oncommand="PlacesCommandHook.bookmarkPages(PlacesCommandHook.uniqueSelectedPages);"/>
-+      <menuitem id="context_bookmarkTab"
-+                label="&bookmarkTab.label;"
-+                accesskey="&bookmarkTab.accesskey;"
-+                oncommand="PlacesCommandHook.bookmarkPages(PlacesCommandHook.getUniquePages([TabContextMenu.contextTab]));"/>
-+      <menu id="context_reopenInContainer"
-+            label="&reopenInContainer.label;"
-+            accesskey="&reopenInContainer.accesskey;"
-+            hidden="true">
-+        <menupopup oncommand="TabContextMenu.reopenInContainer(event);"
-+                   onpopupshowing="TabContextMenu.createReopenInContainerMenu(event);"/>
-+      </menu>
-+      <menu id="context_moveTabOptions"
-+            multiselectcontextlabel="&moveSelectedTabOptions.label;"
-+            multiselectcontextaccesskey="&moveSelectedTabOptions.accesskey;"
-+            nonmultiselectcontextlabel="&moveTabOptions.label;"
-+            nonmultiselectcontextaccesskey="&moveTabOptions.accesskey;">
-+        <menupopup id="moveTabOptionsMenu">
-+          <menuitem id="context_moveToStart"
-+                    label="&moveToStart.label;"
-+                    accesskey="&moveToStart.accesskey;"
-+                    tbattr="tabbrowser-multiple"
-+                    oncommand="gBrowser.moveTabsToStart(TabContextMenu.contextTab);"/>
-+          <menuitem id="context_moveToEnd"
-+                    label="&moveToEnd.label;"
-+                    accesskey="&moveToEnd.accesskey;"
-+                    tbattr="tabbrowser-multiple"
-+                    oncommand="gBrowser.moveTabsToEnd(TabContextMenu.contextTab);"/>
-+          <menuitem id="context_openTabInWindow" label="&moveToNewWindow.label;"
-+                    accesskey="&moveToNewWindow.accesskey;"
-+                    tbattr="tabbrowser-multiple"
-+                    oncommand="gBrowser.replaceTabsWithWindow(TabContextMenu.contextTab);"/>
-+        </menupopup>
-+      </menu>
-+      <menu id="context_sendTabToDevice"
-+            class="sync-ui-item">
-+        <menupopup id="context_sendTabToDevicePopupMenu"
-+                   onpopupshowing="gSync.populateSendTabToDevicesMenu(event.target, TabContextMenu.contextTab.linkedBrowser.currentURI.spec, TabContextMenu.contextTab.linkedBrowser.contentTitle, TabContextMenu.contextTab.multiselected);"/>
-+      </menu>
-+      <menuseparator/>
-+      <menuitem id="context_closeTabsToTheEnd" label="&closeTabsToTheEnd.label;" accesskey="&closeTabsToTheEnd.accesskey;"
-+                oncommand="gBrowser.removeTabsToTheEndFrom(TabContextMenu.contextTab, {animate: true});"/>
-+      <menuitem id="context_closeOtherTabs" label="&closeOtherTabs.label;" accesskey="&closeOtherTabs.accesskey;"
-+                oncommand="gBrowser.removeAllTabsBut(TabContextMenu.contextTab);"/>
-+      <menuitem id="context_undoCloseTab"
-+                label="&undoCloseTab.label;"
-+                accesskey="&undoCloseTab.accesskey;"
-+                observes="History:UndoCloseTab"/>
-+      <menuitem id="context_closeTab" label="&closeTab.label;" accesskey="&closeTab.accesskey;"
-+                oncommand="gBrowser.removeTab(TabContextMenu.contextTab, { animate: true });"/>
-+      <menuitem id="context_closeSelectedTabs" label="&closeTabs.label;"
-+                hidden="true" accesskey="&closeTabs.accesskey;"
-+                oncommand="gBrowser.removeMultiSelectedTabs();"/>
-+    </menupopup>
-+
-+    <!-- bug 415444/582485: event.stopPropagation is here for the cloned version
-+         of this menupopup -->
-+    <menupopup id="backForwardMenu"
-+               onpopupshowing="return FillHistoryMenu(event.target);"
-+               oncommand="gotoHistoryIndex(event); event.stopPropagation();"
-+               onclick="checkForMiddleClick(this, event);"/>
-+    <tooltip id="aHTMLTooltip" page="true"/>
-+    <tooltip id="remoteBrowserTooltip"/>
-+
-+    <!-- for search and content formfill/pw manager -->
-+
-+    <panel type="autocomplete-richlistbox"
-+           id="PopupAutoComplete"
-+           role="group"
-+           noautofocus="true"
-+           hidden="true"
-+           overflowpadding="4"
-+           norolluponanchor="true"
-+           nomaxresults="true" />
-+
-+    <!-- for search with one-off buttons -->
-+    <panel type="autocomplete-richlistbox"
-+           id="PopupSearchAutoComplete"
-+           role="group"
-+           noautofocus="true"
-+           hidden="true" />
-+
-+    <!-- for url bar autocomplete -->
-+    <panel type="autocomplete-richlistbox"
-+           id="PopupAutoCompleteRichResult"
-+           role="group"
-+           noautofocus="true"
-+           hidden="true"
-+           flip="none"
-+           level="parent"
-+           overflowpadding="15" />
-+
-+    <!-- for url bar autocomplete -->
-+    <panel id="urlbar-results"
-+           role="group"
-+           noautofocus="true"
-+           hidden="true"
-+           flip="none"
-+           level="parent">
-+      <html:div class="urlbarView-body-outer">
-+        <html:div class="urlbarView-body-inner">
-+          <!-- TODO: add search suggestions notification -->
-+          <html:div class="urlbarView-results"/>
-+        </html:div>
-+      </html:div>
-+      <hbox class="search-one-offs"
-+            compact="true"
-+            includecurrentengine="true"
-+            disabletab="true"/>
-+    </panel>
-+
-+    <!-- for date/time picker. consumeoutsideclicks is set to never, so that
-+         clicks on the anchored input box are never consumed. -->
-+    <panel id="DateTimePickerPanel"
-+           type="arrow"
-+           hidden="true"
-+           orient="vertical"
-+           noautofocus="true"
-+           norolluponanchor="true"
-+           consumeoutsideclicks="never"
-+           level="parent"
-+           tabspecific="true">
-+    </panel>
-+
-+    <!-- for select dropdowns. The menupopup is what shows the list of options,
-+         and the popuponly menulist makes things like the menuactive attributes
-+         work correctly on the menupopup. ContentSelectDropdown expects the
-+         popuponly menulist to be its immediate parent. -->
-+    <menulist popuponly="true" id="ContentSelectDropdown" hidden="true">
-+      <menupopup rolluponmousewheel="true"
-+                 activateontab="true" position="after_start"
-+                 level="parent"
-+#ifdef XP_WIN
-+                 consumeoutsideclicks="false" ignorekeys="shortcuts"
-+#endif
-+        />
-+    </menulist>
-+
-+    <!-- for invalid form error message -->
-+    <panel id="invalid-form-popup" type="arrow" orient="vertical" noautofocus="true" hidden="true" level="parent">
-+      <description/>
-+    </panel>
-+
-+    <panel id="editBookmarkPanel"
-+           type="arrow"
-+           orient="vertical"
-+           ignorekeys="true"
-+           hidden="true"
-+           tabspecific="true"
-+           aria-labelledby="editBookmarkPanelTitle">
-+      <box class="panel-header">
-+        <label id="editBookmarkPanelTitle"/>
-+      </box>
-+      <html:div id="editBookmarkPanelFaviconContainer">
-+        <html:img id="editBookmarkPanelFavicon"/>
-+      </html:div>
-+      <box id="editBookmarkPanelImage"/>
-+#include ../../components/places/content/editBookmarkPanel.inc.xul
-+      <vbox id="editBookmarkPanelBottomContent"
-+            flex="1">
-+        <checkbox id="editBookmarkPanel_showForNewBookmarks"
-+                  label="&editBookmark.showForNewBookmarks.label;"
-+                  accesskey="&editBookmark.showForNewBookmarks.accesskey;"
-+                  oncommand="StarUI.onShowForNewBookmarksCheckboxCommand();"/>
-+      </vbox>
-+      <hbox id="editBookmarkPanelBottomButtons"
-+            class="panel-footer"
-+            style="min-width: &editBookmark.panel.width;;">
-+#ifdef XP_UNIX
-+        <button id="editBookmarkPanelDoneButton"
-+                class="editBookmarkPanelBottomButton"
-+                label="&editBookmark.done.label;"
-+                default="true"
-+                oncommand="StarUI.panel.hidePopup();"/>
-+        <button id="editBookmarkPanelRemoveButton"
-+                class="editBookmarkPanelBottomButton"
-+                oncommand="StarUI.removeBookmarkButtonCommand();"/>
-+#else
-+        <button id="editBookmarkPanelRemoveButton"
-+                class="editBookmarkPanelBottomButton"
-+                oncommand="StarUI.removeBookmarkButtonCommand();"/>
-+        <button id="editBookmarkPanelDoneButton"
-+                class="editBookmarkPanelBottomButton"
-+                label="&editBookmark.done.label;"
-+                default="true"
-+                oncommand="StarUI.panel.hidePopup();"/>
-+#endif
-+      </hbox>
-+    </panel>
-+
-+    <!-- UI tour experience -->
-+    <panel id="UITourTooltip"
-+           type="arrow"
-+           hidden="true"
-+           noautofocus="true"
-+           noautohide="true"
-+           align="start"
-+           orient="vertical"
-+           role="alert">
-+     <vbox>
-+      <hbox id="UITourTooltipBody">
-+        <image id="UITourTooltipIcon"/>
-+        <vbox flex="1">
-+          <hbox id="UITourTooltipTitleContainer">
-+            <label id="UITourTooltipTitle" flex="1"/>
-+            <toolbarbutton id="UITourTooltipClose" class="close-icon"
-+                           tooltiptext="&uiTour.infoPanel.close;"/>
-+          </hbox>
-+          <description id="UITourTooltipDescription" flex="1"/>
-+        </vbox>
-+      </hbox>
-+      <hbox id="UITourTooltipButtons" flex="1" align="center"/>
-+     </vbox>
-+    </panel>
-+    <!-- type="default" forces frames to be created so that the panel's size can be determined -->
-+    <panel id="UITourHighlightContainer"
-+           type="default"
-+           hidden="true"
-+           noautofocus="true"
-+           noautohide="true"
-+           flip="none"
-+           consumeoutsideclicks="false"
-+           mousethrough="always">
-+      <box id="UITourHighlight"></box>
-+    </panel>
-+
-+    <panel id="sidebarMenu-popup"
-+           class="cui-widget-panel"
-+           role="group"
-+           type="arrow"
-+           hidden="true"
-+           flip="slide"
-+           orient="vertical"
-+           position="bottomcenter topleft">
-+      <toolbarbutton id="sidebar-switcher-bookmarks"
-+                     type="checkbox"
-+                     label="&bookmarksButton.label;"
-+                     class="subviewbutton subviewbutton-iconic"
-+                     key="viewBookmarksSidebarKb"
-+                     oncommand="SidebarUI.show('viewBookmarksSidebar');"/>
-+      <toolbarbutton id="sidebar-switcher-history"
-+                     type="checkbox"
-+                     label="&historyButton.label;"
-+                     class="subviewbutton subviewbutton-iconic"
-+                     key="key_gotoHistory"
-+                     oncommand="SidebarUI.show('viewHistorySidebar');"/>
-+      <toolbarbutton id="sidebar-switcher-tabs"
-+                     type="checkbox"
-+                     label="&syncedTabs.sidebar.label;"
-+                     class="subviewbutton subviewbutton-iconic sync-ui-item"
-+                     oncommand="SidebarUI.show('viewTabsSidebar');"/>
-+      <toolbarseparator/>
-+      <!-- Extension toolbarbuttons go here. -->
-+      <toolbarseparator id="sidebar-extensions-separator"/>
-+      <toolbarbutton id="sidebar-reverse-position"
-+                     class="subviewbutton"
-+                     oncommand="SidebarUI.reversePosition()"/>
-+      <toolbarseparator/>
-+      <toolbarbutton label="&sidebarMenuClose.label;"
-+                     class="subviewbutton"
-+                     oncommand="SidebarUI.hide()"/>
-+    </panel>
-+
-+    <menupopup id="toolbar-context-menu"
-+               onpopupshowing="onViewToolbarsPopupShowing(event, document.getElementById('viewToolbarsMenuSeparator')); ToolbarContextMenu.updateDownloadsAutoHide(this); ToolbarContextMenu.updateExtension(this)">
-+      <menuitem oncommand="ToolbarContextMenu.openAboutAddonsForContextAction(this.parentElement)"
-+                accesskey="&customizeMenu.manageExtension.accesskey;"
-+                label="&customizeMenu.manageExtension.label;"
-+                contexttype="toolbaritem"
-+                class="customize-context-manageExtension"/>
-+      <menuitem oncommand="ToolbarContextMenu.removeExtensionForContextAction(this.parentElement)"
-+                accesskey="&customizeMenu.removeExtension.accesskey;"
-+                label="&customizeMenu.removeExtension.label;"
-+                contexttype="toolbaritem"
-+                class="customize-context-removeExtension"/>
-+      <menuseparator/>
-+      <menuitem oncommand="gCustomizeMode.addToPanel(document.popupNode)"
-+                accesskey="&customizeMenu.pinToOverflowMenu.accesskey;"
-+                label="&customizeMenu.pinToOverflowMenu.label;"
-+                contexttype="toolbaritem"
-+                class="customize-context-moveToPanel"/>
-+      <menuitem id="toolbar-context-autohide-downloads-button"
-+                oncommand="ToolbarContextMenu.onDownloadsAutoHideChange(event);"
-+                type="checkbox"
-+                accesskey="&customizeMenu.autoHideDownloadsButton.accesskey;"
-+                label="&customizeMenu.autoHideDownloadsButton.label;"
-+                contexttype="toolbaritem"/>
-+      <menuitem oncommand="gCustomizeMode.removeFromArea(document.popupNode)"
-+                accesskey="&customizeMenu.removeFromToolbar.accesskey;"
-+                label="&customizeMenu.removeFromToolbar.label;"
-+                contexttype="toolbaritem"
-+                class="customize-context-removeFromToolbar"/>
-+      <menuitem id="toolbar-context-reloadSelectedTab"
-+                contexttype="tabbar"
-+                oncommand="gBrowser.reloadMultiSelectedTabs();"
-+                label="&toolbarContextMenu.reloadSelectedTab.label;"
-+                accesskey="&toolbarContextMenu.reloadSelectedTab.accesskey;"/>
-+      <menuitem id="toolbar-context-reloadSelectedTabs"
-+                contexttype="tabbar"
-+                oncommand="gBrowser.reloadMultiSelectedTabs();"
-+                label="&toolbarContextMenu.reloadSelectedTabs.label;"
-+                accesskey="&toolbarContextMenu.reloadSelectedTabs.accesskey;"/>
-+      <menuitem id="toolbar-context-bookmarkSelectedTab"
-+                contexttype="tabbar"
-+                oncommand="PlacesCommandHook.bookmarkPages(PlacesCommandHook.uniqueSelectedPages);"
-+                label="&toolbarContextMenu.bookmarkSelectedTab.label;"
-+                accesskey="&toolbarContextMenu.bookmarkSelectedTab.accesskey;"/>
-+      <menuitem id="toolbar-context-bookmarkSelectedTabs"
-+                contexttype="tabbar"
-+                oncommand="PlacesCommandHook.bookmarkPages(PlacesCommandHook.uniqueSelectedPages);"
-+                label="&toolbarContextMenu.bookmarkSelectedTabs.label;"
-+                accesskey="&toolbarContextMenu.bookmarkSelectedTabs.accesskey;"/>
-+      <menuitem id="toolbar-context-selectAllTabs"
-+                contexttype="tabbar"
-+                oncommand="gBrowser.selectAllTabs();"
-+                label="&toolbarContextMenu.selectAllTabs.label;"
-+                accesskey="&toolbarContextMenu.selectAllTabs.accesskey;"/>
-+      <menuitem id="toolbar-context-undoCloseTab"
-+                contexttype="tabbar"
-+                label="&toolbarContextMenu.undoCloseTab.label;"
-+                accesskey="&toolbarContextMenu.undoCloseTab.accesskey;"
-+                observes="History:UndoCloseTab"/>
-+      <menuseparator/>
-+      <menuseparator id="viewToolbarsMenuSeparator"/>
-+      <!-- XXXgijs: we're using oncommand handler here to avoid the event being
-+                    redirected to the command element, thus preventing
-+                    listeners on the menupopup or further up the tree from
-+                    seeing the command event pass by. The observes attribute is
-+                    here so that the menuitem is still disabled and re-enabled
-+                    correctly. -->
-+      <menuitem oncommand="gCustomizeMode.enter()"
-+                observes="cmd_CustomizeToolbars"
-+                class="viewCustomizeToolbar"
-+                label="&viewCustomizeToolbar.label;"
-+                accesskey="&viewCustomizeToolbar.accesskey;"/>
-+    </menupopup>
-+
-+    <menupopup id="blockedPopupOptions"
-+               onpopupshowing="gPopupBlockerObserver.fillPopupList(event);"
-+               onpopuphiding="gPopupBlockerObserver.onPopupHiding(event);">
-+      <menuitem id="blockedPopupAllowSite"
-+                accesskey="&allowPopups.accesskey;"
-+                oncommand="gPopupBlockerObserver.toggleAllowPopupsForSite(event);"/>
-+      <menuitem
-+#ifdef XP_WIN
-+                label="&editPopupSettings.label;"
-+#else
-+                label="&editPopupSettingsUnix.label;"
-+#endif
-+                accesskey="&editPopupSettings.accesskey;"
-+                oncommand="gPopupBlockerObserver.editPopupSettings();"/>
-+      <menuitem id="blockedPopupDontShowMessage"
-+                accesskey="&dontShowMessage.accesskey;"
-+                type="checkbox"
-+                oncommand="gPopupBlockerObserver.dontShowMessage();"/>
-+      <menuseparator id="blockedPopupsSeparator"/>
-+    </menupopup>
-+
-+    <menupopup id="autohide-context"
-+           onpopupshowing="FullScreen.getAutohide(this.firstChild);">
-+      <menuitem type="checkbox" label="&fullScreenAutohide.label;"
-+                accesskey="&fullScreenAutohide.accesskey;"
-+                oncommand="FullScreen.setAutohide();"/>
-+      <menuseparator/>
-+      <menuitem label="&fullScreenExit.label;"
-+                accesskey="&fullScreenExit.accesskey;"
-+                oncommand="BrowserFullScreen();"/>
-+    </menupopup>
-+
-+    <menupopup id="contentAreaContextMenu" pagemenu="#page-menu-separator"
-+               onpopupshowing="if (event.target != this)
-+                                 return true;
-+                               gContextMenu = new nsContextMenu(this, event.shiftKey);
-+                               if (gContextMenu.shouldDisplay)
-+                                 updateEditUIVisibility();
-+                               return gContextMenu.shouldDisplay;"
-+               onpopuphiding="if (event.target != this)
-+                                return;
-+                              gContextMenu.hiding();
-+                              gContextMenu = null;
-+                              updateEditUIVisibility();">
-+#include browser-context.inc
-+    </menupopup>
-+
-+#include ../../components/places/content/placesContextMenu.inc.xul
-+
-+    <panel id="ctrlTab-panel" hidden="true" norestorefocus="true" level="top">
-+      <hbox id="ctrlTab-previews"/>
-+      <hbox id="ctrlTab-showAll-container" pack="center"/>
-+    </panel>
-+
-+    <panel id="pageActionPanel"
-+           class="cui-widget-panel"
-+           role="group"
-+           type="arrow"
-+           hidden="true"
-+           flip="slide"
-+           photon="true"
-+           position="bottomcenter topright"
-+           tabspecific="true"
-+           noautofocus="true"
-+           copyURL-title="&pageAction.copyLink.label;"
-+           emailLink-title="&emailPageCmd.label;"
-+           sendToDevice-notReadyTitle="&sendToDevice.syncNotReady.label;"
-+           shareURL-title="&pageAction.shareUrl.label;"
-+           shareMore-label="&pageAction.shareMore.label;">
-+      <panelmultiview id="pageActionPanelMultiView"
-+                      mainViewId="pageActionPanelMainView"
-+                      viewCacheId="appMenu-viewCache">
-+        <panelview id="pageActionPanelMainView"
-+                   context="pageActionContextMenu"
-+                   class="PanelUI-subView">
-+          <vbox class="panel-subview-body"/>
-+        </panelview>
-+      </panelmultiview>
-+    </panel>
-+
-+    <panel id="confirmation-hint"
-+           role="alert"
-+           type="arrow"
-+           hidden="true"
-+           flip="slide"
-+           position="bottomcenter topright"
-+           tabspecific="true"
-+           noautofocus="true">
-+      <hbox id="confirmation-hint-checkmark-animation-container">
-+        <image id="confirmation-hint-checkmark-image"/>
-+      </hbox>
-+      <label id="confirmation-hint-message"/>
-+    </panel>
-+
-+    <menupopup id="pageActionContextMenu"
-+               onpopupshowing="BrowserPageActions.onContextMenuShowing(event, this);">
-+      <menuitem class="pageActionContextMenuItem builtInUnpinned"
-+                label="&pageAction.addToUrlbar.label;"
-+                oncommand="BrowserPageActions.togglePinningForContextAction();"/>
-+      <menuitem class="pageActionContextMenuItem builtInPinned"
-+                label="&pageAction.removeFromUrlbar.label;"
-+                oncommand="BrowserPageActions.togglePinningForContextAction();"/>
-+      <menuitem class="pageActionContextMenuItem extensionUnpinned"
-+                label="&pageAction.addToUrlbar.label;"
-+                oncommand="BrowserPageActions.togglePinningForContextAction();"/>
-+      <menuitem class="pageActionContextMenuItem extensionPinned"
-+                label="&pageAction.removeFromUrlbar.label;"
-+                oncommand="BrowserPageActions.togglePinningForContextAction();"/>
-+      <menuseparator class="pageActionContextMenuItem extensionPinned extensionUnpinned"/>
-+      <menuitem class="pageActionContextMenuItem extensionPinned extensionUnpinned"
-+                label="&pageAction.manageExtension.label;"
-+                oncommand="BrowserPageActions.openAboutAddonsForContextAction();"/>
-+    </menupopup>
-+
-+#include ../../components/places/content/bookmarksHistoryTooltip.inc.xul
-+
-+    <tooltip id="tabbrowser-tab-tooltip" onpopupshowing="gBrowser.createTooltip(event);"/>
-+
-+    <tooltip id="back-button-tooltip">
-+      <description class="tooltip-label" value="&backButton.tooltip;"/>
-+#ifdef XP_MACOSX
-+      <description class="tooltip-label" value="&backForwardButtonMenuMac.tooltip;"/>
-+#else
-+      <description class="tooltip-label" value="&backForwardButtonMenu.tooltip;"/>
-+#endif
-+    </tooltip>
-+
-+    <tooltip id="forward-button-tooltip">
-+      <description class="tooltip-label" value="&forwardButton.tooltip;"/>
-+#ifdef XP_MACOSX
-+      <description class="tooltip-label" value="&backForwardButtonMenuMac.tooltip;"/>
-+#else
-+      <description class="tooltip-label" value="&backForwardButtonMenu.tooltip;"/>
-+#endif
-+    </tooltip>
-+
-+#include popup-notifications.inc
-+
-+#include ../../components/customizableui/content/panelUI.inc.xul
-+#include ../../components/controlcenter/content/panel.inc.xul
-+#include ../../components/downloads/content/downloadsPanel.inc.xul
-+#include browser-allTabsMenu.inc.xul
-+
-+    <hbox id="downloads-animation-container" mousethrough="always">
-+      <vbox id="downloads-notification-anchor" hidden="true">
-+        <vbox id="downloads-indicator-notification"/>
-+      </vbox>
-+    </hbox>
-+
-+    <tooltip id="dynamic-shortcut-tooltip"
-+             onpopupshowing="UpdateDynamicShortcutTooltipText(this);"/>
-+
-+    <menupopup id="SyncedTabsSidebarContext">
-+      <menuitem label="&syncedTabs.context.open.label;"
-+                accesskey="&syncedTabs.context.open.accesskey;"
-+                id="syncedTabsOpenSelected" where="current"/>
-+      <menuitem label="&syncedTabs.context.openInNewTab.label;"
-+                accesskey="&syncedTabs.context.openInNewTab.accesskey;"
-+                id="syncedTabsOpenSelectedInTab" where="tab"/>
-+      <menuitem label="&syncedTabs.context.openInNewWindow.label;"
-+                accesskey="&syncedTabs.context.openInNewWindow.accesskey;"
-+                id="syncedTabsOpenSelectedInWindow" where="window"/>
-+      <menuitem label="&syncedTabs.context.openInNewPrivateWindow.label;"
-+                accesskey="&syncedTabs.context.openInNewPrivateWindow.accesskey;"
-+                id="syncedTabsOpenSelectedInPrivateWindow" where="window" private="true"/>
-+      <menuseparator/>
-+      <menuitem label="&syncedTabs.context.bookmarkSingleTab.label;"
-+                accesskey="&syncedTabs.context.bookmarkSingleTab.accesskey;"
-+                id="syncedTabsBookmarkSelected"/>
-+      <menuitem label="&syncedTabs.context.copy.label;"
-+                accesskey="&syncedTabs.context.copy.accesskey;"
-+                id="syncedTabsCopySelected"/>
-+      <menuseparator/>
-+      <menuitem label="&syncedTabs.context.openAllInTabs.label;"
-+                accesskey="&syncedTabs.context.openAllInTabs.accesskey;"
-+                id="syncedTabsOpenAllInTabs"/>
-+      <menuitem label="&syncedTabs.context.managedevices.label;"
-+                accesskey="&syncedTabs.context.managedevices.accesskey;"
-+                id="syncedTabsManageDevices"
-+                oncommand="gSync.openDevicesManagementPage('syncedtabs-sidebar');"/>
-+      <menuitem label="&syncSyncNowItem.label;"
-+                accesskey="&syncSyncNowItem.accesskey;"
-+                id="syncedTabsRefresh"/>
-+    </menupopup>
-+    <menupopup id="SyncedTabsSidebarTabsFilterContext"
-+               class="textbox-contextmenu">
-+      <menuitem label="&undoCmd.label;"
-+                accesskey="&undoCmd.accesskey;"
-+                cmd="cmd_undo"/>
-+      <menuseparator/>
-+      <menuitem label="&cutCmd.label;"
-+                accesskey="&cutCmd.accesskey;"
-+                cmd="cmd_cut"/>
-+      <menuitem label="&copyCmd.label;"
-+                accesskey="&copyCmd.accesskey;"
-+                cmd="cmd_copy"/>
-+      <menuitem label="&pasteCmd.label;"
-+                accesskey="&pasteCmd.accesskey;"
-+                cmd="cmd_paste"/>
-+      <menuitem label="&deleteCmd.label;"
-+                accesskey="&deleteCmd.accesskey;"
-+                cmd="cmd_delete"/>
-+      <menuseparator/>
-+      <menuitem label="&selectAllCmd.label;"
-+                accesskey="&selectAllCmd.accesskey;"
-+                cmd="cmd_selectAll"/>
-+      <menuseparator/>
-+      <menuitem label="&syncSyncNowItem.label;"
-+                accesskey="&syncSyncNowItem.accesskey;"
-+                id="syncedTabsRefreshFilter"/>
-+    </menupopup>
-+
-+    <hbox id="statuspanel" inactive="true" layer="true">
-+      <hbox id="statuspanel-inner">
-+        <label id="statuspanel-label"
-+               role="status"
-+               aria-live="off"
-+               flex="1"
-+               crop="end"/>
-+      </hbox>
-+    </hbox>
-+  </popupset>
-+  <box id="appMenu-viewCache" hidden="true"/>
-+
-+  <toolbox id="navigator-toolbox">
-+
-+    <vbox id="titlebar">
-+      <!-- Menu -->
-+      <toolbar type="menubar" id="toolbar-menubar"
-+               class="browser-toolbar chromeclass-menubar titlebar-color"
-+               customizable="true"
-+               mode="icons"
-+#ifdef MENUBAR_CAN_AUTOHIDE
-+               toolbarname="&menubarCmd.label;"
-+               accesskey="&menubarCmd.accesskey;"
-+               autohide="true"
-+#endif
-+               context="toolbar-context-menu">
-+        <toolbaritem id="menubar-items" align="center">
-+# The entire main menubar is placed into browser-menubar.inc, so that it can be
-+# shared with other top level windows in macWindow.inc.xul.
-+#include browser-menubar.inc
-+        </toolbaritem>
-+        <spacer flex="1" skipintoolbarset="true" ordinal="1000"/>
-+#include titlebar-items.inc.xul
-+      </toolbar>
-+
-+      <toolbar id="TabsToolbar"
-+               class="browser-toolbar titlebar-color"
-+               fullscreentoolbar="true"
-+               customizable="true"
-+               customizationtarget="TabsToolbar-customization-target"
-+               mode="icons"
-+               aria-label="&tabsToolbar.label;"
-+               context="toolbar-context-menu"
-+               flex="1">
-+        <vbox flex="1" class="toolbar-items">
-+          <spacer flex="1000"/>
-+
-+          <hbox id="TabsToolbar-customization-target" flex="1">
-+            <hbox class="titlebar-spacer" type="pre-tabs"
-+                  skipintoolbarset="true"/>
-+
-+            <tabs id="tabbrowser-tabs"
-+                  flex="1"
-+                  setfocus="false"
-+                  tooltip="tabbrowser-tab-tooltip"
-+                  stopwatchid="FX_TAB_CLICK_MS">
-+              <tab class="tabbrowser-tab" selected="true" visuallyselected="true" fadein="true"/>
-+            </tabs>
-+
-+            <toolbarbutton id="new-tab-button"
-+                           class="toolbarbutton-1 chromeclass-toolbar-additional"
-+                           label="&tabCmd.label;"
-+                           command="cmd_newNavigatorTab"
-+                           onclick="checkForMiddleClick(this, event);"
-+                           tooltip="dynamic-shortcut-tooltip"
-+                           ondrop="newTabButtonObserver.onDrop(event)"
-+                           ondragover="newTabButtonObserver.onDragOver(event)"
-+                           ondragenter="newTabButtonObserver.onDragOver(event)"
-+                           ondragexit="newTabButtonObserver.onDragExit(event)"
-+                           cui-areatype="toolbar"
-+                           removable="true"/>
-+
-+            <toolbarbutton id="alltabs-button"
-+                           class="toolbarbutton-1 chromeclass-toolbar-additional tabs-alltabs-button badged-button"
-+                           oncommand="gTabsPanel.showAllTabsPanel();"
-+                           label="&listAllTabs.label;"
-+                           tooltiptext="&listAllTabs.label;"
-+                           removable="false"/>
-+
-+            <hbox class="titlebar-spacer" type="post-tabs"
-+                  ordinal="1000"
-+                  skipintoolbarset="true"/>
-+          </hbox>
-+        </vbox>
-+
-+#ifndef XP_MACOSX
-+        <button class="accessibility-indicator" tooltiptext="&accessibilityIndicator.tooltip;"
-+                ordinal="1000"
-+                aria-live="polite" skipintoolbarset="true"/>
-+        <hbox class="private-browsing-indicator" skipintoolbarset="true"
-+              ordinal="1000"/>
-+#endif
-+
-+#include titlebar-items.inc.xul
-+
-+#ifdef XP_MACOSX
-+        <!-- OS X does not natively support RTL for its titlebar items, so we prevent this secondary
-+             buttonbox from reversing order in RTL by forcing an LTR direction. -->
-+        <hbox id="titlebar-secondary-buttonbox" dir="ltr">
-+          <button class="accessibility-indicator" tooltiptext="&accessibilityIndicator.tooltip;" aria-live="polite"/>
-+          <hbox class="private-browsing-indicator"/>
-+          <hbox id="titlebar-fullscreen-button"/>
-+        </hbox>
-+#endif
-+      </toolbar>
-+
-+    </vbox>
-+
-+    <toolbar id="nav-bar"
-+             class="browser-toolbar"
-+             aria-label="&navbarCmd.label;"
-+             fullscreentoolbar="true" mode="icons" customizable="true"
-+             customizationtarget="nav-bar-customization-target"
-+             overflowable="true"
-+             overflowbutton="nav-bar-overflow-button"
-+             overflowtarget="widget-overflow-list"
-+             overflowpanel="widget-overflow"
-+             context="toolbar-context-menu">
-+
-+      <hbox id="nav-bar-customization-target" flex="1">
-+        <toolbarbutton id="back-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
-+                       label="&backCmd.label;"
-+                       removable="false" overflows="false"
-+                       keepbroadcastattributeswhencustomizing="true"
-+                       command="Browser:BackOrBackDuplicate"
-+                       onclick="checkForMiddleClick(this, event);"
-+                       tooltip="back-button-tooltip"
-+                       context="backForwardMenu"/>
-+        <toolbarbutton id="forward-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
-+                       label="&forwardCmd.label;"
-+                       removable="false" overflows="false"
-+                       keepbroadcastattributeswhencustomizing="true"
-+                       command="Browser:ForwardOrForwardDuplicate"
-+                       onclick="checkForMiddleClick(this, event);"
-+                       tooltip="forward-button-tooltip"
-+                       context="backForwardMenu"/>
-+        <toolbaritem id="stop-reload-button" class="chromeclass-toolbar-additional"
-+                     title="&reloadCmd.label;"
-+                     removable="true" overflows="false">
-+          <toolbarbutton id="reload-button" class="toolbarbutton-1"
-+                         label="&reloadCmd.label;"
-+                         command="Browser:ReloadOrDuplicate"
-+                         onclick="checkForMiddleClick(this, event);"
-+                         tooltip="dynamic-shortcut-tooltip">
-+            <box class="toolbarbutton-animatable-box">
-+              <image class="toolbarbutton-animatable-image"/>
-+            </box>
-+          </toolbarbutton>
-+          <toolbarbutton id="stop-button" class="toolbarbutton-1"
-+                         label="&stopCmd.label;"
-+                         command="Browser:Stop"
-+                         tooltip="dynamic-shortcut-tooltip">
-+            <box class="toolbarbutton-animatable-box">
-+              <image class="toolbarbutton-animatable-image"/>
-+            </box>
-+          </toolbarbutton>
-+        </toolbaritem>
-+        <toolbarbutton id="home-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
-+                       removable="true"
-+                       label="&homeButton.label;"
-+                       ondragover="homeButtonObserver.onDragOver(event)"
-+                       ondragenter="homeButtonObserver.onDragOver(event)"
-+                       ondrop="homeButtonObserver.onDrop(event)"
-+                       ondragexit="homeButtonObserver.onDragExit(event)"
-+                       key="goHome"
-+                       onclick="BrowserHome(event);"
-+                       cui-areatype="toolbar"
-+                       tooltiptext="&homeButton.defaultPage.tooltip;"/>
-+        <toolbarspring cui-areatype="toolbar" class="chromeclass-toolbar-additional"/>
-+        <toolbaritem id="urlbar-container" flex="400" persist="width"
-+                     removable="false"
-+                     class="chromeclass-location" overflows="false">
-+            <textbox id="urlbar" flex="1"
-+                     placeholder="&urlbar.placeholder2;"
-+                     defaultPlaceholder="&urlbar.placeholder2;"
-+                     focused="true"
-+                     type="autocomplete"
-+                     autocompletesearch="unifiedcomplete"
-+                     autocompletesearchparam="enable-actions"
-+                     autocompletepopup="PopupAutoCompleteRichResult"
-+                     completeselectedindex="true"
-+                     tabscrolling="true"
-+                     newlines="stripsurroundingwhitespace"
-+                     ontextentered="this.handleCommand(param);"
-+                     ontextreverted="return this.handleRevert();"
-+                     pageproxystate="invalid">
-+              <!-- Use onclick instead of normal popup= syntax since the popup
-+                   code fires onmousedown, and hence eats our favicon drag events. -->
-+              <box id="identity-box" role="button"
-+                   align="center"
-+                   aria-label="&urlbar.viewSiteInfo.label;"
-+                   onclick="gIdentityHandler.handleIdentityButtonEvent(event);"
-+                   onkeypress="gIdentityHandler.handleIdentityButtonEvent(event);"
-+                   ondragstart="gIdentityHandler.onDragStart(event);">
-+                <image id="identity-icon"
-+                       consumeanchor="identity-box"
-+                       onclick="PageProxyClickHandler(event);"/>
-+                <image id="sharing-icon" mousethrough="always"/>
-+                <box id="tracking-protection-icon-box" animationsenabled="true">
-+                  <image id="tracking-protection-icon"/>
-+                  <box id="tracking-protection-icon-animatable-box" flex="1">
-+                    <image id="tracking-protection-icon-animatable-image" flex="1"/>
-+                  </box>
-+                </box>
-+                <box id="blocked-permissions-container" align="center">
-+                  <image data-permission-id="geo" class="blocked-permission-icon geo-icon" role="button"
-+                         tooltiptext="&urlbar.geolocationBlocked.tooltip;"/>
-+                  <image data-permission-id="desktop-notification" class="blocked-permission-icon desktop-notification-icon" role="button"
-+                         tooltiptext="&urlbar.webNotificationsBlocked.tooltip;"/>
-+                  <image data-permission-id="camera" class="blocked-permission-icon camera-icon" role="button"
-+                         tooltiptext="&urlbar.cameraBlocked.tooltip;"/>
-+                  <image data-permission-id="microphone" class="blocked-permission-icon microphone-icon" role="button"
-+                         tooltiptext="&urlbar.microphoneBlocked.tooltip;"/>
-+                  <image data-permission-id="screen" class="blocked-permission-icon screen-icon" role="button"
-+                         tooltiptext="&urlbar.screenBlocked.tooltip;"/>
-+                  <image data-permission-id="persistent-storage" class="blocked-permission-icon persistent-storage-icon" role="button"
-+                         tooltiptext="&urlbar.persistentStorageBlocked.tooltip;"/>
-+                  <image data-permission-id="popup" class="blocked-permission-icon popup-icon" role="button"
-+                         tooltiptext="&urlbar.popupBlocked.tooltip;"/>
-+                  <image data-permission-id="autoplay-media" class="blocked-permission-icon autoplay-media-icon" role="button"
-+                         tooltiptext="&urlbar.autoplayMediaBlocked.tooltip;"/>
-+                  <image data-permission-id="canvas" class="blocked-permission-icon canvas-icon" role="button"
-+                         tooltiptext="&urlbar.canvasBlocked.tooltip;"/>
-+                  <image data-permission-id="plugin:flash" class="blocked-permission-icon plugin-icon" role="button"
-+                         tooltiptext="&urlbar.flashPluginBlocked.tooltip;"/>
-+                  <image data-permission-id="midi" class="blocked-permission-icon midi-icon" role="button"
-+                         tooltiptext="&urlbar.midiBlocked.tooltip;"/>
-+                </box>
-+                <box id="notification-popup-box"
-+                     hidden="true"
-+                     onmouseover="document.getElementById('identity-box').classList.add('no-hover');"
-+                     onmouseout="document.getElementById('identity-box').classList.remove('no-hover');"
-+                     align="center">
-+                  <image id="default-notification-icon" class="notification-anchor-icon" role="button"
-+                         tooltiptext="&urlbar.defaultNotificationAnchor.tooltip;"/>
-+                  <image id="geo-notification-icon" class="notification-anchor-icon geo-icon" role="button"
-+                         tooltiptext="&urlbar.geolocationNotificationAnchor.tooltip;"/>
-+                  <image id="autoplay-media-notification-icon" class="notification-anchor-icon autoplay-media-icon" role="button"
-+                         tooltiptext="&urlbar.autoplayNotificationAnchor.tooltip;"/>
-+                  <image id="addons-notification-icon" class="notification-anchor-icon install-icon" role="button"
-+                         tooltiptext="&urlbar.addonsNotificationAnchor.tooltip;"/>
-+                  <image id="canvas-notification-icon" class="notification-anchor-icon" role="button"
-+                         tooltiptext="&urlbar.canvasNotificationAnchor.tooltip;"/>
-+                  <image id="indexedDB-notification-icon" class="notification-anchor-icon indexedDB-icon" role="button"
-+                         tooltiptext="&urlbar.indexedDBNotificationAnchor.tooltip;"/>
-+                  <image id="password-notification-icon" class="notification-anchor-icon login-icon" role="button"
-+                         tooltiptext="&urlbar.passwordNotificationAnchor.tooltip;"/>
-+                  <stack id="plugins-notification-icon" class="notification-anchor-icon" role="button" align="center"
-+                         tooltiptext="&urlbar.pluginsNotificationAnchor.tooltip;">
-+                    <image class="plugin-icon" />
-+                    <image id="plugin-icon-badge" />
-+                  </stack>
-+                  <image id="web-notifications-notification-icon" class="notification-anchor-icon desktop-notification-icon" role="button"
-+                         tooltiptext="&urlbar.webNotificationAnchor.tooltip;"/>
-+                  <image id="webRTC-shareDevices-notification-icon" class="notification-anchor-icon camera-icon" role="button"
-+                         tooltiptext="&urlbar.webRTCShareDevicesNotificationAnchor.tooltip;"/>
-+                  <image id="webRTC-shareMicrophone-notification-icon" class="notification-anchor-icon microphone-icon" role="button"
-+                         tooltiptext="&urlbar.webRTCShareMicrophoneNotificationAnchor.tooltip;"/>
-+                  <image id="webRTC-shareScreen-notification-icon" class="notification-anchor-icon screen-icon" role="button"
-+                         tooltiptext="&urlbar.webRTCShareScreenNotificationAnchor.tooltip;"/>
-+                  <image id="servicesInstall-notification-icon" class="notification-anchor-icon service-icon" role="button"
-+                         tooltiptext="&urlbar.servicesNotificationAnchor.tooltip;"/>
-+                  <image id="translate-notification-icon" class="notification-anchor-icon translation-icon" role="button"
-+                         tooltiptext="&urlbar.translateNotificationAnchor.tooltip;"/>
-+                  <image id="translated-notification-icon" class="notification-anchor-icon translation-icon in-use" role="button"
-+                         tooltiptext="&urlbar.translatedNotificationAnchor.tooltip;"/>
-+                  <image id="eme-notification-icon" class="notification-anchor-icon drm-icon" role="button"
-+                         tooltiptext="&urlbar.emeNotificationAnchor.tooltip;"/>
-+                  <image id="persistent-storage-notification-icon" class="notification-anchor-icon persistent-storage-icon" role="button"
-+                         tooltiptext="&urlbar.persistentStorageNotificationAnchor.tooltip;"/>
-+                  <image id="midi-notification-icon" class="notification-anchor-icon midi-icon" role="button"
-+                         tooltiptext="&urlbar.midiNotificationAnchor.tooltip;"/>
-+                  <image id="webauthn-notification-icon" class="notification-anchor-icon" role="button"
-+                         tooltiptext="&urlbar.webAuthnAnchor.tooltip;"/>
-+                  <image id="storage-access-notification-icon" class="notification-anchor-icon storage-access-icon" role="button"
-+                         tooltiptext="&urlbar.storageAccessAnchor.tooltip;"/>
-+                </box>
-+                <image id="connection-icon"/>
-+                <image id="extension-icon"/>
-+                <image id="remote-control-icon"
-+                       tooltiptext="&urlbar.remoteControlNotificationAnchor.tooltip;"/>
-+                <hbox id="identity-icon-labels">
-+                  <label id="identity-icon-label" class="plain" flex="1"/>
-+                  <label id="identity-icon-country-label" class="plain"/>
-+                </hbox>
-+              </box>
-+              <box id="urlbar-display-box" align="center">
-+                <label id="switchtab" class="urlbar-display urlbar-display-switchtab" value="&urlbar.switchToTab.label;"/>
-+                <label id="extension" class="urlbar-display urlbar-display-extension" value="&urlbar.extension.label;"/>
-+              </box>
-+              <hbox id="page-action-buttons" context="pageActionContextMenu">
-+                <hbox id="contextual-feature-recommendation" role="button" hidden="true">
-+                  <hbox id="cfr-label-container">
-+                    <label id="cfr-label"/>
-+                  </hbox>
-+                  <image id="cfr-button"
-+                         class="urlbar-icon urlbar-page-action"
-+                         role="presentation"/>
-+                </hbox>
-+                <hbox id="userContext-icons" hidden="true">
-+                  <label id="userContext-label"/>
-+                  <image id="userContext-indicator"/>
-+                </hbox>
-+                <image id="reader-mode-button"
-+                       class="urlbar-icon urlbar-page-action"
-+                       tooltip="dynamic-shortcut-tooltip"
-+                       role="button"
-+                       hidden="true"
-+                       onclick="ReaderParent.buttonClick(event);"/>
-+                <toolbarbutton id="urlbar-zoom-button"
-+                       onclick="FullZoom.reset();"
-+                       tooltip="dynamic-shortcut-tooltip"
-+                       hidden="true"/>
-+                <box id="pageActionSeparator" class="urlbar-page-action"/>
-+                <image id="pageActionButton"
-+                       class="urlbar-icon urlbar-page-action"
-+                       role="button"
-+                       tooltiptext="&pageActionButton.tooltip;"
-+                       onmousedown="BrowserPageActions.mainButtonClicked(event);"/>
-+                <hbox id="star-button-box"
-+                      hidden="true"
-+                      class="urlbar-icon-wrapper urlbar-page-action"
-+                      onclick="BrowserPageActions.doCommandForAction(PageActions.actionForID('bookmark'), event, this);">
-+                  <image id="star-button"
-+                         class="urlbar-icon"
-+                         role="button"/>
-+                  <hbox id="star-button-animatable-box">
-+                    <image id="star-button-animatable-image"
-+                           role="presentation"/>
-+                  </hbox>
-+                </hbox>
-+              </hbox>
-+            </textbox>
-+        </toolbaritem>
-+
-+        <toolbarspring cui-areatype="toolbar" class="chromeclass-toolbar-additional"/>
-+
-+        <!-- This is a placeholder for the Downloads Indicator.  It is visible
-+             during the customization of the toolbar, in the palette, and before
-+             the Downloads Indicator overlay is loaded. -->
-+        <toolbarbutton id="downloads-button"
-+                       class="toolbarbutton-1 chromeclass-toolbar-additional badged-button"
-+                       key="key_openDownloads"
-+                       onmousedown="DownloadsIndicatorView.onCommand(event);"
-+                       ondrop="DownloadsIndicatorView.onDrop(event);"
-+                       ondragover="DownloadsIndicatorView.onDragOver(event);"
-+                       ondragenter="DownloadsIndicatorView.onDragOver(event);"
-+                       label="&downloads.label;"
-+                       removable="true"
-+                       overflows="false"
-+                       cui-areatype="toolbar"
-+                       hidden="true"
-+                       tooltip="dynamic-shortcut-tooltip"
-+                       indicator="true">
-+            <!-- The panel's anchor area is smaller than the outer button, but must
-+                 always be visible and must not move or resize when the indicator
-+                 state changes, otherwise the panel could change its position or lose
-+                 its arrow unexpectedly. -->
-+            <stack id="downloads-indicator-anchor"
-+                   consumeanchor="downloads-button">
-+              <box id="downloads-indicator-icon"/>
-+              <stack id="downloads-indicator-progress-outer">
-+                <box id="downloads-indicator-progress-inner"/>
-+              </stack>
-+            </stack>
-+          </toolbarbutton>
-+
-+        <toolbarbutton id="library-button" class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
-+                       removable="true"
-+                       onmousedown="PanelUI.showSubView('appMenu-libraryView', this, event);"
-+                       closemenu="none"
-+                       cui-areatype="toolbar"
-+                       tooltiptext="&libraryButton.tooltip;"
-+                       label="&places.library.title;"/>
-+
-+      </hbox>
-+
-+      <toolbarbutton id="nav-bar-overflow-button"
-+                     class="toolbarbutton-1 chromeclass-toolbar-additional overflow-button"
-+                     skipintoolbarset="true"
-+                     tooltiptext="&navbarOverflow.label;">
-+        <box class="toolbarbutton-animatable-box">
-+          <image class="toolbarbutton-animatable-image"/>
-+        </box>
-+      </toolbarbutton>
-+
-+      <toolbaritem id="PanelUI-button"
-+                   removable="false">
-+        <toolbarbutton id="PanelUI-menu-button"
-+                       class="toolbarbutton-1 badged-button"
-+                       consumeanchor="PanelUI-button"
-+                       label="&brandShortName;"
-+                       tooltiptext="&appmenu.tooltip;"/>
-+      </toolbaritem>
-+
-+      <hbox id="window-controls" hidden="true" pack="end" skipintoolbarset="true"
-+            ordinal="1000">
-+        <toolbarbutton id="minimize-button"
-+                       tooltiptext="&fullScreenMinimize.tooltip;"
-+                       oncommand="window.minimize();"/>
-+
-+        <toolbarbutton id="restore-button"
-+#ifdef XP_MACOSX
-+# Prior to 10.7 there wasn't a native fullscreen button so we use #restore-button
-+# to exit fullscreen and want it to behave like other toolbar buttons.
-+                       class="toolbarbutton-1"
-+#endif
-+                       tooltiptext="&fullScreenRestore.tooltip;"
-+                       oncommand="BrowserFullScreen();"/>
-+
-+        <toolbarbutton id="close-button"
-+                       tooltiptext="&fullScreenClose.tooltip;"
-+                       oncommand="BrowserTryToCloseWindow();"/>
-+      </hbox>
-+
-+      <box id="library-animatable-box" class="toolbarbutton-animatable-box">
-+        <image class="toolbarbutton-animatable-image"/>
-+      </box>
-+    </toolbar>
-+
-+    <toolbar id="PersonalToolbar"
-+             mode="icons"
-+             class="browser-toolbar chromeclass-directories"
-+             context="toolbar-context-menu"
-+             toolbarname="&personalbarCmd.label;" accesskey="&personalbarCmd.accesskey;"
-+             collapsed="true"
-+             customizable="true">
-+      <toolbaritem id="personal-bookmarks"
-+                   title="&bookmarksToolbarItem.label;"
-+                   cui-areatype="toolbar"
-+                   removable="true">
-+        <toolbarbutton id="bookmarks-toolbar-placeholder"
-+                       class="bookmark-item"
-+                       label="&bookmarksToolbarItem.label;"/>
-+        <toolbarbutton id="bookmarks-toolbar-button"
-+                       class="toolbarbutton-1"
-+                       flex="1"
-+                       label="&bookmarksToolbarItem.label;"
-+                       oncommand="PlacesToolbarHelper.onPlaceholderCommand();"/>
-+        <hbox flex="1"
-+              id="PlacesToolbar"
-+              context="placesContext"
-+              onmouseup="BookmarksEventHandler.onMouseUp(event);"
-+              onclick="BookmarksEventHandler.onClick(event, this._placesView);"
-+              oncommand="BookmarksEventHandler.onCommand(event);"
-+              tooltip="bhTooltip"
-+              popupsinherittooltip="true">
-+          <hbox flex="1">
-+            <hbox id="PlacesToolbarDropIndicatorHolder" align="center" collapsed="true">
-+              <image id="PlacesToolbarDropIndicator"
-+                     mousethrough="always"
-+                     collapsed="true"/>
-+            </hbox>
-+            <scrollbox orient="horizontal"
-+                       id="PlacesToolbarItems"
-+                       flex="1"/>
-+            <toolbarbutton type="menu"
-+                           id="PlacesChevron"
-+                           class="toolbarbutton-1"
-+                           mousethrough="never"
-+                           collapsed="true"
-+                           tooltiptext="&bookmarksToolbarChevron.tooltip;"
-+                           onpopupshowing="document.getElementById('PlacesToolbar')
-+                                                   ._placesView._onChevronPopupShowing(event);">
-+              <menupopup id="PlacesChevronPopup"
-+                         placespopup="true"
-+                         tooltip="bhTooltip" popupsinherittooltip="true"
-+                         context="placesContext"/>
-+            </toolbarbutton>
-+          </hbox>
-+        </hbox>
-+      </toolbaritem>
-+    </toolbar>
-+
-+    <toolbarpalette id="BrowserToolbarPalette">
-+
-+      <toolbarbutton id="print-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
-+#ifdef XP_MACOSX
-+                     command="cmd_print"
-+                     tooltip="dynamic-shortcut-tooltip"
-+#else
-+                     command="cmd_printPreview"
-+                     tooltiptext="&printButton.tooltip;"
-+#endif
-+                     label="&printButton.label;"/>
-+
-+
-+      <toolbarbutton id="new-window-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
-+                     label="&newNavigatorCmd.label;"
-+                     command="cmd_newNavigator"
-+                     tooltip="dynamic-shortcut-tooltip"
-+                     ondrop="newWindowButtonObserver.onDrop(event)"
-+                     ondragover="newWindowButtonObserver.onDragOver(event)"
-+                     ondragenter="newWindowButtonObserver.onDragOver(event)"
-+                     ondragexit="newWindowButtonObserver.onDragExit(event)"/>
-+
-+      <toolbarbutton id="fullscreen-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
-+                     observes="View:FullScreen"
-+                     type="checkbox"
-+                     label="&fullScreenCmd.label;"
-+                     tooltip="dynamic-shortcut-tooltip"/>
-+
-+      <toolbarbutton id="bookmarks-menu-button"
-+                     class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
-+                     type="menu"
-+                     label="&bookmarksMenuButton2.label;"
-+                     tooltip="dynamic-shortcut-tooltip"
-+                     anchor="dropmarker"
-+                     ondragenter="PlacesMenuDNDHandler.onDragEnter(event);"
-+                     ondragover="PlacesMenuDNDHandler.onDragOver(event);"
-+                     ondragleave="PlacesMenuDNDHandler.onDragLeave(event);"
-+                     ondrop="PlacesMenuDNDHandler.onDrop(event);"
-+                     oncommand="BookmarkingUI.onCommand(event);">
-+        <menupopup id="BMB_bookmarksPopup"
-+                   class="cui-widget-panel cui-widget-panelview cui-widget-panelWithFooter PanelUI-subView"
-+                   placespopup="true"
-+                   context="placesContext"
-+                   openInTabs="children"
-+                   side="top"
-+                   onmouseup="BookmarksEventHandler.onMouseUp(event);"
-+                   oncommand="BookmarksEventHandler.onCommand(event);"
-+                   onclick="BookmarksEventHandler.onClick(event, this.parentNode._placesView);"
-+                   onpopupshowing="BookmarkingUI.onPopupShowing(event);
-+                                   BookmarkingUI.attachPlacesView(event, this);"
-+                   tooltip="bhTooltip" popupsinherittooltip="true">
-+          <menuitem id="BMB_viewBookmarksSidebar"
-+                    class="menuitem-iconic subviewbutton"
-+                    label-show="&viewBookmarksSidebar2.label;"
-+                    label-hide="&hideBookmarksSidebar.label;"
-+                    oncommand="SidebarUI.toggle('viewBookmarksSidebar');"/>
-+          <!-- NB: temporary solution for bug 985024, this should go away soon. -->
-+          <menuitem id="BMB_bookmarksShowAllTop"
-+                    class="menuitem-iconic subviewbutton"
-+                    label="&showAllBookmarks2.label;"
-+                    command="Browser:ShowAllBookmarks"
-+                    key="manBookmarkKb"/>
-+          <menuseparator/>
-+          <menu id="BMB_bookmarksToolbar"
-+                class="menu-iconic bookmark-item subviewbutton"
-+                label="&personalbarCmd.label;"
-+                container="true">
-+            <menupopup id="BMB_bookmarksToolbarPopup"
-+                       placespopup="true"
-+                       context="placesContext"
-+                       onpopupshowing="if (!this.parentNode._placesView)
-+                                         new PlacesMenu(event, `place:parent=${PlacesUtils.bookmarks.toolbarGuid}`,
-+                                                        PlacesUIUtils.getViewForNode(this.parentNode.parentNode).options);">
-+              <menuitem id="BMB_viewBookmarksToolbar"
-+                        class="menuitem-iconic subviewbutton"
-+                        label-show="&viewBookmarksToolbar.label;"
-+                        label-hide="&hideBookmarksToolbar.label;"
-+                        oncommand="BookmarkingUI.toggleBookmarksToolbar();"/>
-+              <menuseparator/>
-+              <!-- Bookmarks toolbar items -->
-+            </menupopup>
-+          </menu>
-+          <menu id="BMB_unsortedBookmarks"
-+                class="menu-iconic bookmark-item subviewbutton"
-+                label="&bookmarksMenuButton.other.label;"
-+                container="true">
-+            <menupopup id="BMB_unsortedBookmarksPopup"
-+                       placespopup="true"
-+                       context="placesContext"
-+                       onpopupshowing="if (!this.parentNode._placesView)
-+                                         new PlacesMenu(event, `place:parent=${PlacesUtils.bookmarks.unfiledGuid}`,
-+                                                        PlacesUIUtils.getViewForNode(this.parentNode.parentNode).options);"/>
-+          </menu>
-+          <menu id="BMB_mobileBookmarks"
-+                class="menu-iconic bookmark-item subviewbutton"
-+                label="&bookmarksMenuButton.mobile.label;"
-+                hidden="true"
-+                container="true">
-+            <menupopup id="BMB_mobileBookmarksPopup"
-+                       placespopup="true"
-+                       context="placesContext"
-+                       onpopupshowing="if (!this.parentNode._placesView)
-+                                         new PlacesMenu(event, `place:parent=${PlacesUtils.bookmarks.mobileGuid}`,
-+                                                        PlacesUIUtils.getViewForNode(this.parentNode.parentNode).options);"/>
-+          </menu>
-+
-+          <menuseparator/>
-+          <!-- Bookmarks menu items will go here -->
-+          <menuitem id="BMB_bookmarksShowAll"
-+                    class="subviewbutton panel-subview-footer"
-+                    label="&showAllBookmarks2.label;"
-+                    command="Browser:ShowAllBookmarks"
-+                    key="manBookmarkKb"/>
-+        </menupopup>
-+      </toolbarbutton>
-+
-+      <toolbaritem id="search-container"
-+                   class="chromeclass-toolbar-additional"
-+                   title="&searchItem.title;"
-+                   align="center"
-+                   flex="100"
-+                   persist="width">
-+        <searchbar id="searchbar" flex="1"/>
-+      </toolbaritem>
-+    </toolbarpalette>
-+  </toolbox>
-+
-+  <hbox id="fullscr-toggler" hidden="true"/>
-+
-+  <deck id="content-deck" flex="1">
-+    <hbox flex="1" id="browser">
-+      <vbox id="browser-border-start" hidden="true" layer="true"/>
-+      <vbox id="sidebar-box" hidden="true" class="chromeclass-extrachrome">
-+        <sidebarheader id="sidebar-header" align="center">
-+          <toolbarbutton id="sidebar-switcher-target" flex="1" class="tabbable">
-+            <image id="sidebar-icon" consumeanchor="sidebar-switcher-target"/>
-+            <label id="sidebar-title" crop="end" flex="1" control="sidebar"/>
-+            <image id="sidebar-switcher-arrow"/>
-+          </toolbarbutton>
-+          <image id="sidebar-throbber"/>
-+# To ensure the button label's intrinsic width doesn't expand the sidebar
-+# if the label is long, the button needs flex=1.
-+# To ensure the button doesn't expand unnecessarily for short labels, the
-+# spacer should significantly out-flex the button.
-+          <spacer flex="1000"/>
-+          <toolbarbutton id="sidebar-close" class="close-icon tabbable" tooltiptext="&sidebarCloseButton.tooltip;" oncommand="SidebarUI.hide();"/>
-+        </sidebarheader>
-+        <browser id="sidebar" flex="1" autoscroll="false" disablehistory="true" disablefullscreen="true"
-+                  style="min-width: 14em; width: 18em; max-width: 36em;" tooltip="aHTMLTooltip"/>
-+      </vbox>
-+
-+      <splitter id="sidebar-splitter" class="chromeclass-extrachrome sidebar-splitter" hidden="true"/>
-+      <vbox id="appcontent" flex="1">
-+        <!-- gHighPriorityNotificationBox will be added here lazily. -->
-+        <tabbox id="tabbrowser-tabbox"
-+                flex="1" tabcontainer="tabbrowser-tabs">
-+          <tabpanels id="tabbrowser-tabpanels"
-+                     flex="1" class="plain" selectedIndex="0"/>
-+        </tabbox>
-+      </vbox>
-+      <vbox id="browser-border-end" hidden="true" layer="true"/>
-+    </hbox>
-+#include ../../components/customizableui/content/customizeMode.inc.xul
-+  </deck>
-+
-+  <html:div id="fullscreen-warning" class="pointerlockfswarning" hidden="true">
-+    <html:div class="pointerlockfswarning-domain-text">
-+      &fullscreenWarning.beforeDomain.label;
-+      <html:span class="pointerlockfswarning-domain"/>
-+      &fullscreenWarning.afterDomain.label;
-+    </html:div>
-+    <html:div class="pointerlockfswarning-generic-text">
-+      &fullscreenWarning.generic.label;
-+    </html:div>
-+    <html:button id="fullscreen-exit-button"
-+                 onclick="FullScreen.exitDomFullScreen();">
-+#ifdef XP_MACOSX
-+            &exitDOMFullscreenMac.button;
-+#else
-+            &exitDOMFullscreen.button;
-+#endif
-+    </html:button>
-+  </html:div>
-+
-+  <html:div id="pointerlock-warning" class="pointerlockfswarning" hidden="true">
-+    <html:div class="pointerlockfswarning-domain-text">
-+      &pointerlockWarning.beforeDomain.label;
-+      <html:span class="pointerlockfswarning-domain"/>
-+      &pointerlockWarning.afterDomain.label;
-+    </html:div>
-+    <html:div class="pointerlockfswarning-generic-text">
-+      &pointerlockWarning.generic.label;
-+    </html:div>
-+  </html:div>
-+
-+  <vbox id="browser-bottombox" layer="true">
-+    <!-- gNotificationBox will be added here lazily. -->
-+  </vbox>
-+
-+</window>
-diff --git a/browser/base/jar.mn b/browser/base/jar.mn
---- a/browser/base/jar.mn
-+++ b/browser/base/jar.mn
-@@ -28,16 +28,18 @@ browser.jar:
-         content/browser/aboutTabCrashed.js            (content/aboutTabCrashed.js)
-         content/browser/aboutTabCrashed.xhtml         (content/aboutTabCrashed.xhtml)
- *       content/browser/browser.css                   (content/browser.css)
-         content/browser/browser.js                    (content/browser.js)
- #ifdef MOZ_BROWSER_XHTML
- *       content/browser/browser.xhtml                 (content/browser.xhtml)
- #endif
- *       content/browser/browser.xul                   (content/browser.xul)
-+*       content/browser/browser-kde.xul               (content/browser-kde.xul)
-+%       override chrome://browser/content/browser.xul chrome://browser/content/browser-kde.xul desktop=kde
-         content/browser/browser-addons.js             (content/browser-addons.js)
-         content/browser/browser-allTabsMenu.js        (content/browser-allTabsMenu.js)
-         content/browser/browser-captivePortal.js      (content/browser-captivePortal.js)
-         content/browser/browser-ctrlTab.js            (content/browser-ctrlTab.js)
-         content/browser/browser-customization.js      (content/browser-customization.js)
-         content/browser/browser-data-submission-info-bar.js (content/browser-data-submission-info-bar.js)
-         content/browser/browser-compacttheme.js       (content/browser-compacttheme.js)
-         content/browser/browser-contentblocking.js    (content/browser-contentblocking.js)
-diff --git a/browser/components/build/nsModule.cpp b/browser/components/build/nsModule.cpp
---- a/browser/components/build/nsModule.cpp
-+++ b/browser/components/build/nsModule.cpp
-@@ -8,17 +8,17 @@
- #include "nsBrowserCompsCID.h"
- #include "DirectoryProvider.h"
- 
- #if defined(XP_WIN)
- #include "nsWindowsShellService.h"
- #elif defined(XP_MACOSX)
- #include "nsMacShellService.h"
- #elif defined(MOZ_WIDGET_GTK)
--#include "nsGNOMEShellService.h"
-+#include "nsUnixShellService.h"
- #endif
- 
- #if defined(MOZ_WIDGET_COCOA)
- #include "nsMacAttribution.h"
- #endif
- 
- #if defined(XP_WIN)
- #include "nsIEHistoryEnumerator.h"
-@@ -33,18 +33,16 @@ using namespace mozilla::browser;
- 
- /////////////////////////////////////////////////////////////////////////////
- 
- NS_GENERIC_FACTORY_CONSTRUCTOR(DirectoryProvider)
- #if defined(XP_WIN)
- NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindowsShellService)
- #elif defined(XP_MACOSX)
- NS_GENERIC_FACTORY_CONSTRUCTOR(nsMacShellService)
--#elif defined(MOZ_WIDGET_GTK)
--NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGNOMEShellService, Init)
- #endif
- 
- #if defined(MOZ_WIDGET_COCOA)
- NS_GENERIC_FACTORY_CONSTRUCTOR(nsMacAttributionService)
- #endif
- 
- #if defined(XP_WIN)
- NS_GENERIC_FACTORY_CONSTRUCTOR(nsIEHistoryEnumerator)
-@@ -67,17 +65,17 @@ NS_DEFINE_NAMED_CID(NS_MACATTRIBUTIONSER
- #endif
- 
- static const mozilla::Module::CIDEntry kBrowserCIDs[] = {
-     // clang-format off
-     { &kNS_BROWSERDIRECTORYPROVIDER_CID, false, nullptr, DirectoryProviderConstructor },
- #if defined(XP_WIN)
-     { &kNS_SHELLSERVICE_CID, false, nullptr, nsWindowsShellServiceConstructor },
- #elif defined(MOZ_WIDGET_GTK)
--    { &kNS_SHELLSERVICE_CID, false, nullptr, nsGNOMEShellServiceConstructor },
-+    { &kNS_SHELLSERVICE_CID, false, nullptr, nsUnixShellServiceConstructor },
- #endif
-     { &kNS_BROWSER_ABOUT_REDIRECTOR_CID, false, nullptr, AboutRedirector::Create },
- #if defined(XP_WIN)
-     { &kNS_WINIEHISTORYENUMERATOR_CID, false, nullptr, nsIEHistoryEnumeratorConstructor },
- #elif defined(XP_MACOSX)
-     { &kNS_SHELLSERVICE_CID, false, nullptr, nsMacShellServiceConstructor },
- #endif
- #if defined(MOZ_WIDGET_COCOA)
 diff --git a/browser/components/preferences/in-content/main.js b/browser/components/preferences/in-content/main.js
 --- a/browser/components/preferences/in-content/main.js
 +++ b/browser/components/preferences/in-content/main.js
-@@ -289,16 +289,23 @@ var gMainPane = {
-           this._backoffIndex++ : backoffTimes.length - 1]);
+@@ -341,16 +341,23 @@ var gMainPane = {
+         }, backoffTimes[this._backoffIndex + 1 < backoffTimes.length ? this._backoffIndex++ : backoffTimes.length - 1]);
        };
  
        window.setTimeout(() => {
@@ -1505,18 +33,18 @@
      this.initBrowserContainers();
      this.buildContentProcessCountMenuList();
  
-     let performanceSettingsLink = document.getElementById("performanceSettingsLearnMore");
-     let performanceSettingsUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "performance";
-     performanceSettingsLink.setAttribute("href", performanceSettingsUrl);
- 
-     this.updateDefaultPerformanceSettingsPref();
-@@ -1012,16 +1019,27 @@ var gMainPane = {
-       // Reset exponential backoff delay time in order to do visual update in pollForDefaultBrowser.
+     let performanceSettingsLink = document.getElementById(
+       "performanceSettingsLearnMore"
+     );
+     let performanceSettingsUrl =
+       Services.urlFormatter.formatURLPref("app.support.baseURL") +
+@@ -1199,16 +1206,27 @@ var gMainPane = {
        this._backoffIndex = 0;
  
        let shellSvc = getShellService();
-       if (!shellSvc)
+       if (!shellSvc) {
          return;
+       }
        try {
          shellSvc.setDefaultBrowser(true, false);
 +        if (kde_session == 1) {
@@ -1541,30 +69,30 @@
 diff --git a/browser/components/shell/moz.build b/browser/components/shell/moz.build
 --- a/browser/components/shell/moz.build
 +++ b/browser/components/shell/moz.build
-@@ -39,16 +39,18 @@ if CONFIG['OS_ARCH'] == 'WINNT':
+@@ -28,16 +28,18 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'coco
      ]
- elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
-     SOURCES += [
-         'nsMacShellService.cpp',
+ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk':
+     XPIDL_SOURCES += [
+         'nsIGNOMEShellService.idl',
      ]
- elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
+ 
      SOURCES += [
          'nsGNOMEShellService.cpp',
 +        'nsKDEShellService.cpp',
 +        'nsUnixShellService.cpp',
      ]
- 
- if SOURCES:
-     FINAL_LIBRARY = 'browsercomps'
- 
- EXTRA_JS_MODULES += [
-     'HeadlessShell.jsm',
-     'ShellService.jsm',
+ elif CONFIG['OS_ARCH'] == 'WINNT':
+     SOURCES += [
+         'nsWindowsShellService.cpp',
+     ]
+     LOCAL_INCLUDES += [
+         '../../../other-licenses/nsis/Contrib/CityHash/cityhash',
+     ]
 diff --git a/browser/components/shell/nsKDEShellService.cpp b/browser/components/shell/nsKDEShellService.cpp
 new file mode 100644
 --- /dev/null
 +++ b/browser/components/shell/nsKDEShellService.cpp
-@@ -0,0 +1,153 @@
+@@ -0,0 +1,103 @@
 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 +/* This Source Code Form is subject to the terms of the Mozilla Public
 + * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -1598,13 +126,10 @@
 +NS_IMPL_ISUPPORTS(nsKDEShellService, nsIGNOMEShellService, nsIShellService)
 +
 +NS_IMETHODIMP
-+nsKDEShellService::IsDefaultBrowser(bool aStartupCheck,
-+                                    bool aForAllTypes,
++nsKDEShellService::IsDefaultBrowser(bool aForAllTypes,
 +                                    bool* aIsDefaultBrowser)
 +{
 +    *aIsDefaultBrowser = false;
-+    if (aStartupCheck)
-+        mCheckedThisSession = true;
 +
 +    nsCOMPtr<nsIMutableArray> command = do_CreateInstance( NS_ARRAY_CONTRACTID );
 +    if (!command)
@@ -1671,58 +196,11 @@
 +    return NS_ERROR_NOT_IMPLEMENTED;
 +}
 +
-+NS_IMETHODIMP
-+nsKDEShellService::OpenApplication(PRInt32 aApplication)
-+{
-+    nsCOMPtr<nsIMutableArray> command = do_CreateInstance( NS_ARRAY_CONTRACTID );
-+    if (!command)
-+        return NS_ERROR_FAILURE;
-+
-+    nsCOMPtr<nsISupportsCString> str = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
-+    if (!str)
-+        return NS_ERROR_FAILURE;
-+
-+    if( aApplication == APPLICATION_MAIL )
-+        str->SetData( NS_LITERAL_CSTRING( "OPENMAIL" ));
-+    else if( aApplication == APPLICATION_NEWS )
-+        str->SetData( NS_LITERAL_CSTRING( "OPENNEWS" ));
-+    else
-+        return NS_ERROR_NOT_IMPLEMENTED;
-+
-+    command->AppendElement( str );
-+    return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE;
-+}
-+
-+NS_IMETHODIMP
-+nsKDEShellService::OpenApplicationWithURI(nsIFile* aApplication, const nsACString& aURI)
-+{
-+    nsCOMPtr<nsIMutableArray> command = do_CreateInstance( NS_ARRAY_CONTRACTID );
-+    if (!command)
-+        return NS_ERROR_FAILURE;
-+
-+    nsCOMPtr<nsISupportsCString> cmdstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
-+    nsCOMPtr<nsISupportsCString> appstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
-+    nsCOMPtr<nsISupportsCString> uristr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
-+    if (!cmdstr || !appstr || !uristr)
-+        return NS_ERROR_FAILURE;
-+
-+    cmdstr->SetData( NS_LITERAL_CSTRING( "RUN" ));
-+    command->AppendElement( cmdstr );
-+    nsAutoCString app;
-+    nsresult rv = aApplication->GetNativePath( app );
-+    NS_ENSURE_SUCCESS( rv, rv );
-+    appstr->SetData( app );
-+    command->AppendElement( appstr );
-+    uristr->SetData( aURI );
-+    command->AppendElement( uristr );
-+    return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE;
-+}
-+
 diff --git a/browser/components/shell/nsKDEShellService.h b/browser/components/shell/nsKDEShellService.h
 new file mode 100644
 --- /dev/null
 +++ b/browser/components/shell/nsKDEShellService.h
-@@ -0,0 +1,30 @@
+@@ -0,0 +1,32 @@
 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 +/* This Source Code Form is subject to the terms of the Mozilla Public
 + * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -1732,10 +210,12 @@
 +#define nskdeshellservice_h____
 +
 +#include "nsIGNOMEShellService.h"
++#include "nsToolkitShellService.h"
 +#include "nsString.h"
 +#include "mozilla/Attributes.h"
 +
-+class nsKDEShellService final : public nsIGNOMEShellService
++class nsKDEShellService final : public nsIGNOMEShellService,
++                                public nsToolkitShellService
 +{
 +public:
 +  nsKDEShellService() : mCheckedThisSession(false) { }
@@ -1800,25 +280,3 @@
 +nsUnixShellServiceConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult);
 +
 +#endif // nsunixshellservice_h____
-diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
---- a/browser/installer/package-manifest.in
-+++ b/browser/installer/package-manifest.in
-@@ -451,16 +451,18 @@
- @RESPATH@/browser/defaults/settings/pinning
- @RESPATH@/browser/defaults/settings/main
- 
- ; Warning: changing the path to channel-prefs.js can cause bugs (Bug 756325)
- ; Technically this is an app pref file, but we are keeping it in the original
- ; gre location for now.
- @RESPATH@/defaults/pref/channel-prefs.js
- 
-+@RESPATH@/defaults/pref/kde.js
-+
- ; Services (gre) prefs
- @RESPATH@/defaults/pref/services-sync.js
- 
- ; [Layout Engine Resources]
- ; Style Sheets, Graphics and other Resources used by the layout engine.
- @RESPATH@/res/EditorOverride.css
- @RESPATH@/res/contenteditable.css
- @RESPATH@/res/designmode.css
--- a/mozilla-aarch64-startup-crash.patch	Sun Mar 17 10:00:10 2019 +0100
+++ b/mozilla-aarch64-startup-crash.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -1,23 +1,22 @@
 # HG changeset patch
-# Parent a5cfa3aa11a9d3391df49de6fc5a0e5232c12c10
-# Parent  7b5f6b68a8963228f738b803177f937481e19745
-Bug 991344 - Rpi3: Firefox crashes after a few seconds of usage
+# User msirringhaus@suse.de
+# Date 1558442998 -7200
+#      Tue May 21 14:49:58 2019 +0200
+# Node ID 386083b58d8558141901d796ec6919a4aba7ad3a
+# Parent  835641be7eb9408aa1eff0d38b37f6c523d2ef98
+bsc#991344 - Rpi3: Firefox crashes after a few seconds of usage
+bmo#1302554 - ARM/AARCH64: Firefox crashes on NULL nsIChannel** result pointer in nsIOService::NewChannelFromURIWithProxyFlagsInternal()
 
-diff --git a/netwerk/base/nsIOService.cpp b/netwerk/base/nsIOService.cpp
---- a/netwerk/base/nsIOService.cpp
-+++ b/netwerk/base/nsIOService.cpp
-@@ -842,17 +842,23 @@ nsresult nsIOService::NewChannelFromURIW
-             "doesn't support nsIUploadChannel2. An extension has "
-             "supplied a non-functional http protocol handler. This will "
-             "break behavior and in future releases not work at all.");
-       }
-       gHasWarnedUploadChannel2 = true;
+diff -r 835641be7eb9 -r 386083b58d85 netwerk/base/nsIOService.cpp
+--- a/netwerk/base/nsIOService.cpp	Fri Feb 26 16:20:09 2016 +0000
++++ b/netwerk/base/nsIOService.cpp	Tue May 21 14:49:58 2019 +0200
+@@ -1000,7 +1000,13 @@
      }
    }
  
 +#if defined(__aarch64__)
 +  if (result) {
-+      channel.forget(result);
++    channel.forget(result);
 +  }
 +#else
    channel.forget(result);
@@ -25,8 +24,3 @@
    return NS_OK;
  }
  
- NS_IMETHODIMP
- nsIOService::NewChannelFromURIWithProxyFlags2(
-     nsIURI *aURI, nsIURI *aProxyURI, uint32_t aProxyFlags,
-     nsINode *aLoadingNode, nsIPrincipal *aLoadingPrincipal,
-     nsIPrincipal *aTriggeringPrincipal, uint32_t aSecurityFlags,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1005535.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,20 @@
+# HG changeset patch
+# User Steve Singer <steve@ssinger.info>
+# Date 1558451540 -7200
+#      Tue May 21 17:12:20 2019 +0200
+# Node ID 433beec63e6b5f409683af20a0c1ab137cc7bfad
+# Parent  42c99b59a87b904063bad3193f10c51d068d2eac
+Bug 1005535 - Get skia GPU building on big endian.
+
+diff -r 42c99b59a87b -r 433beec63e6b gfx/skia/skia/include/private/GrColor.h
+--- a/gfx/skia/skia/include/private/GrColor.h	Wed Jun 05 08:48:08 2019 +0200
++++ b/gfx/skia/skia/include/private/GrColor.h	Tue May 21 17:12:20 2019 +0200
+@@ -63,7 +63,7 @@
+  *  Since premultiplied means that alpha >= color, we construct a color with
+  *  each component==255 and alpha == 0 to be "illegal"
+  */
+-#define GrColor_ILLEGAL     (~(0xFF << GrColor_SHIFT_A))
++#define GrColor_ILLEGAL     ((uint32_t)(~(0xFF << GrColor_SHIFT_A)))
+ 
+ /** Normalizes and coverts an uint8_t to a float. [0, 255] -> [0.0, 1.0] */
+ static inline float GrNormalizeByteToFloat(uint8_t value) {
--- a/mozilla-bmo1463035.patch	Sun Mar 17 10:00:10 2019 +0100
+++ b/mozilla-bmo1463035.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -3,7 +3,7 @@
 # User Mike Hommey <mh+mozilla@glandium.org>
 # Date 1526871862 -32400
 # Node ID 94f21505ff13cd089f7129cd24927cf8b31a0f43
-# Parent  25ab6bab437517a8a182f1ab77898ae13b26a696
+# Parent  5dc1d2186f44dd6ccfc4b28b9e1ed859cffc63bb
 Bug 1463035 - Remove MOZ_SIGNAL_TRAMPOLINE. r?darchons
 
 For some reason, GNU as is not happy with the assembly generated after
@@ -12,53 +12,10 @@
 OTOH, as mentioned in bug 1238661 comment 4, we actually don't need this
 workaround anymore, so let's just kill it.
 
-diff --git a/mfbt/LinuxSignal.h b/mfbt/LinuxSignal.h
-deleted file mode 100644
---- a/mfbt/LinuxSignal.h
-+++ /dev/null
-@@ -1,38 +0,0 @@
--/* This Source Code Form is subject to the terms of the Mozilla Public
-- * License, v. 2.0. If a copy of the MPL was not distributed with this
-- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
--
--#ifndef mozilla_LinuxSignal_h
--#define mozilla_LinuxSignal_h
--
--namespace mozilla {
--
--#if defined(__arm__)
--
--// Some (old) Linux kernels on ARM have a bug where a signal handler
--// can be called without clearing the IT bits in CPSR first. The result
--// is that the first few instructions of the handler could be skipped,
--// ultimately resulting in crashes. To workaround this bug, the handler
--// on ARM is a trampoline that starts with enough NOP instructions, so
--// that even if the IT bits are not cleared, only the NOP instructions
--// will be skipped over.
--
--template <void (*H)(int, siginfo_t*, void*)>
--__attribute__((naked)) void SignalTrampoline(int aSignal, siginfo_t* aInfo,
--                                             void* aContext) {
--  asm volatile("nop; nop; nop; nop" : : : "memory");
--
--  asm volatile("b %0" : : "X"(H) : "memory");
--}
--
--#define MOZ_SIGNAL_TRAMPOLINE(h) (mozilla::SignalTrampoline<h>)
--
--#else  // __arm__
--
--#define MOZ_SIGNAL_TRAMPOLINE(h) (h)
--
--#endif  // __arm__
--
--}  // namespace mozilla
--
--#endif  // mozilla_LinuxSignal_h
 diff --git a/mfbt/moz.build b/mfbt/moz.build
 --- a/mfbt/moz.build
 +++ b/mfbt/moz.build
-@@ -124,20 +124,16 @@ EXPORTS["double-conversion"] = [
+@@ -122,20 +122,16 @@ EXPORTS["double-conversion"] = [
  LOCAL_INCLUDES += [
      '/mfbt/double-conversion',
  ]
@@ -79,14 +36,14 @@
      'double-conversion/double-conversion/bignum.cc',
      'double-conversion/double-conversion/cached-powers.cc',
      'double-conversion/double-conversion/diy-fp.cc',
-diff --git a/tools/profiler/core/platform-linux-android.cpp b/tools/profiler/core/platform-linux-android.cpp
---- a/tools/profiler/core/platform-linux-android.cpp
-+++ b/tools/profiler/core/platform-linux-android.cpp
+diff --git a/mozglue/baseprofiler/core/platform-linux-android.cpp b/mozglue/baseprofiler/core/platform-linux-android.cpp
+--- a/mozglue/baseprofiler/core/platform-linux-android.cpp
++++ b/mozglue/baseprofiler/core/platform-linux-android.cpp
 @@ -55,17 +55,16 @@
  #ifdef __GLIBC__
- #include <execinfo.h>  // backtrace, backtrace_symbols
- #endif                 // def __GLIBC__
- #include <strings.h>   // index
+ #  include <execinfo.h>  // backtrace, backtrace_symbols
+ #endif                   // def __GLIBC__
+ #include <strings.h>     // index
  #include <errno.h>
  #include <stdarg.h>
  
@@ -100,7 +57,7 @@
  
  using namespace mozilla;
  
-@@ -248,17 +247,17 @@ Sampler::Sampler(PSLockRef aLock)
+@@ -266,17 +265,17 @@ Sampler::Sampler(PSLockRef aLock)
  
    // NOTE: We don't initialize LUL here, instead initializing it in
    // SamplerThread's constructor. This is because with the
@@ -119,3 +76,43 @@
  }
  
  void Sampler::Disable(PSLockRef aLock) {
+diff --git a/tools/profiler/core/platform-linux-android.cpp b/tools/profiler/core/platform-linux-android.cpp
+--- a/tools/profiler/core/platform-linux-android.cpp
++++ b/tools/profiler/core/platform-linux-android.cpp
+@@ -55,17 +55,16 @@
+ #ifdef __GLIBC__
+ #  include <execinfo.h>  // backtrace, backtrace_symbols
+ #endif                   // def __GLIBC__
+ #include <strings.h>     // index
+ #include <errno.h>
+ #include <stdarg.h>
+ 
+ #include "prenv.h"
+-#include "mozilla/LinuxSignal.h"
+ #include "mozilla/PodOperations.h"
+ #include "mozilla/DebugOnly.h"
+ 
+ #include <string.h>
+ #include <list>
+ 
+ using namespace mozilla;
+ 
+@@ -257,17 +256,17 @@ Sampler::Sampler(PSLockRef aLock)
+ 
+   // NOTE: We don't initialize LUL here, instead initializing it in
+   // SamplerThread's constructor. This is because with the
+   // profiler_suspend_and_sample_thread entry point, we want to be able to
+   // sample without waiting for LUL to be initialized.
+ 
+   // Request profiling signals.
+   struct sigaction sa;
+-  sa.sa_sigaction = MOZ_SIGNAL_TRAMPOLINE(SigprofHandler);
++  sa.sa_sigaction = SigprofHandler;
+   sigemptyset(&sa.sa_mask);
+   sa.sa_flags = SA_RESTART | SA_SIGINFO;
+   if (sigaction(SIGPROF, &sa, &mOldSigprofHandler) != 0) {
+     MOZ_CRASH("Error installing SIGPROF handler in the profiler");
+   }
+ }
+ 
+ void Sampler::Disable(PSLockRef aLock) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1504834-part1.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,81 @@
+# HG changeset patch
+# Parent  051b75a600dfbf7503c3485cebfd34d4eb29be96
+Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1504834
+
+diff -r 051b75a600df gfx/2d/DrawTargetSkia.cpp
+--- a/gfx/2d/DrawTargetSkia.cpp	Fri Jul 05 12:42:44 2019 +0200
++++ b/gfx/2d/DrawTargetSkia.cpp	Mon Jul 08 10:59:30 2019 +0200
+@@ -138,8 +138,7 @@
+   return surfaceBounds.Intersect(bounds);
+ }
+ 
+-static const int kARGBAlphaOffset =
+-    SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0;
++static const int kARGBAlphaOffset = 0;  // Skia is always BGRA SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0;
+ 
+ static bool VerifyRGBXFormat(uint8_t* aData, const IntSize& aSize,
+                              const int32_t aStride, SurfaceFormat aFormat) {
+diff -r 051b75a600df gfx/2d/Types.h
+--- a/gfx/2d/Types.h	Fri Jul 05 12:42:44 2019 +0200
++++ b/gfx/2d/Types.h	Mon Jul 08 10:59:30 2019 +0200
+@@ -85,15 +85,8 @@
+ // The following values are endian-independent synonyms. The _UINT32 suffix
+ // indicates that the name reflects the layout when viewed as a uint32_t
+ // value.
+-#if MOZ_LITTLE_ENDIAN
+   A8R8G8B8_UINT32 = B8G8R8A8,  // 0xAARRGGBB
+   X8R8G8B8_UINT32 = B8G8R8X8   // 0x00RRGGBB
+-#elif MOZ_BIG_ENDIAN
+-  A8R8G8B8_UINT32 = A8R8G8B8,  // 0xAARRGGBB
+-  X8R8G8B8_UINT32 = X8R8G8B8   // 0x00RRGGBB
+-#else
+-#  error "bad endianness"
+-#endif
+ };
+ 
+ static inline int BytesPerPixel(SurfaceFormat aFormat) {
+diff -r 051b75a600df gfx/skia/skia/third_party/skcms/skcms.cc
+--- a/gfx/skia/skia/third_party/skcms/skcms.cc	Fri Jul 05 12:42:44 2019 +0200
++++ b/gfx/skia/skia/third_party/skcms/skcms.cc	Mon Jul 08 10:59:30 2019 +0200
+@@ -17,6 +17,8 @@
+     #include <arm_neon.h>
+ #elif defined(__SSE__)
+     #include <immintrin.h>
++#else
++    #define SKCMS_PORTABLE
+ #endif
+ 
+ // sizeof(x) will return size_t, which is 32-bit on some machines and 64-bit on others.
+@@ -124,20 +126,28 @@
+ static uint16_t read_big_u16(const uint8_t* ptr) {
+     uint16_t be;
+     memcpy(&be, ptr, sizeof(be));
+-#if defined(_MSC_VER)
++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
++    return be;
++#else
++    #if defined(_MSC_VER)
+     return _byteswap_ushort(be);
+-#else
++    #else
+     return __builtin_bswap16(be);
++    #endif
+ #endif
+ }
+ 
+ static uint32_t read_big_u32(const uint8_t* ptr) {
+     uint32_t be;
+     memcpy(&be, ptr, sizeof(be));
+-#if defined(_MSC_VER)
++#if __BYTE_ORDER == __ORDER_BIG_ENDIAN__
++    return be;
++#else
++    #if defined(_MSC_VER)
+     return _byteswap_ulong(be);
+-#else
++    #else
+     return __builtin_bswap32(be);
++    #endif
+ #endif
+ }
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1504834-part2.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,112 @@
+# HG changeset patch
+# Parent  6fa4b62427433e8f445d05c557e5db096667d880
+Skia does not support big endian. The places to fix are too numerous and upstream (skia, not Mozilla)
+has no interest in maintaining big endian.
+So here we try to swizzle the input for skia, so that skia always works on LE, and when it comes
+out again, we transform back to BE.
+
+diff --git a/gfx/2d/ConvolutionFilter.cpp b/gfx/2d/ConvolutionFilter.cpp
+--- a/gfx/2d/ConvolutionFilter.cpp
++++ b/gfx/2d/ConvolutionFilter.cpp
+@@ -30,32 +30,79 @@ bool ConvolutionFilter::GetFilterOffsetA
+                                                  int32_t* aResultLength) {
+   if (aRowIndex >= mFilter->numValues()) {
+     return false;
+   }
+   mFilter->FilterForValue(aRowIndex, aResultOffset, aResultLength);
+   return true;
+ }
+ 
++static void ByteSwapArray(uint8_t *u8Array, int32_t size) {
++    uint32_t *array = reinterpret_cast<uint32_t*>(u8Array);
++    for (int pxl = 0; pxl < size; ++pxl) {
++        // Use an endian swap to move the bytes, i.e. BGRA -> ARGB.
++        uint32_t rgba = array[pxl];
++        array[pxl] = NativeEndian::swapToLittleEndian(rgba);
++    }
++}
++
+ void ConvolutionFilter::ConvolveHorizontally(const uint8_t* aSrc, uint8_t* aDst,
+                                              bool aHasAlpha) {
++#if MOZ_BIG_ENDIAN
++    int outputSize = mFilter->numValues();
++
++    // Input size isn't handed in, so we have to calculate it quickly
++    int inputSize = 0;
++    for (int xx = 0; xx < outputSize; ++xx) {
++        // Get the filter that determines the current output pixel.
++        int filterOffset, filterLength;
++        mFilter->FilterForValue(xx, &filterOffset, &filterLength);
++        inputSize = std::max(inputSize, filterOffset + filterLength);
++    }
++
++    ByteSwapArray((uint8_t*)aSrc, inputSize);
++#endif
++
+   SkOpts::convolve_horizontally(aSrc, *mFilter, aDst, aHasAlpha);
++
++#if MOZ_BIG_ENDIAN
++    ByteSwapArray((uint8_t*)aSrc, inputSize);
++    ByteSwapArray(aDst, outputSize);
++#endif
+ }
+ 
+ void ConvolutionFilter::ConvolveVertically(uint8_t* const* aSrc, uint8_t* aDst,
+                                            int32_t aRowIndex, int32_t aRowSize,
+                                            bool aHasAlpha) {
+   MOZ_ASSERT(aRowIndex < mFilter->numValues());
+ 
+   int32_t filterOffset;
+   int32_t filterLength;
+   auto filterValues =
+       mFilter->FilterForValue(aRowIndex, &filterOffset, &filterLength);
++
++#if MOZ_BIG_ENDIAN
++  for (int filterY = 0; filterY < filterLength; filterY++) {
++      // Skia only knows LE, so we have to swizzle the input
++    ByteSwapArray(aSrc[filterY], aRowSize);
++  }
++#endif
++
+   SkOpts::convolve_vertically(filterValues, filterLength, aSrc, aRowSize, aDst,
+                               aHasAlpha);
++
++#if MOZ_BIG_ENDIAN
++  // After skia is finished, we swizzle back to BE, in case
++  // the input is used again somewhere else
++  for (int filterY = 0; filterY < filterLength; filterY++) {
++    ByteSwapArray(aSrc[filterY], aRowSize);
++  }
++  // The destination array as well
++  ByteSwapArray(aDst, aRowSize);
++#endif
+ }
+ 
+ /* ConvolutionFilter::ComputeResizeFactor is derived from Skia's
+  * SkBitmapScaler/SkResizeFilter::computeFactors. It is governed by Skia's
+  * BSD-style license (see gfx/skia/LICENSE) and the following copyright:
+  * Copyright (c) 2015 Google Inc.
+  */
+ bool ConvolutionFilter::ComputeResizeFilter(ResizeMethod aResizeMethod,
+diff --git a/gfx/skia/skia/include/core/SkPreConfig.h b/gfx/skia/skia/include/core/SkPreConfig.h
+--- a/gfx/skia/skia/include/core/SkPreConfig.h
++++ b/gfx/skia/skia/include/core/SkPreConfig.h
+@@ -68,17 +68,17 @@
+         #define SK_CPU_BENDIAN
+     #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+         #define SK_CPU_LENDIAN
+     #elif defined(__sparc) || defined(__sparc__) || \
+       defined(_POWER) || defined(__powerpc__) || \
+       defined(__ppc__) || defined(__hppa) || \
+       defined(__PPC__) || defined(__PPC64__) || \
+       defined(_MIPSEB) || defined(__ARMEB__) || \
+-      defined(__s390__) || \
++      defined(__s390__) || defined(__s390x__) || \
+       (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
+       (defined(__ia64) && defined(__BIG_ENDIAN__))
+          #define SK_CPU_BENDIAN
+     #else
+         #define SK_CPU_LENDIAN
+     #endif
+ #endif
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1504834-part3.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,44 @@
+# HG changeset patch
+# Parent  aecb4600e5da17443b224c79eee178c1d8e155e3
+For FF68, AntiAliasing of XULTexts seem to be broken on big endian (s390x). Text and icons of the sandwich-menu to the
+right of the address bar, as well as plugin-windows appears transparant, which usually means unreadable (white on white).
+
+diff -r aecb4600e5da gfx/skia/skia/include/private/SkNx.h
+--- a/gfx/skia/skia/include/private/SkNx.h	Tue Aug 20 09:46:55 2019 +0200
++++ b/gfx/skia/skia/include/private/SkNx.h	Mon Sep 09 10:04:06 2019 +0200
+@@ -238,7 +238,18 @@
+     AI SkNx operator*(const SkNx& y) const { return fVal * y.fVal; }
+     AI SkNx operator/(const SkNx& y) const { return fVal / y.fVal; }
+ 
++    // On Big endian the commented out variant doesn't work,
++    // and honestly, I have no idea why it exists in the first place.
++    // The reason its broken is, I think, that it defaults to the double-variant of ToBits()
++    // which gets a 64-bit integer, and FromBits returns 32-bit,
++    // cutting off the wrong half again.
++    // Overall, I see no reason to have ToBits and FromBits at all (even for floats/doubles).
++    // Still we are only "fixing" this for big endian and leave little endian alone (never touch a running system)
++#ifdef SK_CPU_BENDIAN
++    AI SkNx operator&(const SkNx& y) const { return fVal & y.fVal; }
++#else
+     AI SkNx operator&(const SkNx& y) const { return FromBits(ToBits(fVal) & ToBits(y.fVal)); }
++#endif
+     AI SkNx operator|(const SkNx& y) const { return FromBits(ToBits(fVal) | ToBits(y.fVal)); }
+     AI SkNx operator^(const SkNx& y) const { return FromBits(ToBits(fVal) ^ ToBits(y.fVal)); }
+ 
+diff -r aecb4600e5da gfx/skia/skia/src/opts/SkBlitMask_opts.h
+--- a/gfx/skia/skia/src/opts/SkBlitMask_opts.h	Tue Aug 20 09:46:55 2019 +0200
++++ b/gfx/skia/skia/src/opts/SkBlitMask_opts.h	Mon Sep 09 10:04:06 2019 +0200
+@@ -203,7 +203,13 @@
+             //   ~~~>
+             // a = 1*aa + d(1-1*aa) = aa + d(1-aa)
+             // c = 0*aa + d(1-1*aa) =      d(1-aa)
++
++            // For big endian we have to swap the alpha-mask from 0,0,0,255 to 255,0,0,0
++#ifdef SK_CPU_BENDIAN
++            return Sk4px(Sk16b(aa) & Sk16b(255,0,0,0, 255,0,0,0, 255,0,0,0, 255,0,0,0))
++#else
+             return Sk4px(Sk16b(aa) & Sk16b(0,0,0,255, 0,0,0,255, 0,0,0,255, 0,0,0,255))
++#endif
+                  + d.approxMulDiv255(aa.inv());
+         };
+         while (h --> 0) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1511604.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,76 @@
+# HG changeset patch
+# User A. Wilcox <AWilcox@Wilcox-Tech.com>
+# Date 1543674229 0
+#      Sat Dec 01 14:23:49 2018 +0000
+# Node ID 0309ff19e46b126c527e633518d7de8570442114
+# Parent  ba2c9b0542c95cc5ee26c264e8338fc9ba94c958
+Bug 1511604 - Swizzle YCbCr->RGB data on big-endian machines
+Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1511604
+
+This is very closely related to mozilla-bmo1504834
+
+Again, input for skia is swizzled to LE, as skia only understands LE.
+
+diff --git a/gfx/ycbcr/YCbCrUtils.cpp b/gfx/ycbcr/YCbCrUtils.cpp
+--- a/gfx/ycbcr/YCbCrUtils.cpp
++++ b/gfx/ycbcr/YCbCrUtils.cpp
+@@ -1,14 +1,16 @@
+ /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+  * This Source Code Form is subject to the terms of the Mozilla Public
+  * License, v. 2.0. If a copy of the MPL was not distributed with this
+  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ 
++#include "mozilla/EndianUtils.h"
+ #include "gfx2DGlue.h"
++#include "mozilla/gfx/Swizzle.h"
+ 
+ #include "YCbCrUtils.h"
+ #include "yuv_convert.h"
+ #include "ycbcr_to_rgb565.h"
+ 
+ namespace mozilla {
+ namespace gfx {
+ 
+@@ -231,16 +233,23 @@ ConvertYCbCrToRGB(const layers::PlanarYC
+                           srcData.mPicSize.width,
+                           srcData.mPicSize.height,
+                           srcData.mYStride,
+                           srcData.mCbCrStride,
+                           aStride,
+                           yuvtype,
+                           srcData.mYUVColorSpace);
+   }
++#if MOZ_BIG_ENDIAN
++  // libyuv makes endian-correct result, which needs to be swapped to BGRX
++  if (aDestFormat != SurfaceFormat::R5G6B5_UINT16)
++    gfx::SwizzleData(aDestBuffer, aStride, gfx::SurfaceFormat::X8R8G8B8,
++                     aDestBuffer, aStride, gfx::SurfaceFormat::B8G8R8X8,
++                     srcData.mPicSize);
++#endif
+ }
+ 
+ void
+ ConvertYCbCrAToARGB(const uint8_t* aSrcY,
+                     const uint8_t* aSrcU,
+                     const uint8_t* aSrcV,
+                     const uint8_t* aSrcA,
+                     int aSrcStrideYA, int aSrcStrideUV,
+@@ -252,12 +261,18 @@ ConvertYCbCrAToARGB(const uint8_t* aSrcY
+                         aSrcV,
+                         aSrcA,
+                         aDstARGB,
+                         aWidth,
+                         aHeight,
+                         aSrcStrideYA,
+                         aSrcStrideUV,
+                         aDstStrideARGB);
++#if MOZ_BIG_ENDIAN
++  // libyuv makes endian-correct result, which needs to be swapped to BGRA
++  gfx::SwizzleData(aDstARGB, aDstStrideARGB, gfx::SurfaceFormat::A8R8G8B8,
++                   aDstARGB, aDstStrideARGB, gfx::SurfaceFormat::B8G8R8A8,
++                   IntSize(aWidth, aHeight));
++#endif
+ }
+ 
+ } // namespace gfx
+ } // namespace mozilla
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1512162.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,34 @@
+# HG changeset patch
+# Parent  e5858dc7ab007042436496f7cfb9a5abf10f5082
+This fixes a broken build for gcc < 9 on ppc64le.
+This patch can be removed for newer gcc-versions.
+
+diff -r e5858dc7ab00 -r 5d3469aabe61 js/xpconnect/src/XPCWrappedNative.cpp
+--- a/js/xpconnect/src/XPCWrappedNative.cpp	Thu Nov 29 10:07:29 2018 +0100
++++ b/js/xpconnect/src/XPCWrappedNative.cpp	Tue Sep 10 12:42:13 2019 +0200
+@@ -1092,7 +1092,11 @@
+   MOZ_ALWAYS_INLINE bool GetOutParamSource(uint8_t paramIndex,
+                                            MutableHandleValue srcp) const;
+ 
+-  MOZ_ALWAYS_INLINE bool GatherAndConvertResults();
++#if !(__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN)
++// Work around a compiler bug on ppc64le (bug 1512162).
++  MOZ_ALWAYS_INLINE
++#endif
++  bool GatherAndConvertResults();
+ 
+   MOZ_ALWAYS_INLINE bool QueryInterfaceFastPath();
+ 
+@@ -1139,7 +1143,11 @@
+ 
+   ~CallMethodHelper();
+ 
+-  MOZ_ALWAYS_INLINE bool Call();
++#if !(__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN)
++// Work around a compiler bug on ppc64le (bug 1512162).
++  MOZ_ALWAYS_INLINE
++#endif
++  bool Call();
+ 
+   // Trace implementation so we can put our CallMethodHelper in a Rooted<T>.
+   void trace(JSTracer* aTrc);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1554971.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,22 @@
+# HG changeset patch
+# Parent  a25cebecb02d5460b8ad757fe9cb4a9c8d1d7658
+Eliminate startup error message:
+JavaScript error: , line 0: Error: Type error for platformInfo value (Error processing arch: Invalid enumeration value "s390x") for runtime.getPlatformInfo.
+
+Reported here: https://bugzilla.mozilla.org/show_bug.cgi?id=1554971
+
+Uncertain if this is causing real problems or not. Also uncertain if the fix actually fixes anything.
+No response from upstream yet.
+
+diff -r a25cebecb02d -r 378b81b00e73 toolkit/components/extensions/schemas/runtime.json
+--- a/toolkit/components/extensions/schemas/runtime.json	Fri Jul 05 12:42:44 2019 +0200
++++ b/toolkit/components/extensions/schemas/runtime.json	Fri Jul 19 13:19:30 2019 +0200
+@@ -64,7 +64,7 @@
+       {
+         "id": "PlatformArch",
+         "type": "string",
+-        "enum": ["arm", "x86-32", "x86-64"],
++        "enum": ["arm", "x86-32", "x86-64", "s390x", "aarch64", "ppc64le"],
+         "allowedContexts": ["content", "devtools"],
+         "description": "The machine's processor architecture."
+       },
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1568145.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,30 @@
+Author: Bernhard M. Wiedemann <bwiedemann suse de>
+Date: 2019-07-22
+
+Allow to override build date with SOURCE_DATE_EPOCH
+in order to make builds reproducible.
+See https://reproducible-builds.org/ for why this is good
+and https://reproducible-builds.org/specs/source-date-epoch/
+for the definition of this variable.
+
+diff --git a/python/mozbuild/mozbuild/action/langpack_manifest.py b/python/mozbuild/mozbuild/action/langpack_manifest.py
+index 6f72697..d4cca96 100644
+--- a/python/mozbuild/mozbuild/action/langpack_manifest.py
++++ b/python/mozbuild/mozbuild/action/langpack_manifest.py
+@@ -16,6 +16,7 @@ import os
+ import json
+ import io
+ import datetime
++import time
+ import requests
+ import mozversioncontrol
+ import mozpack.path as mozpath
+@@ -100,7 +101,7 @@ def get_timestamp_for_locale(path):
+         dt = get_dt_from_hg(path)
+ 
+     if dt is None:
+-        dt = datetime.datetime.utcnow()
++        dt = datetime.datetime.utcfromtimestamp(int(os.environ.get('SOURCE_DATE_EPOCH', time.time())))
+ 
+     dt = dt.replace(microsecond=0)
+     return dt.strftime("%Y%m%d%H%M%S")
--- a/mozilla-bmo256180.patch	Sun Mar 17 10:00:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# HG changeset patch
-# Parent  8d4f57b44373d51f0e151eeaadf9fe293bcdfb7c
-
-diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h
---- a/layout/generic/nsIFrame.h
-+++ b/layout/generic/nsIFrame.h
-@@ -8,17 +8,17 @@
- 
- #ifndef nsIFrame_h___
- #define nsIFrame_h___
- 
- #ifndef MOZILLA_INTERNAL_API
- #error This header/class should only be used within Mozilla code. It should not be used by extensions.
- #endif
- 
--#define MAX_REFLOW_DEPTH 200
-+#define MAX_REFLOW_DEPTH 1000
- 
- /* nsIFrame is in the process of being deCOMtaminated, i.e., this file is
-    eventually going to be eliminated, and all callers will use nsFrame instead.
-    At the moment we're midway through this process, so you will see inlined
-    functions and member variables in this file.  -dwh */
- 
- #include <algorithm>
- #include <stdio.h>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-disable-wasm-emulate-arm-unaligned-fp-access.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,11 @@
+--- a/js/src/wasm/WasmSignalHandlers.cpp	2019-05-16 11:25:13.260881532 +0200
++++ b/js/src/wasm/WasmSignalHandlers.cpp	2019-05-16 11:24:35.164589301 +0200
+@@ -243,7 +243,7 @@ using mozilla::DebugOnly;
+ // emulation here.
+ 
+ #if defined(__linux__) && defined(__arm__)
+-#  define WASM_EMULATE_ARM_UNALIGNED_FP_ACCESS
++// #  define WASM_EMULATE_ARM_UNALIGNED_FP_ACCESS
+ #endif
+ 
+ #ifdef WASM_EMULATE_ARM_UNALIGNED_FP_ACCESS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-fix-aarch64-libopus.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,25 @@
+# HG changeset patch
+# Parent  1317782cd47f1d1f2410712a1dd283b305393eae
+
+diff --git a/media/libopus/silk/arm/arm_silk_map.c b/media/libopus/silk/arm/arm_silk_map.c
+--- a/media/libopus/silk/arm/arm_silk_map.c
++++ b/media/libopus/silk/arm/arm_silk_map.c
+@@ -23,17 +23,17 @@ INTERRUPTION) HOWEVER CAUSED AND ON ANY 
+ 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.
+ ***********************************************************************/
+ #ifdef HAVE_CONFIG_H
+ # include "config.h"
+ #endif
+ 
+-#include "main_FIX.h"
++#include "../fixed/main_FIX.h"
+ #include "NSQ.h"
+ #include "SigProc_FIX.h"
+ 
+ #if defined(OPUS_HAVE_RTCD)
+ 
+ # if (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && \
+  !defined(OPUS_ARM_PRESUME_NEON_INTR))
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-fix-top-level-asm.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,42 @@
+From 91bb79836ee274855393bdf6ab10e24899b1b349 Mon Sep 17 00:00:00 2001
+From: Martin Liska <mliska@suse.cz>
+Date: Fri, 17 May 2019 14:41:35 +0200
+Subject: [PATCH] Fix top-level asm issue.
+
+---
+ security/sandbox/linux/moz.build | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/security/sandbox/linux/moz.build b/security/sandbox/linux/moz.build
+index aae85843e9f6..208368dfd189 100644
+--- a/security/sandbox/linux/moz.build
++++ b/security/sandbox/linux/moz.build
+@@ -61,7 +61,6 @@ UNIFIED_SOURCES += [
+     '../chromium/sandbox/linux/bpf_dsl/policy_compiler.cc',
+     '../chromium/sandbox/linux/bpf_dsl/syscall_set.cc',
+     '../chromium/sandbox/linux/seccomp-bpf/die.cc',
+-    '../chromium/sandbox/linux/seccomp-bpf/syscall.cc',
+     'broker/SandboxBrokerCommon.cpp',
+     'Sandbox.cpp',
+     'SandboxBrokerClient.cpp',
+@@ -77,6 +76,7 @@ UNIFIED_SOURCES += [
+ SOURCES += [
+     '../chromium/base/strings/safe_sprintf.cc',
+     '../chromium/base/third_party/icu/icu_utf.cc',
++    '../chromium/sandbox/linux/seccomp-bpf/syscall.cc',
+     '../chromium/sandbox/linux/seccomp-bpf/trap.cc',
+     '../chromium/sandbox/linux/services/syscall_wrappers.cc',
+ ]
+@@ -96,6 +96,9 @@ if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
+     SOURCES['../chromium/sandbox/linux/services/syscall_wrappers.cc'].flags += [
+         '-Wno-empty-body',
+     ]
++    SOURCES['../chromium/sandbox/linux/seccomp-bpf/syscall.cc'].flags += [
++        '-fno-lto'
++    ]
+ 
+ # gcc lto likes to put the top level asm in syscall.cc in a different partition
+ # from the function using it which breaks the build.  Work around that by
+-- 
+2.23.0
+
--- a/mozilla-kde.patch	Sun Mar 17 10:00:10 2019 +0100
+++ b/mozilla-kde.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -1,5 +1,9 @@
 # HG changeset patch
-# Parent  ff3da33eabc1d8760ec41a87afbaf44ded300ede
+# User msirringhaus@suse.de
+# Date 1559294891 -7200
+#      Fri May 31 11:28:11 2019 +0200
+# Node ID c2aa7198fb925e7fde96abf65b6f68b9b755f112
+# Parent  86d7ace0b36abf542e56fbb702a5f9b308b9bf77
 Description: Add KDE integration to Firefox (toolkit parts)
 Author: Wolfgang Rosenauer <wolfgang@rosenauer.org>
 Author: Lubos Lunak <lunak@suse.com>
@@ -9,8 +13,7 @@
 diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp
 --- a/modules/libpref/Preferences.cpp
 +++ b/modules/libpref/Preferences.cpp
-@@ -81,16 +81,17 @@
- #include "nsXPCOMCID.h"
+@@ -88,16 +88,17 @@
  #include "nsXPCOM.h"
  #include "nsXULAppAPI.h"
  #include "nsZipArchive.h"
@@ -18,16 +21,17 @@
  #include "PLDHashTable.h"
  #include "plstr.h"
  #include "prlink.h"
+ #include "xpcpublic.h"
 +#include "nsKDEUtils.h"
  
+ #ifdef DEBUG
+ #  include <map>
+ #endif
+ 
  #ifdef MOZ_MEMORY
- #include "mozmemory.h"
+ #  include "mozmemory.h"
  #endif
- 
- #ifdef XP_WIN
- #include "windows.h"
- #endif
-@@ -4466,25 +4467,37 @@ float MOZ_MAYBE_UNUSED GetPref<float>(co
+@@ -4542,25 +4543,37 @@ nsresult Preferences::InitInitialObjects
    // application pref files for backwards compatibility.
    static const char* specialFiles[] = {
  #if defined(XP_MACOSX)
@@ -37,10 +41,10 @@
  #elif defined(XP_UNIX)
      "unix.js"
 +    , "" // placeholder for KDE  (empty is otherwise harmless)
- #if defined(_AIX)
+ #  if defined(_AIX)
      ,
      "aix.js"
- #endif
+ #  endif
  #elif defined(XP_BEOS)
      "beos.js"
  #endif
@@ -65,7 +69,7 @@
  
    // Load jar:$app/omni.jar!/defaults/preferences/*.js
    // or jar:$gre/omni.jar!/defaults/preferences/*.js.
-@@ -4532,17 +4545,17 @@ float MOZ_MAYBE_UNUSED GetPref<float>(co
+@@ -4606,17 +4619,17 @@ nsresult Preferences::InitInitialObjects
        }
  
        nsCOMPtr<nsIFile> path = do_QueryInterface(elem);
@@ -87,9 +91,9 @@
 diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build
 --- a/modules/libpref/moz.build
 +++ b/modules/libpref/moz.build
-@@ -31,16 +31,20 @@ EXPORTS.mozilla += [
-     'StaticPrefs.h',
+@@ -110,16 +110,20 @@ EXPORTS.mozilla += [
  ]
+ EXPORTS.mozilla += sorted(['!' + g for g in gen_h])
  
  UNIFIED_SOURCES += [
      'Preferences.cpp',
@@ -97,21 +101,21 @@
  ]
  
 +LOCAL_INCLUDES += [
-+     '/toolkit/xre'
++    '/toolkit/xre'
 +]
 +
- include('/ipc/chromium/chromium-config.mozbuild')
+ gen_all_tuple = tuple(gen_h + gen_cpp + gen_rs)
  
- FINAL_LIBRARY = 'xul'
+ GENERATED_FILES += [gen_all_tuple]
  
- DEFINES['OS_ARCH'] = CONFIG['OS_ARCH']
- DEFINES['MOZ_WIDGET_TOOLKIT'] = CONFIG['MOZ_WIDGET_TOOLKIT']
- if CONFIG['MOZ_ENABLE_WEBRENDER']:
-     DEFINES['MOZ_ENABLE_WEBRENDER'] = True
+ static_pref_list = GENERATED_FILES[gen_all_tuple]
+ static_pref_list.script = 'init/generate_static_pref_list.py:emit_code'
+ static_pref_list.inputs = ['init/StaticPrefList.yaml']
+ 
 diff --git a/python/mozbuild/mozpack/chrome/flags.py b/python/mozbuild/mozpack/chrome/flags.py
 --- a/python/mozbuild/mozpack/chrome/flags.py
 +++ b/python/mozbuild/mozpack/chrome/flags.py
-@@ -220,16 +220,17 @@ class Flags(OrderedDict):
+@@ -227,16 +227,17 @@ class Flags(OrderedDict):
          'contentaccessible': Flag,
          'os': StringFlag,
          'osversion': VersionFlag,
@@ -132,7 +136,7 @@
 diff --git a/python/mozbuild/mozpack/chrome/manifest.py b/python/mozbuild/mozpack/chrome/manifest.py
 --- a/python/mozbuild/mozpack/chrome/manifest.py
 +++ b/python/mozbuild/mozpack/chrome/manifest.py
-@@ -39,16 +39,17 @@ class ManifestEntry(object):
+@@ -36,16 +36,17 @@ class ManifestEntry(object):
          'platformversion',
          'os',
          'osversion',
@@ -153,7 +157,7 @@
 diff --git a/toolkit/components/downloads/moz.build b/toolkit/components/downloads/moz.build
 --- a/toolkit/components/downloads/moz.build
 +++ b/toolkit/components/downloads/moz.build
-@@ -41,10 +41,14 @@ EXTRA_JS_MODULES += [
+@@ -41,10 +41,14 @@ XPCOM_MANIFESTS += [
  
  if CONFIG['MOZ_PLACES']:
      EXTRA_JS_MODULES += [
@@ -168,530 +172,32 @@
 +
  with Files('**'):
      BUG_COMPONENT = ('Toolkit', 'Downloads API')
-diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn
---- a/toolkit/content/jar.mn
-+++ b/toolkit/content/jar.mn
-@@ -67,16 +67,18 @@ toolkit.jar:
-    content/global/bindings/calendar.js         (widgets/calendar.js)
-    content/global/bindings/checkbox.xml        (widgets/checkbox.xml)
-    content/global/bindings/datekeeper.js       (widgets/datekeeper.js)
-    content/global/bindings/datepicker.js       (widgets/datepicker.js)
-    content/global/bindings/datetimepopup.xml   (widgets/datetimepopup.xml)
-    content/global/bindings/datetimebox.xml     (widgets/datetimebox.xml)
-    content/global/bindings/datetimebox.css     (widgets/datetimebox.css)
- *  content/global/bindings/dialog.xml          (widgets/dialog.xml)
-+*  content/global/bindings/dialog-kde.xml      (widgets/dialog-kde.xml)
-+% override chrome://global/content/bindings/dialog.xml chrome://global/content/bindings/dialog-kde.xml desktop=kde
-    content/global/bindings/general.xml         (widgets/general.xml)
-    content/global/bindings/menu.xml            (widgets/menu.xml)
-    content/global/bindings/menulist.xml        (widgets/menulist.xml)
-    content/global/bindings/notification.xml    (widgets/notification.xml)
-    content/global/bindings/numberbox.xml       (widgets/numberbox.xml)
-    content/global/bindings/popup.xml           (widgets/popup.xml)
-    content/global/bindings/radio.xml           (widgets/radio.xml)
-    content/global/bindings/richlistbox.xml     (widgets/richlistbox.xml)
-diff --git a/toolkit/content/widgets/dialog-kde.xml b/toolkit/content/widgets/dialog-kde.xml
-new file mode 100644
---- /dev/null
-+++ b/toolkit/content/widgets/dialog-kde.xml
-@@ -0,0 +1,477 @@
-+<?xml version="1.0"?>
-+<!-- This Source Code Form is subject to the terms of the Mozilla Public
-+   - License, v. 2.0. If a copy of the MPL was not distributed with this
-+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-+
-+<!DOCTYPE bindings [
-+  <!ENTITY % globalKeysDTD SYSTEM "chrome://global/locale/globalKeys.dtd">
-+  %globalKeysDTD;
-+]>
-+
-+<bindings id="dialogBindings"
-+          xmlns="http://www.mozilla.org/xbl"
-+          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-+          xmlns:xbl="http://www.mozilla.org/xbl">
-+
-+  <binding id="dialog">
-+    <content>
-+      <xul:vbox class="box-inherit dialog-content-box" flex="1">
-+        <children/>
-+      </xul:vbox>
-+
-+      <xul:hbox class="dialog-button-box" anonid="buttons"
-+                xbl:inherits="pack=buttonpack,align=buttonalign,dir=buttondir,orient=buttonorient"
-+#ifdef XP_UNIX_GNOME
-+                >
-+        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="help" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
-+        <xul:spacer anonid="spacer" flex="1"/>
-+        <xul:button dlgtype="cancel" class="dialog-button"/>
-+        <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
-+#elif XP_UNIX
-+                >
-+	<xul:button dlgtype="help" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
-+        <xul:spacer anonid="spacer" flex="1"/>
-+        <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
-+        <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="cancel" class="dialog-button"/>
-+        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
-+#else
-+                pack="end">
-+        <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/>
-+        <xul:spacer anonid="spacer" flex="1" hidden="true"/>
-+        <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/>
-+        <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="cancel" class="dialog-button"/>
-+        <xul:button dlgtype="help" class="dialog-button" hidden="true"/>
-+        <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/>
-+#endif
-+      </xul:hbox>
-+
-+    <xul:keyset>
-+      <xul:key phase="capturing" oncommand="document.documentElement.openHelp(event)"
-+#ifdef XP_MACOSX
-+           key="&openHelpMac.commandkey;" modifiers="accel"/>
-+#else
-+           keycode="&openHelp.commandkey;"/>
-+#endif
-+    </xul:keyset>
-+
-+    </content>
-+
-+    <implementation>
-+      <field name="_mStrBundle">null</field>
-+      <field name="_closeHandler">(function(event) {
-+        if (!document.documentElement.cancelDialog())
-+          event.preventDefault();
-+      })</field>
-+
-+      <property name="buttons"
-+                onget="return this.getAttribute('buttons');"
-+                onset="this._configureButtons(val); return val;"/>
-+
-+      <property name="defaultButton">
-+        <getter>
-+        <![CDATA[
-+          if (this.hasAttribute("defaultButton"))
-+            return this.getAttribute("defaultButton");
-+          return "accept"; // default to the accept button
-+        ]]>
-+        </getter>
-+        <setter>
-+        <![CDATA[
-+          this._setDefaultButton(val);
-+          return val;
-+        ]]>
-+        </setter>
-+      </property>
-+
-+      <method name="acceptDialog">
-+        <body>
-+        <![CDATA[
-+          return this._doButtonCommand("accept");
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="cancelDialog">
-+        <body>
-+        <![CDATA[
-+          return this._doButtonCommand("cancel");
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="getButton">
-+        <parameter name="aDlgType"/>
-+        <body>
-+        <![CDATA[
-+          return this._buttons[aDlgType];
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="moveToAlertPosition">
-+        <body>
-+        <![CDATA[
-+          // hack. we need this so the window has something like its final size
-+          if (window.outerWidth == 1) {
-+            dump("Trying to position a sizeless window; caller should have called sizeToContent() or sizeTo(). See bug 75649.\n");
-+            sizeToContent();
-+          }
-+
-+          if (opener) {
-+            var xOffset = (opener.outerWidth - window.outerWidth) / 2;
-+            var yOffset = opener.outerHeight / 5;
-+
-+            var newX = opener.screenX + xOffset;
-+            var newY = opener.screenY + yOffset;
-+          } else {
-+            newX = (screen.availWidth - window.outerWidth) / 2;
-+            newY = (screen.availHeight - window.outerHeight) / 2;
-+          }
-+
-+          // ensure the window is fully onscreen (if smaller than the screen)
-+          if (newX < screen.availLeft)
-+            newX = screen.availLeft + 20;
-+          if ((newX + window.outerWidth) > (screen.availLeft + screen.availWidth))
-+            newX = (screen.availLeft + screen.availWidth) - window.outerWidth - 20;
-+
-+          if (newY < screen.availTop)
-+            newY = screen.availTop + 20;
-+          if ((newY + window.outerHeight) > (screen.availTop + screen.availHeight))
-+            newY = (screen.availTop + screen.availHeight) - window.outerHeight - 60;
-+
-+          window.moveTo( newX, newY );
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="centerWindowOnScreen">
-+        <body>
-+        <![CDATA[
-+          var xOffset = screen.availWidth / 2 - window.outerWidth / 2;
-+          var yOffset = screen.availHeight / 2 - window.outerHeight / 2;
-+
-+          xOffset = xOffset > 0 ? xOffset : 0;
-+          yOffset = yOffset > 0 ? yOffset : 0;
-+          window.moveTo(xOffset, yOffset);
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <constructor>
-+      <![CDATA[
-+        this._configureButtons(this.buttons);
-+
-+        // listen for when window is closed via native close buttons
-+        window.addEventListener("close", this._closeHandler);
-+
-+        // for things that we need to initialize after onload fires
-+        window.addEventListener("load", this.postLoadInit);
-+
-+        window.moveToAlertPosition = this.moveToAlertPosition;
-+        window.centerWindowOnScreen = this.centerWindowOnScreen;
-+      ]]>
-+      </constructor>
-+
-+      <method name="postLoadInit">
-+        <parameter name="aEvent"/>
-+        <body>
-+        <![CDATA[
-+          function focusInit() {
-+            const dialog = document.documentElement;
-+            const defaultButton = dialog.getButton(dialog.defaultButton);
-+            // give focus to the first focusable element in the dialog
-+            if (!document.commandDispatcher.focusedElement) {
-+              document.commandDispatcher.advanceFocusIntoSubtree(dialog);
-+
-+              var focusedElt = document.commandDispatcher.focusedElement;
-+              if (focusedElt) {
-+                var initialFocusedElt = focusedElt;
-+                while (focusedElt.localName == "tab" ||
-+                       focusedElt.getAttribute("noinitialfocus") == "true") {
-+                  document.commandDispatcher.advanceFocusIntoSubtree(focusedElt);
-+                  focusedElt = document.commandDispatcher.focusedElement;
-+                  if (focusedElt == initialFocusedElt) {
-+                    if (focusedElt.getAttribute("noinitialfocus") == "true") {
-+                      focusedElt.blur();
-+                    }
-+                    break;
-+                  }
-+                }
-+
-+                if (initialFocusedElt.localName == "tab") {
-+                  if (focusedElt.hasAttribute("dlgtype")) {
-+                    // We don't want to focus on anonymous OK, Cancel, etc. buttons,
-+                    // so return focus to the tab itself
-+                    initialFocusedElt.focus();
-+                  }
-+                } else if (!/Mac/.test(navigator.platform) &&
-+                           focusedElt.hasAttribute("dlgtype") && focusedElt != defaultButton) {
-+                  defaultButton.focus();
-+                }
-+              }
-+            }
-+
-+            try {
-+              if (defaultButton)
-+                window.notifyDefaultButtonLoaded(defaultButton);
-+            } catch (e) { }
-+          }
-+
-+          // Give focus after onload completes, see bug 103197.
-+          setTimeout(focusInit, 0);
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="openHelp">
-+        <parameter name="event"/>
-+        <body>
-+        <![CDATA[
-+          var helpButton = document.documentElement.getButton("help");
-+          if (helpButton.disabled || helpButton.hidden)
-+            return;
-+          this._fireButtonEvent("help");
-+          event.stopPropagation();
-+          event.preventDefault();
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <property name="mStrBundle">
-+        <getter>
-+        <![CDATA[
-+          if (!this._mStrBundle) {
-+            // need to create string bundle manually instead of using <xul:stringbundle/>
-+            // see bug 63370 for details
-+            this._mStrBundle = Cc["@mozilla.org/intl/stringbundle;1"]
-+                                 .getService(Ci.nsIStringBundleService)
-+                                 .createBundle("chrome://global/locale/dialog.properties");
-+          }
-+          return this._mStrBundle;
-+        ]]></getter>
-+      </property>
-+
-+      <method name="_configureButtons">
-+        <parameter name="aButtons"/>
-+        <body>
-+        <![CDATA[
-+          // by default, get all the anonymous button elements
-+          var buttons = {};
-+          this._buttons = buttons;
-+          buttons.accept = document.getAnonymousElementByAttribute(this, "dlgtype", "accept");
-+          buttons.cancel = document.getAnonymousElementByAttribute(this, "dlgtype", "cancel");
-+          buttons.extra1 = document.getAnonymousElementByAttribute(this, "dlgtype", "extra1");
-+          buttons.extra2 = document.getAnonymousElementByAttribute(this, "dlgtype", "extra2");
-+          buttons.help = document.getAnonymousElementByAttribute(this, "dlgtype", "help");
-+          buttons.disclosure = document.getAnonymousElementByAttribute(this, "dlgtype", "disclosure");
-+
-+          // look for any overriding explicit button elements
-+          var exBtns = this.getElementsByAttribute("dlgtype", "*");
-+          var dlgtype;
-+          var i;
-+          for (i = 0; i < exBtns.length; ++i) {
-+            dlgtype = exBtns[i].getAttribute("dlgtype");
-+            buttons[dlgtype].hidden = true; // hide the anonymous button
-+            buttons[dlgtype] = exBtns[i];
-+          }
-+
-+          // add the label and oncommand handler to each button
-+          for (dlgtype in buttons) {
-+            var button = buttons[dlgtype];
-+            button.addEventListener("command", this._handleButtonCommand, true);
-+
-+            // don't override custom labels with pre-defined labels on explicit buttons
-+            if (!button.hasAttribute("label")) {
-+              // dialog attributes override the default labels in dialog.properties
-+              if (this.hasAttribute("buttonlabel" + dlgtype)) {
-+                button.setAttribute("label", this.getAttribute("buttonlabel" + dlgtype));
-+                if (this.hasAttribute("buttonaccesskey" + dlgtype))
-+                  button.setAttribute("accesskey", this.getAttribute("buttonaccesskey" + dlgtype));
-+              } else if (dlgtype != "extra1" && dlgtype != "extra2") {
-+                button.setAttribute("label", this.mStrBundle.GetStringFromName("button-" + dlgtype));
-+                var accessKey = this.mStrBundle.GetStringFromName("accesskey-" + dlgtype);
-+                if (accessKey)
-+                  button.setAttribute("accesskey", accessKey);
-+              } else if (this.hasAttribute("buttonid" + dlgtype)) {
-+                document.l10n.setAttributes(button, this.getAttribute("buttonid" + dlgtype));
-+              }
-+            }
-+            // allow specifying alternate icons in the dialog header
-+            if (!button.hasAttribute("icon")) {
-+              // if there's an icon specified, use that
-+              if (this.hasAttribute("buttonicon" + dlgtype))
-+                button.setAttribute("icon", this.getAttribute("buttonicon" + dlgtype));
-+              // otherwise set defaults
-+              else
-+                switch (dlgtype) {
-+                  case "accept":
-+                    button.setAttribute("icon", "accept");
-+                    break;
-+                  case "cancel":
-+                    button.setAttribute("icon", "cancel");
-+                    break;
-+                  case "disclosure":
-+                    button.setAttribute("icon", "properties");
-+                    break;
-+                  case "help":
-+                    button.setAttribute("icon", "help");
-+                    break;
-+                  default:
-+                    break;
-+                }
-+            }
-+          }
-+
-+          // ensure that hitting enter triggers the default button command
-+          this.defaultButton = this.defaultButton;
-+
-+          // if there is a special button configuration, use it
-+          if (aButtons) {
-+            // expect a comma delimited list of dlgtype values
-+            var list = aButtons.split(",");
-+
-+            // mark shown dlgtypes as true
-+            var shown = { accept: false, cancel: false, help: false,
-+                          disclosure: false, extra1: false, extra2: false };
-+            for (i = 0; i < list.length; ++i)
-+              shown[list[i].replace(/ /g, "")] = true;
-+
-+            // hide/show the buttons we want
-+            for (dlgtype in buttons)
-+              buttons[dlgtype].hidden = !shown[dlgtype];
-+
-+            // show the spacer on Windows only when the extra2 button is present
-+            if (/Win/.test(navigator.platform)) {
-+              var spacer = document.getAnonymousElementByAttribute(this, "anonid", "spacer");
-+              spacer.removeAttribute("hidden");
-+              spacer.setAttribute("flex", shown.extra2 ? "1" : "0");
-+            }
-+          }
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_setDefaultButton">
-+        <parameter name="aNewDefault"/>
-+        <body>
-+        <![CDATA[
-+          // remove the default attribute from the previous default button, if any
-+          var oldDefaultButton = this.getButton(this.defaultButton);
-+          if (oldDefaultButton)
-+            oldDefaultButton.removeAttribute("default");
-+
-+          var newDefaultButton = this.getButton(aNewDefault);
-+          if (newDefaultButton) {
-+            this.setAttribute("defaultButton", aNewDefault);
-+            newDefaultButton.setAttribute("default", "true");
-+          } else {
-+            this.setAttribute("defaultButton", "none");
-+            if (aNewDefault != "none")
-+              dump("invalid new default button: " + aNewDefault + ", assuming: none\n");
-+          }
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_handleButtonCommand">
-+        <parameter name="aEvent"/>
-+        <body>
-+        <![CDATA[
-+          return document.documentElement._doButtonCommand(
-+                                        aEvent.target.getAttribute("dlgtype"));
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_doButtonCommand">
-+        <parameter name="aDlgType"/>
-+        <body>
-+        <![CDATA[
-+          var button = this.getButton(aDlgType);
-+          if (!button.disabled) {
-+            var noCancel = this._fireButtonEvent(aDlgType);
-+            if (noCancel) {
-+              if (aDlgType == "accept" || aDlgType == "cancel") {
-+                var closingEvent = new CustomEvent("dialogclosing", {
-+                  bubbles: true,
-+                  detail: { button: aDlgType },
-+                });
-+                this.dispatchEvent(closingEvent);
-+                window.close();
-+              }
-+            }
-+            return noCancel;
-+          }
-+          return true;
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_fireButtonEvent">
-+        <parameter name="aDlgType"/>
-+        <body>
-+        <![CDATA[
-+          var event = document.createEvent("Events");
-+          event.initEvent("dialog" + aDlgType, true, true);
-+
-+          // handle dom event handlers
-+          var noCancel = this.dispatchEvent(event);
-+
-+          // handle any xml attribute event handlers
-+          var handler = this.getAttribute("ondialog" + aDlgType);
-+          if (handler != "") {
-+            var fn = new Function("event", handler);
-+            var returned = fn(event);
-+            // eslint-disable-next-line mozilla/no-compare-against-boolean-literals
-+            if (returned == false)
-+              noCancel = false;
-+          }
-+
-+          return noCancel;
-+        ]]>
-+        </body>
-+      </method>
-+
-+      <method name="_hitEnter">
-+        <parameter name="evt"/>
-+        <body>
-+        <![CDATA[
-+          if (evt.defaultPrevented)
-+            return;
-+
-+          var btn = this.getButton(this.defaultButton);
-+          if (btn)
-+            this._doButtonCommand(this.defaultButton);
-+        ]]>
-+        </body>
-+      </method>
-+
-+    </implementation>
-+
-+    <handlers>
-+      <handler event="keypress" keycode="VK_RETURN"
-+               group="system" action="this._hitEnter(event);"/>
-+      <handler event="keypress" keycode="VK_ESCAPE" group="system">
-+        if (!event.defaultPrevented)
-+          this.cancelDialog();
-+      </handler>
-+#ifdef XP_MACOSX
-+      <handler event="keypress" key="." modifiers="meta" phase="capturing" action="this.cancelDialog();"/>
-+#else
-+      <handler event="focus" phase="capturing">
-+        var btn = this.getButton(this.defaultButton);
-+        if (btn)
-+          btn.setAttribute("default", event.originalTarget == btn || !(event.originalTarget instanceof Ci.nsIDOMXULButtonElement));
-+      </handler>
-+#endif
-+    </handlers>
-+
-+  </binding>
-+
-+</bindings>
-diff --git a/toolkit/mozapps/downloads/nsHelperAppDlg.js b/toolkit/mozapps/downloads/nsHelperAppDlg.js
---- a/toolkit/mozapps/downloads/nsHelperAppDlg.js
-+++ b/toolkit/mozapps/downloads/nsHelperAppDlg.js
-@@ -1030,30 +1030,60 @@ nsUnknownContentTypeDialog.prototype = {
- 
-       if (params.handlerApp &&
-           params.handlerApp.executable &&
-           params.handlerApp.executable.isFile()) {
+diff --git a/toolkit/mozapps/downloads/HelperAppDlg.jsm b/toolkit/mozapps/downloads/HelperAppDlg.jsm
+--- a/toolkit/mozapps/downloads/HelperAppDlg.jsm
++++ b/toolkit/mozapps/downloads/HelperAppDlg.jsm
+@@ -1199,36 +1199,66 @@ nsUnknownContentTypeDialog.prototype = {
+         params.handlerApp &&
+         params.handlerApp.executable &&
+         params.handlerApp.executable.isFile()
+       ) {
          // Remember the file they chose to run.
          this.chosenApp = params.handlerApp;
        }
      } else if ("@mozilla.org/applicationchooser;1" in Cc) {
 -      var nsIApplicationChooser = Ci.nsIApplicationChooser;
--      var appChooser = Cc["@mozilla.org/applicationchooser;1"]
--                         .createInstance(nsIApplicationChooser);
--      appChooser.init(this.mDialog, this.dialogElement("strings").getString("chooseAppFilePickerTitle"));
+-      var appChooser = Cc["@mozilla.org/applicationchooser;1"].createInstance(
+-        nsIApplicationChooser
+-      );
+-      appChooser.init(
+-        this.mDialog,
+-        this.dialogElement("strings").getString("chooseAppFilePickerTitle")
+-      );
 -      var contentTypeDialogObj = this;
 -      let appChooserCallback = function appChooserCallback_done(aResult) {
 -        if (aResult) {
--           contentTypeDialogObj.chosenApp = aResult.QueryInterface(Ci.nsILocalHandlerApp);
+-          contentTypeDialogObj.chosenApp = aResult.QueryInterface(
+-            Ci.nsILocalHandlerApp
+-          );
 -        }
 -        contentTypeDialogObj.finishChooseApp();
 -      };
@@ -728,13 +234,19 @@
 +        });
 +      } else {
 +        var nsIApplicationChooser = Ci.nsIApplicationChooser;
-+        var appChooser = Cc["@mozilla.org/applicationchooser;1"]
-+                           .createInstance(nsIApplicationChooser);
-+        appChooser.init(this.mDialog, this.dialogElement("strings").getString("chooseAppFilePickerTitle"));
++        var appChooser = Cc["@mozilla.org/applicationchooser;1"].createInstance(
++          nsIApplicationChooser
++        );
++        appChooser.init(
++          this.mDialog,
++          this.dialogElement("strings").getString("chooseAppFilePickerTitle")
++        );
 +        var contentTypeDialogObj = this;
 +        let appChooserCallback = function appChooserCallback_done(aResult) {
 +          if (aResult) {
-+             contentTypeDialogObj.chosenApp = aResult.QueryInterface(Ci.nsILocalHandlerApp);
++            contentTypeDialogObj.chosenApp = aResult.QueryInterface(
++              Ci.nsILocalHandlerApp
++            );
 +          }
 +          contentTypeDialogObj.finishChooseApp();
 +        };
@@ -744,16 +256,16 @@
 +      }
      } else {
        var nsIFilePicker = Ci.nsIFilePicker;
-       var fp = Cc["@mozilla.org/filepicker;1"]
-                  .createInstance(nsIFilePicker);
-       fp.init(this.mDialog,
-               this.dialogElement("strings").getString("chooseAppFilePickerTitle"),
-               nsIFilePicker.modeOpen);
- 
+       var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
+       fp.init(
+         this.mDialog,
+         this.dialogElement("strings").getString("chooseAppFilePickerTitle"),
+         nsIFilePicker.modeOpen
+       );
 diff --git a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
 --- a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
 +++ b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
-@@ -15,16 +15,17 @@
+@@ -14,16 +14,17 @@
  #include "nsPrintfCString.h"
  #include "nsNetCID.h"
  #include "nsNetUtil.h"
@@ -764,17 +276,17 @@
  #include "nsIURI.h"
 +#include "nsKDEUtils.h"
  
+ using namespace mozilla;
+ 
  class nsUnixSystemProxySettings final : public nsISystemProxySettings {
   public:
    NS_DECL_ISUPPORTS
    NS_DECL_NSISYSTEMPROXYSETTINGS
  
-   nsUnixSystemProxySettings() : mSchemeProxySettings(4) {}
-   nsresult Init();
-@@ -42,16 +43,18 @@ class nsUnixSystemProxySettings final : 
-                                    nsACString& aResult);
-   nsresult GetProxyFromGConf(const nsACString& aScheme, const nsACString& aHost,
-                              int32_t aPort, nsACString& aResult);
+@@ -37,16 +38,18 @@ class nsUnixSystemProxySettings final : 
+   nsCOMPtr<nsIGSettingsCollection> mProxySettings;
+   nsInterfaceHashtable<nsCStringHashKey, nsIGSettingsCollection>
+       mSchemeProxySettings;
    nsresult GetProxyFromGSettings(const nsACString& aScheme,
                                   const nsACString& aHost, int32_t aPort,
                                   nsACString& aResult);
@@ -790,7 +302,7 @@
  nsUnixSystemProxySettings::GetMainThreadOnly(bool* aMainThreadOnly) {
    // dbus prevents us from being threadsafe, but this routine should not block
    // anyhow
-@@ -488,16 +491,19 @@ nsresult nsUnixSystemProxySettings::GetP
+@@ -381,21 +384,50 @@ nsresult nsUnixSystemProxySettings::GetP
    return NS_OK;
  }
  
@@ -806,20 +318,10 @@
      nsresult rv = GetProxyFromGSettings(aScheme, aHost, aPort, aResult);
      if (NS_SUCCEEDED(rv)) return rv;
    }
-   if (mGConf) return GetProxyFromGConf(aScheme, aHost, aPort, aResult);
  
    return GetProxyFromEnvironment(aScheme, aHost, aPort, aResult);
  }
-@@ -521,8 +527,34 @@ static const mozilla::Module::CIDEntry k
- static const mozilla::Module::ContractIDEntry kUnixProxyContracts[] = {
-     {NS_SYSTEMPROXYSETTINGS_CONTRACTID, &kNS_UNIXSYSTEMPROXYSERVICE_CID},
-     {nullptr}};
  
- static const mozilla::Module kUnixProxyModule = {
-     mozilla::Module::kVersion, kUnixProxyCIDs, kUnixProxyContracts};
- 
- NSMODULE_DEFN(nsUnixProxyModule) = &kUnixProxyModule;
-+
 +nsresult
 +nsUnixSystemProxySettings::GetProxyFromKDE(const nsACString& aScheme,
 +                                           const nsACString& aHost,
@@ -845,10 +347,16 @@
 +  return NS_OK;
 +}
 +
++
+ NS_IMPL_COMPONENT_FACTORY(nsUnixSystemProxySettings) {
+   auto result = MakeRefPtr<nsUnixSystemProxySettings>();
+   result->Init();
+   return result.forget().downcast<nsISupports>();
+ }
 diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build
 --- a/toolkit/xre/moz.build
 +++ b/toolkit/xre/moz.build
-@@ -73,17 +73,19 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'co
+@@ -85,17 +85,19 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'co
          '../components/printingui',
      ]
  elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'uikit':
@@ -856,7 +364,7 @@
          'nsNativeAppSupportDefault.cpp',
          'UIKitDirProvider.mm',
      ]
- elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
+ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk':
 +    EXPORTS += ['nsKDEUtils.h']
      UNIFIED_SOURCES += [
 +        'nsKDEUtils.cpp',
@@ -867,7 +375,7 @@
          'nsNativeAppSupportDefault.cpp',
      ]
  
- if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk3':
+ if CONFIG['MOZ_HAS_REMOTE']:
 diff --git a/toolkit/xre/nsKDEUtils.cpp b/toolkit/xre/nsKDEUtils.cpp
 new file mode 100644
 --- /dev/null
@@ -916,7 +424,7 @@
 +    Display* dpy = XOpenDisplay( NULL );
 +    if( dpy == NULL )
 +        return false;
-+    Atom kde_full_session = XInternAtom( dpy, "KDE_FULL_SESSION", True );
++    Atom kde_full_session = XInternAtom( dpy, "KDE_FULL_SESSION", true );
 +    bool kde = false;
 +    if( kde_full_session != None )
 +        {
@@ -1273,7 +781,8 @@
 diff --git a/uriloader/exthandler/HandlerServiceParent.cpp b/uriloader/exthandler/HandlerServiceParent.cpp
 --- a/uriloader/exthandler/HandlerServiceParent.cpp
 +++ b/uriloader/exthandler/HandlerServiceParent.cpp
-@@ -1,16 +1,16 @@
+@@ -7,17 +7,17 @@
+ #include "mozilla/ipc/ProtocolUtils.h"
  #include "mozilla/Logging.h"
  #include "HandlerServiceParent.h"
  #include "nsIHandlerService.h"
@@ -1281,8 +790,8 @@
  #include "ContentHandlerService.h"
  #include "nsStringEnumerator.h"
  #ifdef MOZ_WIDGET_GTK
--#include "unix/nsGNOMERegistry.h"
-+#include "unix/nsCommonRegistry.h"
+-#  include "unix/nsGNOMERegistry.h"
++#  include "unix/nsCommonRegistry.h"
  #endif
  
  using mozilla::dom::ContentHandlerService;
@@ -1291,13 +800,13 @@
  using mozilla::dom::RemoteHandlerApp;
  
  namespace {
-@@ -246,17 +246,17 @@ mozilla::ipc::IPCResult HandlerServicePa
-   handlerSvc->Exists(info, exists);
-   return IPC_OK();
- }
- 
- mozilla::ipc::IPCResult HandlerServiceParent::RecvExistsForProtocol(
+@@ -288,17 +288,17 @@ mozilla::ipc::IPCResult HandlerServicePa
+ mozilla::ipc::IPCResult HandlerServiceParent::RecvExistsForProtocolOS(
      const nsCString& aProtocolScheme, bool* aHandlerExists) {
+   if (aProtocolScheme.Length() > MAX_SCHEME_LENGTH) {
+     *aHandlerExists = false;
+     return IPC_OK();
+   }
  #ifdef MOZ_WIDGET_GTK
    // Check the GNOME registry for a protocol handler
 -  *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme.get());
@@ -1308,19 +817,38 @@
    return IPC_OK();
  }
  
- mozilla::ipc::IPCResult HandlerServiceParent::RecvGetTypeFromExtension(
-     const nsCString& aFileExtension, nsCString* type) {
+ /*
+  * Check if a handler exists for the provided protocol. Check the datastore
+@@ -317,17 +317,17 @@ mozilla::ipc::IPCResult HandlerServicePa
+   nsCOMPtr<nsIExternalProtocolService> protoSvc =
+       do_GetService(NS_EXTERNALPROTOCOLSERVICE_CONTRACTID, &rv);
+   if (NS_WARN_IF(NS_FAILED(rv))) {
+     *aHandlerExists = false;
+     return IPC_OK();
+   }
+   rv = protoSvc->ExternalProtocolHandlerExists(aProtocolScheme.get(),
+                                                aHandlerExists);
+-
++##
+   if (NS_WARN_IF(NS_FAILED(rv))) {
+     *aHandlerExists = false;
+   }
+ #else
+   MOZ_RELEASE_ASSERT(false, "No implementation on this platform.");
+   *aHandlerExists = false;
+ #endif
+   return IPC_OK();
 diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
 --- a/uriloader/exthandler/moz.build
 +++ b/uriloader/exthandler/moz.build
-@@ -76,17 +76,19 @@ else:
+@@ -83,17 +83,19 @@ else:
      SOURCES += [
          osdir + '/nsOSHelperAppService.cpp',
      ]
      if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
          CXXFLAGS += ['-Wno-error=shadow']
  
- if 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
+ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk':
      UNIFIED_SOURCES += [
 +        'unix/nsCommonRegistry.cpp',
          'unix/nsGNOMERegistry.cpp',
@@ -1333,7 +861,7 @@
          'android/nsExternalURLHandlerService.cpp',
          'android/nsMIMEInfoAndroid.cpp',
      ]
-@@ -120,16 +122,17 @@ include('/ipc/chromium/chromium-config.m
+@@ -133,16 +135,17 @@ include('/ipc/chromium/chromium-config.m
  FINAL_LIBRARY = 'xul'
  
  LOCAL_INCLUDES += [
@@ -1349,7 +877,7 @@
      CXXFLAGS += CONFIG['TK_CFLAGS']
      CXXFLAGS += CONFIG['MOZ_DBUS_CFLAGS']
  
- if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk3':
+ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk':
      CXXFLAGS += CONFIG['TK_CFLAGS']
 diff --git a/uriloader/exthandler/unix/nsCommonRegistry.cpp b/uriloader/exthandler/unix/nsCommonRegistry.cpp
 new file mode 100644
@@ -1591,19 +1119,19 @@
  #include "nsIIOService.h"
  #include "nsAutoPtr.h"
  #ifdef MOZ_ENABLE_DBUS
- #include "nsDBusHandlerApp.h"
+ #  include "nsDBusHandlerApp.h"
  #endif
 +#if defined(XP_UNIX) && !defined(XP_MACOSX)
 +#include "nsKDEUtils.h"
 +#endif
  
- nsresult nsMIMEInfoUnix::LoadUriInternal(nsIURI *aURI) {
+ nsresult nsMIMEInfoUnix::LoadUriInternal(nsIURI* aURI) {
 -  return nsGNOMERegistry::LoadURL(aURI);
 +  return nsCommonRegistry::LoadURL(aURI);
  }
  
  NS_IMETHODIMP
- nsMIMEInfoUnix::GetHasDefaultHandler(bool *_retval) {
+ nsMIMEInfoUnix::GetHasDefaultHandler(bool* _retval) {
    // if mDefaultApplication is set, it means the application has been set from
    // either /etc/mailcap or ${HOME}/.mailcap, in which case we don't want to
    // give the GNOME answer.
@@ -1678,8 +1206,8 @@
  #include "nsOSHelperAppService.h"
  #include "nsMIMEInfoUnix.h"
  #ifdef MOZ_WIDGET_GTK
--#include "nsGNOMERegistry.h"
-+#include "nsCommonRegistry.h"
+-#  include "nsGNOMERegistry.h"
++#  include "nsCommonRegistry.h"
  #endif
  #include "nsISupports.h"
  #include "nsString.h"
@@ -1688,7 +1216,7 @@
  #include "nsIURL.h"
  #include "nsIFileStreams.h"
  #include "nsILineInputStream.h"
-@@ -1031,17 +1031,17 @@ nsresult nsOSHelperAppService::GetHandle
+@@ -1025,17 +1025,17 @@ nsresult nsOSHelperAppService::GetHandle
  
  nsresult nsOSHelperAppService::OSProtocolHandlerExists(
      const char* aProtocolScheme, bool* aHandlerExists) {
@@ -1707,7 +1235,7 @@
      nsCOMPtr<nsIHandlerService> handlerSvc =
          do_GetService(NS_HANDLERSERVICE_CONTRACTID, &rv);
      if (NS_SUCCEEDED(rv) && handlerSvc) {
-@@ -1051,17 +1051,17 @@ nsresult nsOSHelperAppService::OSProtoco
+@@ -1045,17 +1045,17 @@ nsresult nsOSHelperAppService::OSProtoco
    }
  
    return rv;
@@ -1726,7 +1254,7 @@
  
  nsresult nsOSHelperAppService::GetFileTokenForPath(
      const char16_t* platformAppPath, nsIFile** aFile) {
-@@ -1142,17 +1142,17 @@ already_AddRefed<nsMIMEInfoBase> nsOSHel
+@@ -1136,17 +1136,17 @@ already_AddRefed<nsMIMEInfoBase> nsOSHel
    nsresult rv =
        LookUpTypeAndDescription(NS_ConvertUTF8toUTF16(aFileExt), majorType,
                                 minorType, mime_types_description, true);
@@ -1745,7 +1273,7 @@
  
      rv = LookUpTypeAndDescription(NS_ConvertUTF8toUTF16(aFileExt), majorType,
                                    minorType, mime_types_description, false);
-@@ -1254,17 +1254,17 @@ already_AddRefed<nsMIMEInfoBase> nsOSHel
+@@ -1248,17 +1248,17 @@ already_AddRefed<nsMIMEInfoBase> nsOSHel
  
    // Now look up our extensions
    nsAutoString extensions, mime_types_description;
@@ -1767,7 +1295,7 @@
 diff --git a/widget/gtk/moz.build b/widget/gtk/moz.build
 --- a/widget/gtk/moz.build
 +++ b/widget/gtk/moz.build
-@@ -116,16 +116,17 @@ include('/ipc/chromium/chromium-config.m
+@@ -126,16 +126,17 @@ include('/ipc/chromium/chromium-config.m
  
  FINAL_LIBRARY = 'xul'
  
@@ -1788,7 +1316,7 @@
 diff --git a/widget/gtk/nsFilePicker.cpp b/widget/gtk/nsFilePicker.cpp
 --- a/widget/gtk/nsFilePicker.cpp
 +++ b/widget/gtk/nsFilePicker.cpp
-@@ -4,32 +4,34 @@
+@@ -4,16 +4,17 @@
   * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  
  #include "mozilla/Types.h"
@@ -1801,11 +1329,12 @@
  
  #include "nsGtkUtils.h"
  #include "nsIFileURL.h"
+ #include "nsIGIOService.h"
  #include "nsIURI.h"
  #include "nsIWidget.h"
  #include "nsIFile.h"
  #include "nsIStringBundle.h"
- 
+@@ -21,16 +22,17 @@
  #include "nsArrayEnumerator.h"
  #include "nsMemory.h"
  #include "nsEnumeratorUtils.h"
@@ -1822,14 +1351,14 @@
  // bug 1184009
  #define MAX_PREVIEW_SOURCE_SIZE 4096
  
- nsIFile *nsFilePicker::mPrevDisplayDirectory = nullptr;
-@@ -227,17 +229,19 @@ nsFilePicker::AppendFilters(int32_t aFil
+ nsIFile* nsFilePicker::mPrevDisplayDirectory = nullptr;
+@@ -228,17 +230,19 @@ nsFilePicker::AppendFilters(int32_t aFil
    mAllowURLs = !!(aFilterMask & filterAllowURLs);
    return nsBaseFilePicker::AppendFilters(aFilterMask);
  }
  
  NS_IMETHODIMP
- nsFilePicker::AppendFilter(const nsAString &aTitle, const nsAString &aFilter) {
+ nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter) {
    if (aFilter.EqualsLiteral("..apps")) {
      // No platform specific thing we can do here, really....
 -    return NS_OK;
@@ -1844,12 +1373,12 @@
  
    mFilters.AppendElement(filter);
    mFilterNames.AppendElement(name);
-@@ -337,16 +341,39 @@ nsresult nsFilePicker::Show(int16_t *aRe
+@@ -338,16 +342,39 @@ nsresult nsFilePicker::Show(int16_t* aRe
    return NS_OK;
  }
  
  NS_IMETHODIMP
- nsFilePicker::Open(nsIFilePickerShownCallback *aCallback) {
+ nsFilePicker::Open(nsIFilePickerShownCallback* aCallback) {
    // Can't show two dialogs concurrently with the same filepicker
    if (mRunning) return NS_ERROR_NOT_AVAILABLE;
  
@@ -1879,12 +1408,12 @@
    nsCString title;
    title.Adopt(ToNewUTF8String(mTitle));
  
-   GtkWindow *parent_widget =
+   GtkWindow* parent_widget =
        GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET));
  
    GtkFileChooserAction action = GetGtkFileChooserAction(mMode);
  
-@@ -571,16 +598,240 @@ void nsFilePicker::Done(void *file_choos
+@@ -573,16 +600,240 @@ void nsFilePicker::Done(void* file_choos
      mCallback->Done(result);
      mCallback = nullptr;
    } else {
@@ -2118,13 +1647,13 @@
 +    }
 +
  // All below functions available as of GTK 3.20+
- void *nsFilePicker::GtkFileChooserNew(const gchar *title, GtkWindow *parent,
+ void* nsFilePicker::GtkFileChooserNew(const gchar* title, GtkWindow* parent,
                                        GtkFileChooserAction action,
-                                       const gchar *accept_label) {
+                                       const gchar* accept_label) {
    static auto sGtkFileChooserNativeNewPtr =
-       (void *(*)(const gchar *, GtkWindow *, GtkFileChooserAction,
-                  const gchar *,
-                  const gchar *))dlsym(RTLD_DEFAULT,
+       (void* (*)(const gchar*, GtkWindow*, GtkFileChooserAction, const gchar*,
+                  const gchar*))dlsym(RTLD_DEFAULT,
+                                      "gtk_file_chooser_native_new");
 diff --git a/widget/gtk/nsFilePicker.h b/widget/gtk/nsFilePicker.h
 --- a/widget/gtk/nsFilePicker.h
 +++ b/widget/gtk/nsFilePicker.h
@@ -2135,7 +1664,7 @@
    nsTArray<nsCString> mFilterNames;
  
   private:
-   static nsIFile *mPrevDisplayDirectory;
+   static nsIFile* mPrevDisplayDirectory;
  
 +  bool kdeRunning();
 +  bool getKdeRunning();
@@ -2143,12 +1672,12 @@
 +  NS_IMETHODIMP kdeAppsDialog(PRInt16 *aReturn);
 +  nsCString kdeMakeFilter( int index );
 +
-   void *GtkFileChooserNew(const gchar *title, GtkWindow *parent,
+   void* GtkFileChooserNew(const gchar* title, GtkWindow* parent,
                            GtkFileChooserAction action,
-                           const gchar *accept_label);
-   void GtkFileChooserShow(void *file_chooser);
-   void GtkFileChooserDestroy(void *file_chooser);
-   void GtkFileChooserSetModal(void *file_chooser, GtkWindow *parent_widget,
+                           const gchar* accept_label);
+   void GtkFileChooserShow(void* file_chooser);
+   void GtkFileChooserDestroy(void* file_chooser);
+   void GtkFileChooserSetModal(void* file_chooser, GtkWindow* parent_widget,
                                gboolean modal);
  
 diff --git a/xpcom/components/ManifestParser.cpp b/xpcom/components/ManifestParser.cpp
@@ -2172,7 +1701,7 @@
    int argc;
  
    bool ischrome;
-@@ -392,16 +393,17 @@ void ParseManifest(NSLocationType aType,
+@@ -393,16 +394,17 @@ void ParseManifest(NSLocationType aType,
    NS_NAMED_LITERAL_STRING(kRemoteEnabled, "remoteenabled");
    NS_NAMED_LITERAL_STRING(kRemoteRequired, "remoterequired");
    NS_NAMED_LITERAL_STRING(kApplication, "application");
@@ -2190,7 +1719,7 @@
    NS_NAMED_LITERAL_STRING(kMain, "main");
    NS_NAMED_LITERAL_STRING(kContent, "content");
  
-@@ -447,39 +449,44 @@ void ParseManifest(NSLocationType aType,
+@@ -448,39 +450,44 @@ void ParseManifest(NSLocationType aType,
          CopyUTF8toUTF16(s, abi);
          abi.Insert(char16_t('_'), 0);
          abi.Insert(osTarget, 0);
@@ -2201,15 +1730,15 @@
    nsAutoString osVersion;
 +  nsAutoString desktop;
  #if defined(XP_WIN)
- #pragma warning(push)
- #pragma warning(disable : 4996)  // VC12+ deprecates GetVersionEx
+ #  pragma warning(push)
+ #  pragma warning(disable : 4996)  // VC12+ deprecates GetVersionEx
    OSVERSIONINFO info = {sizeof(OSVERSIONINFO)};
    if (GetVersionEx(&info)) {
      nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", info.dwMajorVersion,
                                info.dwMinorVersion);
    }
 +  desktop = NS_LITERAL_STRING("win");
- #pragma warning(pop)
+ #  pragma warning(pop)
  #elif defined(MOZ_WIDGET_COCOA)
    SInt32 majorVersion = nsCocoaFeatures::OSXVersionMajor();
    SInt32 minorVersion = nsCocoaFeatures::OSXVersionMinor();
@@ -2235,7 +1764,7 @@
      process = kMain;
    }
  
-@@ -566,25 +573,27 @@ void ParseManifest(NSLocationType aType,
+@@ -567,25 +574,27 @@ void ParseManifest(NSLocationType aType,
      TriState stOsVersion = eUnspecified;
      TriState stOs = eUnspecified;
      TriState stABI = eUnspecified;
@@ -2263,7 +1792,7 @@
          continue;
        }
  
-@@ -621,17 +630,17 @@ void ParseManifest(NSLocationType aType,
+@@ -622,17 +631,17 @@ void ParseManifest(NSLocationType aType,
        }
  
        LogMessageWithContext(
@@ -2285,7 +1814,7 @@
 diff --git a/xpcom/components/moz.build b/xpcom/components/moz.build
 --- a/xpcom/components/moz.build
 +++ b/xpcom/components/moz.build
-@@ -44,12 +44,13 @@ LOCAL_INCLUDES += [
+@@ -66,16 +66,17 @@ LOCAL_INCLUDES += [
      '!..',
      '../base',
      '../build',
@@ -2297,8 +1826,12 @@
 +    '/toolkit/xre',
  ]
  
- if 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
+ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk':
      CXXFLAGS += CONFIG['TK_CFLAGS']
+ 
+ if CONFIG['MOZ_LAYOUT_DEBUGGER']:
+     DEFINES['MOZ_LAYOUT_DEBUGGER'] = True
+ 
 diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
 --- a/xpcom/io/nsLocalFileUnix.cpp
 +++ b/xpcom/io/nsLocalFileUnix.cpp
@@ -2310,15 +1843,15 @@
  #include "prlink.h"
  
  #ifdef MOZ_WIDGET_GTK
- #include "nsIGIOService.h"
-+#include "nsKDEUtils.h"
+ #  include "nsIGIOService.h"
++#  include "nsKDEUtils.h"
  #endif
  
  #ifdef MOZ_WIDGET_COCOA
- #include <Carbon/Carbon.h>
- #include "CocoaFileUtils.h"
- #include "prmem.h"
- #include "plbase64.h"
+ #  include <Carbon/Carbon.h>
+ #  include "CocoaFileUtils.h"
+ #  include "prmem.h"
+ #  include "plbase64.h"
  
 @@ -1902,62 +1903,77 @@ nsLocalFile::SetPersistentDescriptor(con
  
--- a/mozilla-no-stdcxx-check.patch	Sun Mar 17 10:00:10 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# HG changeset patch
-# User Wolfgang Rosenauer <wr@rosenauer.org>
-# Parent  f62746698c37af9593338fe75fbff6b319cd370c
-
-diff --git a/config/config.mk b/config/config.mk
---- a/config/config.mk
-+++ b/config/config.mk
-@@ -471,17 +471,16 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),android)
- # of the linker command line), if libmozglue.so ends up after libc.so, all
- # hell breaks loose, so better safe than sorry, and check it's actually the
- # case.
- CHECK_MOZGLUE_ORDER = @$(TOOLCHAIN_PREFIX)readelf -d $(1) | grep NEEDED | awk '{ libs[$$NF] = ++n } END { if (libs["[libmozglue.so]"] && libs["[libc.so]"] < libs["[libmozglue.so]"]) { print "libmozglue.so must be linked before libc.so"; exit 1 } }'
- endif
- 
- define CHECK_BINARY
- $(call CHECK_GLIBC,$(1))
--$(call CHECK_STDCXX,$(1))
- $(call CHECK_TEXTREL,$(1))
- $(call LOCAL_CHECKS,$(1))
- $(call CHECK_MOZGLUE_ORDER,$(1))
- endef
- 
- # autoconf.mk sets OBJ_SUFFIX to an error to avoid use before including
- # this file
- OBJ_SUFFIX := $(_OBJ_SUFFIX)
--- a/mozilla-nongnome-proxies.patch	Sun Mar 17 10:00:10 2019 +0100
+++ b/mozilla-nongnome-proxies.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -1,47 +1,35 @@
-From: Wolfgang Rosenauer
-Subject: Do not use gconf for proxy settings if not running within Gnome
-
+# HG changeset patch
+# User Wolfgang Rosenauer
+# Date 1558442915 -7200
+#      Tue May 21 14:48:35 2019 +0200
+# Node ID 6bcf2dfebc1ea2aa34e5cc61152709fc8e409dc5
+# Parent  4c434d19d03d5461e54fa22dfb82eaed4cd6631b
+Do not use gconf for proxy settings if not running within Gnome
 Index: toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
 ===================================================================
 RCS file: /cvsroot/mozilla/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp,v
 retrieving revision 1.1
 
-diff --git a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
---- a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
-+++ b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
-@@ -55,24 +55,27 @@ NS_IMETHODIMP
- nsUnixSystemProxySettings::GetMainThreadOnly(bool* aMainThreadOnly) {
-   // dbus prevents us from being threadsafe, but this routine should not block
-   // anyhow
-   *aMainThreadOnly = true;
-   return NS_OK;
+diff -r 4c434d19d03d -r 6bcf2dfebc1e toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
+--- a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp	Wed Jun 12 17:43:18 2019 +0000
++++ b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp	Tue May 21 14:48:35 2019 +0200
+@@ -55,11 +55,14 @@
  }
  
- nsresult nsUnixSystemProxySettings::Init() {
+ void nsUnixSystemProxySettings::Init() {
 -  mGSettings = do_GetService(NS_GSETTINGSSERVICE_CONTRACTID);
 -  if (mGSettings) {
 -    mGSettings->GetCollectionForSchema(
 -        NS_LITERAL_CSTRING("org.gnome.system.proxy"),
 -        getter_AddRefs(mProxySettings));
--  }
--  if (!mProxySettings) {
--    mGConf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
-+  // only use GSettings if that is a GNOME session
 +  const char* sessionType = PR_GetEnv("DESKTOP_SESSION");
 +  if (sessionType && !strcmp(sessionType, "gnome")) {
 +    mGSettings = do_GetService(NS_GSETTINGSSERVICE_CONTRACTID);
 +    if (mGSettings) {
-+      mGSettings->GetCollectionForSchema(NS_LITERAL_CSTRING("org.gnome.system.proxy"),
-+                                         getter_AddRefs(mProxySettings));
-+    }
-+    if (!mProxySettings) {
-+      mGConf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
++      mGSettings->GetCollectionForSchema(
++          NS_LITERAL_CSTRING("org.gnome.system.proxy"),
++          getter_AddRefs(mProxySettings));
 +    }
    }
- 
-   return NS_OK;
  }
  
- bool nsUnixSystemProxySettings::IsProxyMode(const char* aMode) {
-   nsAutoCString mode;
-   return NS_SUCCEEDED(mGConf->GetString(
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-ppc-altivec_static_inline.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,30 @@
+# HG changeset patch
+# User msirringhaus@suse.de
+# Date 1558452418 -7200
+#      Tue May 21 17:26:58 2019 +0200
+# Node ID 6cd963b6c82ea6629aaf4050851789b78f310338
+# Parent  010a35335b4e45e222b9efdbda24fd1963202ecf
+imported patch mozilla-ppc-altivec_static_inline.patch
+
+diff --git a/gfx/qcms/transform-altivec.cpp b/gfx/qcms/transform-altivec.cpp
+--- a/gfx/qcms/transform-altivec.cpp
++++ b/gfx/qcms/transform-altivec.cpp
+@@ -25,17 +25,17 @@
+ 
+ #include "qcmsint.h"
+ 
+ #define FLOATSCALE (float)(PRECACHE_OUTPUT_SIZE)
+ #define CLAMPMAXVAL (((float) (PRECACHE_OUTPUT_SIZE - 1)) / PRECACHE_OUTPUT_SIZE)
+ static const ALIGN float floatScaleX4 = FLOATSCALE;
+ static const ALIGN float clampMaxValueX4 = CLAMPMAXVAL;
+ 
+-inline vector float load_aligned_float(float *dataPtr)
++static inline vector float load_aligned_float(float *dataPtr)
+ {
+ 	vector float data = vec_lde(0, dataPtr);
+ 	vector unsigned char moveToStart = vec_lvsl(0, dataPtr);
+ 	return vec_perm(data, data, moveToStart);
+ }
+ 
+ template <size_t kRIndex, size_t kGIndex, size_t kBIndex, size_t kAIndex = NO_A_INDEX>
+ static void qcms_transform_data_template_lut_altivec(const qcms_transform *transform,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-reduce-rust-debuginfo.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,54 @@
+# HG changeset patch
+# User msirringhaus@suse.de
+# Date 1560754926 -7200
+#      Mon Jun 17 09:02:06 2019 +0200
+# Node ID 428161c3b9599083e1b8710eda1760f1f707ab11
+# Parent  fa1cf8b9cb4efdf89fe19e543fb54272b726a353
+#Description: reduce the rust debuginfo level on selected architectures where
+# compiling with debuginfo=2 causes the OOM killer to interrupt the build on
+# launchpad builders. Initially this was only on 32 bit architectures, but with
+# firefox 63 it started happening frequently on arm64 and ppc64el too.
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -1861,18 +1861,18 @@ imply_option('RUSTC_OPT_LEVEL', '2', whe
+ @depends('RUSTC_OPT_LEVEL', moz_optimize)
+ def rustc_opt_level(opt_level_option, moz_optimize):
+     if opt_level_option:
+         return opt_level_option[0]
+     else:
+         return '1' if moz_optimize.optimize else '0'
+ 
+ 
+-@depends(rustc_opt_level, debug_rust, '--enable-debug-symbols', '--enable-frame-pointers')
+-def rust_compile_flags(opt_level, debug_rust, debug_symbols, frame_pointers):
++@depends(rustc_opt_level, debug_rust, '--enable-debug-symbols', '--enable-frame-pointers', host)
++def rust_compile_flags(opt_level, debug_rust, debug_symbols, frame_pointers, host):
+     # Cargo currently supports only two interesting profiles for building:
+     # development and release. Those map (roughly) to --enable-debug and
+     # --disable-debug in Gecko, respectively.
+     #
+     # But we'd also like to support an additional axis of control for
+     # optimization level. Since Cargo only supports 2 profiles, we're in
+     # a bit of a bind.
+     #
+@@ -1885,16 +1885,18 @@ def rust_compile_flags(opt_level, debug_
+ 
+     # opt-level=0 implies -C debug-assertions, which may not be desired
+     # unless Rust debugging is enabled.
+     if opt_level == '0' and not debug_rust:
+         debug_assertions = False
+ 
+     if debug_symbols:
+         debug_info = '2'
++        if host.bitness == 32 or host.cpu == 'aarch64' or host.cpu == 'ppc64':
++            debug_info = '1'
+ 
+     opts = []
+ 
+     if opt_level is not None:
+         opts.append('opt-level=%s' % opt_level)
+     if debug_assertions is not None:
+         opts.append('debug-assertions=%s' %
+                     ('yes' if debug_assertions else 'no'))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-s390-bigendian.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,20 @@
+# HG changeset patch
+# User msirringhaus@suse.de
+# Date 1558452126 -7200
+#      Tue May 21 17:22:06 2019 +0200
+# Node ID a3cc550d25e3a04d906f516928cbcbe50efd585e
+# Parent  433beec63e6b5f409683af20a0c1ab137cc7bfad
+[mq]: mozilla-s390-bigendian.patch
+
+diff -r 433beec63e6b -r a3cc550d25e3 build/autoconf/icu.m4
+--- a/build/autoconf/icu.m4	Tue May 21 17:12:20 2019 +0200
++++ b/build/autoconf/icu.m4	Tue May 21 17:22:06 2019 +0200
+@@ -78,7 +78,7 @@
+     # TODO: the l is actually endian-dependent
+     # We could make this set as 'l' or 'b' for little or big, respectively,
+     # but we'd need to check in a big-endian version of the file.
+-    ICU_DATA_FILE="icudt${version}l.dat"
++    ICU_DATA_FILE="icudt${version}b.dat"
+ fi
+ 
+ AC_SUBST(MOZ_ICU_VERSION)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-s390-context.patch	Tue Nov 19 22:54:22 2019 +0100
@@ -0,0 +1,36 @@
+# HG changeset patch
+# User msirringhaus@suse.de
+# Date 1558452408 -7200
+#      Tue May 21 17:26:48 2019 +0200
+# Node ID 602e92722e765a3c238d3b96b26c0c8063b5eeb4
+# Parent  a3cc550d25e3a04d906f516928cbcbe50efd585e
+[mq]: mozilla-s390-context.patch
+
+diff -r a3cc550d25e3 -r 602e92722e76 js/src/wasm/WasmSignalHandlers.cpp
+--- a/js/src/wasm/WasmSignalHandlers.cpp	Tue May 21 17:22:06 2019 +0200
++++ b/js/src/wasm/WasmSignalHandlers.cpp	Tue May 21 17:26:48 2019 +0200
+@@ -154,6 +154,10 @@
+ #    define R01_sig(p) ((p)->uc_mcontext.gp_regs[1])
+ #    define R32_sig(p) ((p)->uc_mcontext.gp_regs[32])
+ #  endif
++#  if defined(__linux__) && defined(__s390x__)
++#    define GR_sig(p,x) ((p)->uc_mcontext.gregs[x])
++#    define PSWa_sig(p) ((p)->uc_mcontext.psw.addr)
++#  endif
+ #elif defined(__NetBSD__)
+ #  define EIP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EIP])
+ #  define EBP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EBP])
+@@ -385,8 +389,13 @@
+ #  define PC_sig(p) R32_sig(p)
+ #  define SP_sig(p) R01_sig(p)
+ #  define FP_sig(p) R01_sig(p)
++#elif defined(__s390x__)
++# define PC_sig(p) PSWa_sig(p)
++# define SP_sig(p) GR_sig(p, 15)
++# define FP_sig(p) GR_sig(p, 11)
+ #endif
+ 
++
+ static void SetContextPC(CONTEXT* context, uint8_t* pc) {
+ #ifdef PC_sig
+   *reinterpret_cast<uint8_t**>(&PC_sig(context)) = pc;
--- a/series	Sun Mar 17 10:00:10 2019 +0100
+++ b/series	Tue Nov 19 22:54:22 2019 +0100
@@ -4,9 +4,23 @@
 mozilla-ntlm-full-path.patch
 mozilla-openaes-decl.patch
 mozilla-aarch64-startup-crash.patch
-mozilla-bmo256180.patch
 mozilla-bmo1463035.patch
 mozilla-cubeb-noreturn.patch
+mozilla-fix-aarch64-libopus.patch
+mozilla-disable-wasm-emulate-arm-unaligned-fp-access.patch
+mozilla-s390-context.patch
+mozilla-s390-bigendian.patch
+mozilla-reduce-rust-debuginfo.patch
+mozilla-ppc-altivec_static_inline.patch
+mozilla-bmo1005535.patch
+mozilla-bmo1568145.patch
+mozilla-bmo1504834-part1.patch
+mozilla-bmo1504834-part2.patch
+mozilla-bmo1504834-part3.patch
+mozilla-bmo1511604.patch
+mozilla-bmo1554971.patch
+mozilla-bmo1512162.patch
+mozilla-fix-top-level-asm.patch
 
 # Firefox patches
 firefox-kde.patch