--- 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="©Cmd.label;"
-+ accesskey="©Cmd.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