diff --git a/MozillaFirefox.changes b/MozillaFirefox.changes index 96eb3ea..c1a410f 100644 --- a/MozillaFirefox.changes +++ b/MozillaFirefox.changes @@ -1,3 +1,57 @@ +------------------------------------------------------------------- +Sun Nov 10 12:56:23 UTC 2024 - Wolfgang Rosenauer + +- require xdg-desktop-portal (boo#1233166) + +------------------------------------------------------------------- +Tue Nov 5 08:54:03 UTC 2024 - Wolfgang Rosenauer + +- Mozilla Firefox 132.0.1 + * Fixed issues causing intermittent video playback problems on + some sites. (bmo#1928484, bmo#1928798) +- remove KDE integration patches + - mozilla-kde.patch + - firefox-kde.patch + on KDE use these settings instead + widget.use-xdg-desktop-portal.file-picker=1 + widget.use-xdg-desktop-portal.mime-handler=1 + (those are set by the latest branding package as well) + +------------------------------------------------------------------- +Mon Oct 28 11:59:31 UTC 2024 - Wolfgang Rosenauer + +- Mozilla Firefox 132.0 + https://www.mozilla.org/en-US/firefox/132.0/releasenotes + MFSA 2024-55 (bsc#1231879) + * CVE-2024-10458 (bmo#1921733) + Permission leak via embed or object elements + * CVE-2024-10459 (bmo#1919087) + Use-after-free in layout with accessibility + * CVE-2024-10460 (bmo#1912537) + Confusing display of origin for external protocol handler prompt + * CVE-2024-10461 (bmo#1914521) + XSS due to Content-Disposition being ignored in + multipart/x-mixed-replace response + * CVE-2024-10462 (bmo#1920423) + Origin of permission prompt could be spoofed by long URL + * CVE-2024-10463 (bmo#1920800) + Cross origin video frame leak + * CVE-2024-10468 (bmo#1914982) + Race conditions in IndexedDB + * CVE-2024-10464 (bmo#1913000) + History interface could have been used to cause a Denial of + Service condition in the browser + * CVE-2024-10465 (bmo#1918853) + Clipboard "paste" button persisted across tabs + * CVE-2024-10466 (bmo#1924154) + DOM push subscription message could hang Firefox + * CVE-2024-10467 (bmo#1829029, bmo#1888538, bmo#1900394, bmo#1904059, + bmo#1917742, bmo#1919809, bmo#1923706) + Memory safety bugs fixed in Firefox 132, Thunderbird 132, + Firefox ESR 128.4, and Thunderbird 128.4 +- requires NSS 3.105 +- rebased patches + ------------------------------------------------------------------- Thu Oct 17 06:18:12 UTC 2024 - Wolfgang Rosenauer diff --git a/MozillaFirefox.spec b/MozillaFirefox.spec index a7b0635..320a326 100644 --- a/MozillaFirefox.spec +++ b/MozillaFirefox.spec @@ -28,9 +28,9 @@ # orig_suffix b3 # major 69 # mainver %%major.99 -%define major 131 -%define mainver %major.0.3 -%define orig_version 131.0.3 +%define major 132 +%define mainver %major.0.1 +%define orig_version 132.0.1 %define orig_suffix %{nil} %define update_channel release %define branding 1 @@ -114,7 +114,7 @@ BuildRequires: libiw-devel BuildRequires: libproxy-devel BuildRequires: makeinfo BuildRequires: mozilla-nspr-devel >= 4.35 -BuildRequires: mozilla-nss-devel >= 3.104 +BuildRequires: mozilla-nss-devel >= 3.105 BuildRequires: nasm >= 2.14 BuildRequires: nodejs >= 12.22.12 %if 0%{?sle_version} >= 120000 && 0%{?sle_version} < 150000 @@ -177,10 +177,6 @@ Provides: firefox = %{version}-%{release} Provides: web_browser Provides: appdata() Provides: appdata(firefox.appdata.xml) -# this is needed to match this package with the kde4 helper package without the main package -# having a hard requirement on the kde4 package -%define kde_helper_version 6 -Provides: mozilla-kde4-version = %{kde_helper_version} Summary: Mozilla %{appname} Web Browser License: MPL-2.0 Group: Productivity/Networking/Web/Browsers @@ -212,7 +208,6 @@ Source20: https://ftp.mozilla.org/pub/%{srcname}/releases/%{version}%{orig 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-aarch64-startup-crash.patch Patch6: mozilla-s390-context.patch @@ -228,13 +223,13 @@ Patch20: one_swizzle_to_rule_them_all.patch Patch21: svg-rendering.patch Patch24: mozilla-bmo1746799.patch # Firefox/browser -Patch101: firefox-kde.patch Patch102: firefox-branded-icons.patch %endif BuildRoot: %{_tmppath}/%{name}-%{version}-build Requires(post): coreutils shared-mime-info desktop-file-utils Requires(postun): shared-mime-info desktop-file-utils Requires: %{name}-branding >= 68 +Requires: xdg-desktop-portal %requires_ge mozilla-nspr %requires_ge mozilla-nss %requires_ge libfreetype6 @@ -347,18 +342,11 @@ find . -regex ".*\.c\|.*\.cpp\|.*\.h" -exec sed -i "s/__DATE__/${DATE}/g;s/__TIM # SLE-12 provides python39, but that package does not provide a python3 binary %if 0%{?sle_version} >= 120000 && 0%{?sle_version} < 150000 -#sed -i "s/python3/python3.9/g" configure.in sed -i "s|/usr/bin/env python3|/usr/bin/env python3.9|" mach sed -i "s|potential_python_binary = f\"python3.{i}\"|potential_python_binary = f\"python3.9.{i}\"|" mach export PYTHON3=/usr/bin/python3.9 %endif -kdehelperversion=$(cat toolkit/xre/nsKDEUtils.cpp | grep '#define KMOZILLAHELPER_VERSION' | cut -d ' ' -f 3) -if test "$kdehelperversion" != %{kde_helper_version}; then - echo fix kde helper version in the .spec file - exit 1 -fi - # When doing only_print_mozconfig, this file isn't necessarily available, so skip it cp %{SOURCE4} .obsenv.sh %else diff --git a/firefox-131.0.3.source.tar.xz b/firefox-131.0.3.source.tar.xz deleted file mode 100644 index 4896706..0000000 --- a/firefox-131.0.3.source.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a7df3f97737453efaa243ca9dbaf95d0f0f833c5dc8afacb5704ee16ef060d0 -size 568937752 diff --git a/firefox-131.0.3.source.tar.xz.asc b/firefox-131.0.3.source.tar.xz.asc deleted file mode 100644 index 28d95dd..0000000 --- a/firefox-131.0.3.source.tar.xz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCgAdFiEErdcHlHlwDcrf3VM34207E/PZMnQFAmcMOSAACgkQ4207E/PZ -MnQ6VBAAn2avfTzuNsevWr/zr1XMiD+Z/iqadV+0iMZX8AacevWBRZboId78zvMh -46mzJdUyEHZjqbU1LCXanSpsUsRPLqvDtkcvMSJAjH4v7VoKAhRZQFxHdNna5g9A -+c4XKuAhXj1nV/qwySfWpEyLkGl/4ZygY/UKlEtum6WNGkUbhOLwQjX1hlNfJ1bW -SkQ/fd95rLr8AhUMiPRUmhl20uNSeGVeJ7pHkUsQ+1I2txKY1PMf02nT2jwekjnb -p3w1auPuiMvJw0DxAMQGAf/BPOAo0X4B184CVugd40ZgPIOCxnmn3bz348qCHlEs -WNfReB6EGGH9j2o1/iEi8L1O7+flMBYmb0UEhnoKeTny7zb4KvKXy1AMyrzufSkp -mW+xOvLE9Z5HORpFpzqx7kWyfYZZJtbJm+SWWDiBjWOTHGhdN9Wyft1rf3RUEYTs -hx8rxnUDJg32xgcVmDjKYzhslk0skpLGrsRYjiJM1E142ihVcZxKtDRExdlYkmGU -2Sjs8+Tiqz3Vpi3AGOe8nE01+Y2dmI6bgjFbGphDyBYX4//JV6rPJzl3VCchUlHY -kYne3jvHwhz5okUPHyvdyML53nHLcOd1P5m+ibdj4Oaq2QWQwgpavui7kuPKYrPo -P6TK+IqA3I6KJH2HCJxjst4RVZrTkeK3EDX47oNhlSc81SLwq3o= -=2/ni ------END PGP SIGNATURE----- diff --git a/firefox-132.0.1.source.tar.xz b/firefox-132.0.1.source.tar.xz new file mode 100644 index 0000000..85412bb --- /dev/null +++ b/firefox-132.0.1.source.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c031b572c1da726677e2ff97b6ad5a7e3b23387a6fc3963391cb562f80a5e48 +size 577539004 diff --git a/firefox-132.0.1.source.tar.xz.asc b/firefox-132.0.1.source.tar.xz.asc new file mode 100644 index 0000000..9e663d4 --- /dev/null +++ b/firefox-132.0.1.source.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEErdcHlHlwDcrf3VM34207E/PZMnQFAmcn/jAACgkQ4207E/PZ +MnTuLA/+IzwukASCiNDv/5UJivVD/hFcOmUvEb0hQ5Qz3ThUQ5pXjgsneoyANycy +H1wn2TpJBoVlqjRIwt0A+C6y15V+FKN5T3OYRGQxz8eomLxOTq5uFVQfBazJxfMi +tRbtZ3PKS+S2CsG4e7yL7WR8A0r6RZFn9R4aZjcr6h11QsqshyteYt0F+IgMmnUC +rOflCISG0OYWY2yscYi0bRl4XQI1Wj+u3u83kYKtEwdITEq03nPCcONEj04lDD/x +idhCJEUdEQTllKonvXQOIsfGn0WdCcyVwh53hETsH5OPn3GWu779Afv2z4zgKR37 +m4KWZwSPNp9U11KxpAF+VnveLYDAFVyaj0xggysSAeGEsUdlEcdPVd4lmrbt5IfU +y6Y7OqiYUyjoSfxH6+Fb4LEsMO4TnNyViyil8HBdyyr47dEVUsu9zLldxeNbYC2m +lPoJeIMdKc3rclzxFDG2HZT97CgrwsxjRreFKQuLXWF85FcZzeBMsC1+8rLcOkNY +GNnE7JsZxavXcrSuutlu5U9KhgJOJJoY1iuZ+vMPK3WP4nfSneESdiGhaS/HXdKn +yQpXjy+5woSz4ejYjiiz1ZH4AY76P3iHB1qEyNy7LCs17KEKNaNWewc6UlIMCYbZ +awGsUAKkKUmMZn9ggugw5Gh7tt9q8gg09ZmY1XK4vSNVfaSHHkw= +=oM9y +-----END PGP SIGNATURE----- diff --git a/firefox-kde.patch b/firefox-kde.patch deleted file mode 100644 index 84e4ae3..0000000 --- a/firefox-kde.patch +++ /dev/null @@ -1,302 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Martin Sirringhaus -Date: Tue, 8 Aug 2023 16:18:24 +0300 -Subject: [PATCH] Add KDE integration to Firefox - -Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751 -Bug: https://bugzilla.suse.com/show_bug.cgi?id=170055 - -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 ---- - browser/components/preferences/main.js | 18 +++ - browser/components/shell/moz.build | 2 + - .../components/shell/nsKDEShellService.cpp | 109 ++++++++++++++++++ - browser/components/shell/nsKDEShellService.h | 32 +++++ - .../components/shell/nsUnixShellService.cpp | 22 ++++ - browser/components/shell/nsUnixShellService.h | 15 +++ - 6 files changed, 198 insertions(+) - create mode 100644 browser/components/shell/nsKDEShellService.cpp - create mode 100644 browser/components/shell/nsKDEShellService.h - create mode 100644 browser/components/shell/nsUnixShellService.cpp - create mode 100644 browser/components/shell/nsUnixShellService.h - -diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js ---- a/browser/components/preferences/main.js -+++ b/browser/components/preferences/main.js -@@ -292,16 +292,23 @@ var gMainPane = { - }, backoffTimes[this._backoffIndex + 1 < backoffTimes.length ? this._backoffIndex++ : backoffTimes.length - 1]); - }; - - window.setTimeout(() => { - window.requestIdleCallback(pollForDefaultBrowser); - }, backoffTimes[this._backoffIndex]); - } - -+ var env = Components.classes["@mozilla.org/process/environment;1"] -+ .getService(Components.interfaces.nsIEnvironment); -+ var kde_session = 0; -+ if (env.get('KDE_FULL_SESSION') == "true") { -+ kde_session = 1; -+ } -+ - this.initBrowserContainers(); - this.buildContentProcessCountMenuList(); - - this.updateDefaultPerformanceSettingsPref(); - - let defaultPerformancePref = Preferences.get( - "browser.preferences.defaultPerformanceSettings.enabled" - ); -@@ -1753,16 +1760,27 @@ var gMainPane = { - - // Disable the set default button, so that the user doesn't try to hit it again - // while awaiting on setDefaultBrowser - let setDefaultButton = document.getElementById("setDefaultButton"); - setDefaultButton.disabled = true; - - try { - await shellSvc.setDefaultBrowser(false); -+ if (kde_session == 1) { -+ var shellObj = Components.classes["@mozilla.org/file/local;1"] -+ .createInstance(Components.interfaces.nsILocalFile); -+ shellObj.initWithPath("/usr/bin/kwriteconfig"); -+ var process = Components.classes["@mozilla.org/process/util;1"] -+ .createInstance(Components.interfaces.nsIProcess); -+ process.init(shellObj); -+ var args = ["--file", "kdeglobals", "--group", "General", "--key", -+ "BrowserApplication", "firefox"]; -+ process.run(false, args, args.length); -+ } - } catch (ex) { - console.error(ex); - return; - } finally { - // Make sure to re-enable the default button when we're finished, regardless of the outcome - setDefaultButton.disabled = false; - } - -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 -@@ -31,16 +31,18 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "coco - ] - elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - XPIDL_SOURCES += [ - "nsIGNOMEShellService.idl", - ] - - SOURCES += [ - "nsGNOMEShellService.cpp", -+ "nsKDEShellService.cpp", -+ "nsUnixShellService.cpp", - ] - if CONFIG["MOZ_ENABLE_DBUS"]: - SOURCES += [ - "nsGNOMEShellDBusHelper.cpp", - "nsGNOMEShellSearchProvider.cpp", - ] - include("/ipc/chromium/chromium-config.mozbuild") - -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,108 @@ -+/* -*- 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 -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+#include "mozilla/ArrayUtils.h" -+ -+#include "nsCOMPtr.h" -+#include "nsKDEShellService.h" -+#include "nsShellService.h" -+#include "nsKDEUtils.h" -+#include "nsIPrefService.h" -+#include "nsIProcess.h" -+#include "nsIFile.h" -+#include "nsServiceManagerUtils.h" -+#include "nsComponentManagerUtils.h" -+#include "nsIMutableArray.h" -+#include "nsISupportsPrimitives.h" -+#include "nsArrayUtils.h" -+ -+using namespace mozilla; -+ -+nsresult -+nsKDEShellService::Init() -+{ -+ if( !nsKDEUtils::kdeSupport()) -+ return NS_ERROR_NOT_AVAILABLE; -+ return NS_OK; -+} -+ -+NS_IMPL_ISUPPORTS(nsKDEShellService, nsIGNOMEShellService, nsIShellService) -+ -+NS_IMETHODIMP -+nsKDEShellService::IsDefaultBrowser(bool aForAllTypes, -+ bool* aIsDefaultBrowser) -+{ -+ *aIsDefaultBrowser = false; -+ -+ nsCOMPtr command = do_CreateInstance( NS_ARRAY_CONTRACTID ); -+ if (!command) -+ return NS_ERROR_FAILURE; -+ -+ nsCOMPtr str = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID ); -+ if (!str) -+ return NS_ERROR_FAILURE; -+ -+ str->SetData("ISDEFAULTBROWSER"_ns); -+ command->AppendElement( str ); -+ -+ if( nsKDEUtils::command( command )) -+ *aIsDefaultBrowser = true; -+ return NS_OK; -+} -+ -+NS_IMETHODIMP -+nsKDEShellService::SetDefaultBrowser(bool aForAllUsers) -+{ -+ nsCOMPtr command = do_CreateInstance( NS_ARRAY_CONTRACTID ); -+ if (!command) -+ return NS_ERROR_FAILURE; -+ -+ nsCOMPtr cmdstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID ); -+ nsCOMPtr paramstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID ); -+ if (!cmdstr || !paramstr) -+ return NS_ERROR_FAILURE; -+ -+ cmdstr->SetData("SETDEFAULTBROWSER"_ns); -+ command->AppendElement( cmdstr ); -+ -+ paramstr->SetData("ALLTYPES"_ns); -+ command->AppendElement( paramstr ); -+ -+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; -+} -+ -+NS_IMETHODIMP -+nsKDEShellService::GetCanSetDesktopBackground(bool* aResult) -+{ -+ *aResult = true; -+ return NS_OK; -+} -+ -+NS_IMETHODIMP -+nsKDEShellService::SetDesktopBackground(dom::Element* aElement, -+ int32_t aPosition, -+ const nsACString& aImageName) -+{ -+ return NS_ERROR_NOT_IMPLEMENTED; -+} -+ -+NS_IMETHODIMP -+nsKDEShellService::GetDesktopBackgroundColor(PRUint32 *aColor) -+{ -+ return NS_ERROR_NOT_IMPLEMENTED; -+} -+ -+NS_IMETHODIMP -+nsKDEShellService::SetDesktopBackgroundColor(PRUint32 aColor) -+{ -+ return NS_ERROR_NOT_IMPLEMENTED; -+} -+ -+NS_IMETHODIMP -+nsKDEShellService::IsDefaultForScheme(nsTSubstring const& aScheme, bool* aIsDefaultBrowser) -+{ -+ return NS_ERROR_NOT_IMPLEMENTED; -+} -+ -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,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 -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+#ifndef nskdeshellservice_h____ -+#define nskdeshellservice_h____ -+ -+#include "nsIGNOMEShellService.h" -+#include "nsToolkitShellService.h" -+#include "nsString.h" -+#include "mozilla/Attributes.h" -+ -+class nsKDEShellService final : public nsIGNOMEShellService, -+ public nsToolkitShellService -+{ -+public: -+ nsKDEShellService() : mCheckedThisSession(false) { } -+ -+ NS_DECL_ISUPPORTS -+ NS_DECL_NSISHELLSERVICE -+ NS_DECL_NSIGNOMESHELLSERVICE -+ -+ nsresult Init(); -+ -+private: -+ ~nsKDEShellService() {} -+ -+ bool mCheckedThisSession; -+}; -+ -+#endif // nskdeshellservice_h____ -diff --git a/browser/components/shell/nsUnixShellService.cpp b/browser/components/shell/nsUnixShellService.cpp -new file mode 100644 ---- /dev/null -+++ b/browser/components/shell/nsUnixShellService.cpp -@@ -0,0 +1,22 @@ -+/* -*- 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 -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+ -+#include "nsUnixShellService.h" -+#include "nsGNOMEShellService.h" -+#include "nsKDEShellService.h" -+#include "nsKDEUtils.h" -+#include "mozilla/ModuleUtils.h" -+ -+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGNOMEShellService, Init) -+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsKDEShellService, Init) -+ -+NS_IMETHODIMP -+nsUnixShellServiceConstructor(REFNSIID aIID, void **aResult) -+{ -+ if( nsKDEUtils::kdeSupport()) -+ return nsKDEShellServiceConstructor( aIID, aResult ); -+ return nsGNOMEShellServiceConstructor( aIID, aResult ); -+} -diff --git a/browser/components/shell/nsUnixShellService.h b/browser/components/shell/nsUnixShellService.h -new file mode 100644 ---- /dev/null -+++ b/browser/components/shell/nsUnixShellService.h -@@ -0,0 +1,15 @@ -+/* -*- 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 -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+ -+#ifndef nsunixshellservice_h____ -+#define nsunixshellservice_h____ -+ -+#include "nsIGNOMEShellService.h" -+ -+NS_IMETHODIMP -+nsUnixShellServiceConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult); -+ -+#endif // nsunixshellservice_h____ diff --git a/l10n-131.0.3.tar.xz b/l10n-131.0.3.tar.xz deleted file mode 100644 index 558e016..0000000 --- a/l10n-131.0.3.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:901c3c8ee1fe9ed197378b884d77b8d01c936d85a0646d75e8866c8842b89543 -size 34765400 diff --git a/l10n-132.0.1.tar.xz b/l10n-132.0.1.tar.xz new file mode 100644 index 0000000..39a410b --- /dev/null +++ b/l10n-132.0.1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cdee8252565f3d3172787471ec6fcf0e2cc4e6a9c1642a17a670cc517cd2ba1 +size 34879056 diff --git a/mozilla-bmo1746799.patch b/mozilla-bmo1746799.patch index 45eb0d2..680f161 100644 --- a/mozilla-bmo1746799.patch +++ b/mozilla-bmo1746799.patch @@ -7,18 +7,22 @@ Fixes incorrect volume mapping. Rebased to current SUSE sources and updated checksums Wed Sep 04 00:00:00 2024 -diff -urN a/third_party/rust/cubeb-pulse/.cargo-checksum.json b/third_party/rust/cubeb-pulse/.cargo-checksum.json ---- a/third_party/rust/cubeb-pulse/.cargo-checksum.json 2024-08-12 22:48:46.000000000 +1000 -+++ b/third_party/rust/cubeb-pulse/.cargo-checksum.json 2024-09-04 01:47:13.620986547 +1000 -@@ -1 +1 @@ --{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".github/workflows/build.yml":"477366d58c9dc059dbe4a158a6e910f23a3e9ecac7411f73616e06375583b764","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"8a0a450ae4990e1df322464867212e48587b474dfdc7f8c270fac06980be176a","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"0079450bb4b013bac065ed1750851e461a3710ebad1f323817da1cb82db0bc4f","src/backend/context.rs":"c0db5f2447de1d6df5aa2812fa342a085e73156a072c221c7379b9a6a9b86786","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"11ca424e4eb77f8eb9fd5a6717d1e791facf9743156a8534f0016fcf64d57b0f","src/backend/mod.rs":"dfb30ec497d6215e4535e936fea8fe3a407ef24dc1cec43b52c0ffa923d9229c","src/backend/stream.rs":"dfe5b747e100cae4aeae36cf2ebb9dc4715b411b4116721a40eec2944eb0ec23","src/capi.rs":"fa0fa020f0d0efe55aa0fc3596405e8407bbe2cbe6c7a558345304e6da87994e","src/lib.rs":"b41bbdc562cbfb130ed7c1e53fe69944774f515705341d8ce48a2f82c8c0c2c5"},"package":null} +diff --git a/third_party/rust/cubeb-pulse/.cargo-checksum.json b/third_party/rust/cubeb-pulse/.cargo-checksum.json +--- a/third_party/rust/cubeb-pulse/.cargo-checksum.json ++++ b/third_party/rust/cubeb-pulse/.cargo-checksum.json +@@ -1,1 +1,1 @@ +-{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".github/workflows/build.yml":"477366d58c9dc059dbe4a158a6e910f23a3e9ecac7411f73616e06375583b764","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"4dc677a2a769c0f1667c7ad52bc7b09d22ae8e47bb95389223a5075eb4228d13","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"0079450bb4b013bac065ed1750851e461a3710ebad1f323817da1cb82db0bc4f","src/backend/context.rs":"c0db5f2447de1d6df5aa2812fa342a085e73156a072c221c7379b9a6a9b86786","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"11ca424e4eb77f8eb9fd5a6717d1e791facf9743156a8534f0016fcf64d57b0f","src/backend/mod.rs":"dfb30ec497d6215e4535e936fea8fe3a407ef24dc1cec43b52c0ffa923d9229c","src/backend/stream.rs":"dfe5b747e100cae4aeae36cf2ebb9dc4715b411b4116721a40eec2944eb0ec23","src/capi.rs":"fa0fa020f0d0efe55aa0fc3596405e8407bbe2cbe6c7a558345304e6da87994e","src/lib.rs":"b41bbdc562cbfb130ed7c1e53fe69944774f515705341d8ce48a2f82c8c0c2c5"},"package":null} \ No newline at end of file -+{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".github/workflows/build.yml":"477366d58c9dc059dbe4a158a6e910f23a3e9ecac7411f73616e06375583b764","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"8a0a450ae4990e1df322464867212e48587b474dfdc7f8c270fac06980be176a","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"0079450bb4b013bac065ed1750851e461a3710ebad1f323817da1cb82db0bc4f","src/backend/context.rs":"c0db5f2447de1d6df5aa2812fa342a085e73156a072c221c7379b9a6a9b86786","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"11ca424e4eb77f8eb9fd5a6717d1e791facf9743156a8534f0016fcf64d57b0f","src/backend/mod.rs":"dfb30ec497d6215e4535e936fea8fe3a407ef24dc1cec43b52c0ffa923d9229c","src/backend/stream.rs":"2dfc61c4eac69624558756d87283496d01f56f44bf311119eff0f1d124cd88f3","src/capi.rs":"fa0fa020f0d0efe55aa0fc3596405e8407bbe2cbe6c7a558345304e6da87994e","src/lib.rs":"b41bbdc562cbfb130ed7c1e53fe69944774f515705341d8ce48a2f82c8c0c2c5"},"package":null} -\ No newline at end of file -diff -urN a/third_party/rust/cubeb-pulse/src/backend/stream.rs b/third_party/rust/cubeb-pulse/src/backend/stream.rs ---- a/third_party/rust/cubeb-pulse/src/backend/stream.rs 2024-08-12 22:48:47.000000000 +1000 -+++ b/third_party/rust/cubeb-pulse/src/backend/stream.rs 2024-09-04 01:10:52.556622261 +1000 -@@ -765,8 +765,8 @@ ++{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".github/workflows/build.yml":"477366d58c9dc059dbe4a158a6e910f23a3e9ecac7411f73616e06375583b764","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"4dc677a2a769c0f1667c7ad52bc7b09d22ae8e47bb95389223a5075eb4228d13","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"0079450bb4b013bac065ed1750851e461a3710ebad1f323817da1cb82db0bc4f","src/backend/context.rs":"c0db5f2447de1d6df5aa2812fa342a085e73156a072c221c7379b9a6a9b86786","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"11ca424e4eb77f8eb9fd5a6717d1e791facf9743156a8534f0016fcf64d57b0f","src/backend/mod.rs":"dfb30ec497d6215e4535e936fea8fe3a407ef24dc1cec43b52c0ffa923d9229c","src/backend/stream.rs":"2dfc61c4eac69624558756d87283496d01f56f44bf311119eff0f1d124cd88f3","src/capi.rs":"fa0fa020f0d0efe55aa0fc3596405e8407bbe2cbe6c7a558345304e6da87994e","src/lib.rs":"b41bbdc562cbfb130ed7c1e53fe69944774f515705341d8ce48a2f82c8c0c2c5"},"package":null} +diff --git a/third_party/rust/cubeb-pulse/src/backend/stream.rs b/third_party/rust/cubeb-pulse/src/backend/stream.rs +--- a/third_party/rust/cubeb-pulse/src/backend/stream.rs ++++ b/third_party/rust/cubeb-pulse/src/backend/stream.rs +@@ -760,18 +760,18 @@ impl<'ctx> StreamOps for PulseStream<'ct + _ => pulse::SinkFlags::empty(), + } + }; + + if flags.contains(pulse::SinkFlags::FLAT_VOLUME) { self.volume = volume; } else { let channels = stm.get_sample_spec().channels; @@ -29,18 +33,27 @@ diff -urN a/third_party/rust/cubeb-pulse/src/backend/stream.rs b/third_party/rus let index = stm.get_index(); -diff -urN a/third_party/rust/pulse-ffi/.cargo-checksum.json b/third_party/rust/pulse-ffi/.cargo-checksum.json ---- a/third_party/rust/pulse-ffi/.cargo-checksum.json 2024-08-12 22:48:46.000000000 +1000 -+++ b/third_party/rust/pulse-ffi/.cargo-checksum.json 2024-09-04 01:47:20.311044993 +1000 -@@ -1 +1 @@ --{"files":{"Cargo.toml":"96983752046f2988087a836546a02aba746cdd1fc3ccd16f4170460465de5e63","src/ffi_funcs.rs":"a16646c5e7c49e94b907a7a404cfcadf3007688005c689cca936f0c2ee2e28e6","src/ffi_types.rs":"2ca56bc3638a40d331e53117a5dd175d0a6e102b1e0eccb9c2adc565c6861a33","src/lib.rs":"6aff308de11954a067d0f6ef95bf3126aabb6d928a5191e91d9a38ebadba91c2"},"package":null} + let context_ptr = self.context as *const _ as *mut _; + if let Ok(o) = context.set_sink_input_volume( + index, + &cvol, + context_success, +diff --git a/third_party/rust/pulse-ffi/.cargo-checksum.json b/third_party/rust/pulse-ffi/.cargo-checksum.json +--- a/third_party/rust/pulse-ffi/.cargo-checksum.json ++++ b/third_party/rust/pulse-ffi/.cargo-checksum.json +@@ -1,1 +1,1 @@ +-{"files":{"Cargo.toml":"d0d7e81366920147911554f68c95567cae0931950c6d96ccc2c986508473642e","src/ffi_funcs.rs":"a16646c5e7c49e94b907a7a404cfcadf3007688005c689cca936f0c2ee2e28e6","src/ffi_types.rs":"2ca56bc3638a40d331e53117a5dd175d0a6e102b1e0eccb9c2adc565c6861a33","src/lib.rs":"6aff308de11954a067d0f6ef95bf3126aabb6d928a5191e91d9a38ebadba91c2"},"package":null} \ No newline at end of file -+{"files":{"Cargo.toml":"96983752046f2988087a836546a02aba746cdd1fc3ccd16f4170460465de5e63","src/ffi_funcs.rs":"a16646c5e7c49e94b907a7a404cfcadf3007688005c689cca936f0c2ee2e28e6","src/ffi_types.rs":"f39a27712b17256583331f7ce5722413d0c7b51d73d8def8f50e839e23dfb411","src/lib.rs":"6aff308de11954a067d0f6ef95bf3126aabb6d928a5191e91d9a38ebadba91c2"},"package":null} -\ No newline at end of file -diff -urN a/third_party/rust/pulse-ffi/src/ffi_types.rs b/third_party/rust/pulse-ffi/src/ffi_types.rs ---- a/third_party/rust/pulse-ffi/src/ffi_types.rs 2024-08-12 22:48:46.000000000 +1000 -+++ b/third_party/rust/pulse-ffi/src/ffi_types.rs 2024-09-04 01:07:53.408269333 +1000 -@@ -22,6 +22,11 @@ ++{"files":{"Cargo.toml":"d0d7e81366920147911554f68c95567cae0931950c6d96ccc2c986508473642e","src/ffi_funcs.rs":"a16646c5e7c49e94b907a7a404cfcadf3007688005c689cca936f0c2ee2e28e6","src/ffi_types.rs":"f39a27712b17256583331f7ce5722413d0c7b51d73d8def8f50e839e23dfb411","src/lib.rs":"6aff308de11954a067d0f6ef95bf3126aabb6d928a5191e91d9a38ebadba91c2"},"package":null} +diff --git a/third_party/rust/pulse-ffi/src/ffi_types.rs b/third_party/rust/pulse-ffi/src/ffi_types.rs +--- a/third_party/rust/pulse-ffi/src/ffi_types.rs ++++ b/third_party/rust/pulse-ffi/src/ffi_types.rs +@@ -17,16 +17,21 @@ pub const PA_SAMPLE_S32BE: c_int = 8; + pub const PA_SAMPLE_S24LE: c_int = 9; + pub const PA_SAMPLE_S24BE: c_int = 10; + pub const PA_SAMPLE_S24_32LE: c_int = 11; + pub const PA_SAMPLE_S24_32BE: c_int = 12; + pub const PA_SAMPLE_MAX: c_int = 13; pub const PA_SAMPLE_INVALID: c_int = -1; pub type pa_sample_format_t = c_int; @@ -52,3 +65,8 @@ diff -urN a/third_party/rust/pulse-ffi/src/ffi_types.rs b/third_party/rust/pulse #[repr(C)] #[derive(Copy, Clone, Debug)] pub struct Struct_pa_sample_spec { + pub format: pa_sample_format_t, + pub rate: u32, + pub channels: u8, + } + diff --git a/mozilla-kde.patch b/mozilla-kde.patch deleted file mode 100644 index 45b040e..0000000 --- a/mozilla-kde.patch +++ /dev/null @@ -1,1774 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Wolfgang Rosenauer -Date: Tue, 8 Aug 2023 16:13:48 +0300 -Subject: [PATCH] Add KDE integration to Firefox (toolkit parts) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751 -Bug: https://bugzilla.suse.com/show_bug.cgi?id=170055 - -EDIT: Björn Bidar: Removed handling for obsolete special files - -Co-authored-by: Wolfgang Rosenauer -Co-authored-by: Lubos Lunak -Co-authored-by: Björn Bidar ---- - modules/libpref/Preferences.cpp | 1 + - modules/libpref/moz.build | 4 + - python/mozbuild/mozpack/chrome/flags.py | 1 + - python/mozbuild/mozpack/chrome/manifest.py | 1 + - toolkit/components/downloads/moz.build | 4 + - .../mozapps/downloads/HelperAppDlg.sys.mjs | 70 +++-- - .../unixproxy/nsUnixSystemProxySettings.cpp | 29 ++ - toolkit/xre/moz.build | 2 + - toolkit/xre/nsKDEUtils.cpp | 286 ++++++++++++++++++ - toolkit/xre/nsKDEUtils.h | 53 ++++ - uriloader/exthandler/HandlerServiceParent.cpp | 6 +- - uriloader/exthandler/moz.build | 3 + - .../exthandler/unix/nsCommonRegistry.cpp | 42 +++ - uriloader/exthandler/unix/nsCommonRegistry.h | 28 ++ - uriloader/exthandler/unix/nsKDERegistry.cpp | 75 +++++ - uriloader/exthandler/unix/nsKDERegistry.h | 35 +++ - uriloader/exthandler/unix/nsMIMEInfoUnix.cpp | 28 +- - .../exthandler/unix/nsOSHelperAppService.cpp | 10 +- - widget/gtk/moz.build | 1 + - widget/gtk/nsFilePicker.cpp | 230 +++++++++++++- - widget/gtk/nsFilePicker.h | 6 + - xpcom/components/ManifestParser.cpp | 10 + - xpcom/components/moz.build | 1 + - xpcom/io/nsLocalFileUnix.cpp | 20 +- - 24 files changed, 910 insertions(+), 36 deletions(-) - create mode 100644 toolkit/xre/nsKDEUtils.cpp - create mode 100644 toolkit/xre/nsKDEUtils.h - create mode 100644 uriloader/exthandler/unix/nsCommonRegistry.cpp - create mode 100644 uriloader/exthandler/unix/nsCommonRegistry.h - create mode 100644 uriloader/exthandler/unix/nsKDERegistry.cpp - create mode 100644 uriloader/exthandler/unix/nsKDERegistry.h - -diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp ---- a/modules/libpref/Preferences.cpp -+++ b/modules/libpref/Preferences.cpp -@@ -92,16 +92,17 @@ - #include "PLDHashTable.h" - #include "prdtoa.h" - #include "prlink.h" - #include "xpcpublic.h" - #include "js/RootingAPI.h" - #ifdef MOZ_BACKGROUNDTASKS - # include "mozilla/BackgroundTasks.h" - #endif -+#include "nsKDEUtils.h" - - #ifdef DEBUG - # include - #endif - - #ifdef MOZ_MEMORY - # include "mozmemory.h" - #endif -diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build ---- a/modules/libpref/moz.build -+++ b/modules/libpref/moz.build -@@ -122,16 +122,20 @@ EXPORTS.mozilla += [ - ] - EXPORTS.mozilla += sorted(["!" + g for g in gen_h]) - - UNIFIED_SOURCES += [ - "Preferences.cpp", - "SharedPrefMap.cpp", - ] - -+LOCAL_INCLUDES += [ -+ '/toolkit/xre' -+] -+ - gen_all_tuple = tuple(gen_h + gen_cpp + gen_rs) - - GeneratedFile( - *gen_all_tuple, - script="init/generate_static_pref_list.py", - entry_point="emit_code", - 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 -@@ -229,16 +229,17 @@ class Flags(OrderedDict): - "os": StringFlag, - "osversion": VersionFlag, - "abi": StringFlag, - "platform": Flag, - "xpcnativewrappers": Flag, - "tablet": Flag, - "process": StringFlag, - "backgroundtask": StringFlag, -+ "desktop": StringFlag, - } - RE = re.compile(r"([!<>=]+)") - - def __init__(self, *flags): - """ - Initialize a set of flags given in string form. - flags = Flags('contentaccessible=yes', 'appversion>=3.5') - """ -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 -@@ -38,16 +38,17 @@ class ManifestEntry(object): - "os", - "osversion", - "abi", - "xpcnativewrappers", - "tablet", - "process", - "contentaccessible", - "backgroundtask", -+ "desktop", - ] - - def __init__(self, base, *flags): - """ - Initialize a manifest entry with the given base path and flags. - """ - self.base = base - self.flags = Flags(*flags) -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 -@@ -46,10 +46,14 @@ XPCOM_MANIFESTS += [ - - if CONFIG["MOZ_PLACES"]: - EXTRA_JS_MODULES += [ - "DownloadHistory.sys.mjs", - ] - - FINAL_LIBRARY = "xul" - -+LOCAL_INCLUDES += [ -+ '/toolkit/xre' -+] -+ - with Files("**"): - BUG_COMPONENT = ("Toolkit", "Downloads API") -diff --git a/toolkit/mozapps/downloads/HelperAppDlg.sys.mjs b/toolkit/mozapps/downloads/HelperAppDlg.sys.mjs ---- a/toolkit/mozapps/downloads/HelperAppDlg.sys.mjs -+++ b/toolkit/mozapps/downloads/HelperAppDlg.sys.mjs -@@ -1227,36 +1227,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 contentTypeDialogObj = this; -- let appChooserCallback = function appChooserCallback_done(aResult) { -- if (aResult) { -- contentTypeDialogObj.chosenApp = aResult.QueryInterface( -- Ci.nsILocalHandlerApp -- ); -- } -- contentTypeDialogObj.finishChooseApp(); -- }; -- appChooser.open(this.mLauncher.MIMEInfo.MIMEType, appChooserCallback); -- // The finishChooseApp is called from appChooserCallback -- return; -+ // handle the KDE case which is implemented in the filepicker -+ // therefore falling back to Gtk2 like behaviour if KDE is running -+ // FIXME this should be better handled in the nsIApplicationChooser -+ // interface -+ var env = Components.classes["@mozilla.org/process/environment;1"] -+ .getService(Components.interfaces.nsIEnvironment); -+ if (env.get('KDE_FULL_SESSION') == "true") -+ { -+ var nsIFilePicker = Ci.nsIFilePicker; -+ var fp = Cc["@mozilla.org/filepicker;1"] -+ .createInstance(nsIFilePicker); -+ fp.init(this.mDialog, -+ this.dialogElement("strings").getString("chooseAppFilePickerTitle"), -+ nsIFilePicker.modeOpen); -+ -+ fp.appendFilters(nsIFilePicker.filterApps); -+ -+ fp.open(aResult => { -+ if (aResult == nsIFilePicker.returnOK && fp.file) { -+ // Remember the file they chose to run. -+ var localHandlerApp = -+ Cc["@mozilla.org/uriloader/local-handler-app;1"]. -+ createInstance(Ci.nsILocalHandlerApp); -+ localHandlerApp.executable = fp.file; -+ this.chosenApp = localHandlerApp; -+ } -+ this.finishChooseApp(); -+ }); -+ } else { -+ var nsIApplicationChooser = Ci.nsIApplicationChooser; -+ 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.finishChooseApp(); -+ }; -+ appChooser.open(this.mLauncher.MIMEInfo.MIMEType, appChooserCallback); -+ // The finishChooseApp is called from appChooserCallback -+ return; -+ } - } else { - var nsIFilePicker = Ci.nsIFilePicker; - var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); - fp.init( - this.mDialog.browsingContext, - 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 -@@ -11,16 +11,18 @@ - #include "prenv.h" - #include "nsInterfaceHashtable.h" - #include "nsHashtablesFwd.h" - #include "nsHashKeys.h" - #include "nsNetUtil.h" - #include "nsISupportsPrimitives.h" - #include "nsIGSettingsService.h" - #include "nsReadableUtils.h" -+#include "nsPrintfCString.h" -+#include "nsKDEUtils.h" - - using namespace mozilla; - - class nsUnixSystemProxySettings final : public nsISystemProxySettings { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSISYSTEMPROXYSETTINGS - -@@ -34,16 +36,18 @@ class nsUnixSystemProxySettings final : - nsCOMPtr mProxySettings; - nsInterfaceHashtable - mSchemeProxySettings; - nsresult GetProxyFromGSettings(const nsACString& aScheme, - const nsACString& aHost, int32_t aPort, - nsACString& aResult); - nsresult SetProxyResultFromGSettings(const char* aKeyBase, const char* aType, - nsACString& aResult); -+ nsresult GetProxyFromKDE(const nsACString& aScheme, const nsACString& aHost, -+ PRInt32 aPort, nsACString& aResult); - }; - - NS_IMPL_ISUPPORTS(nsUnixSystemProxySettings, nsISystemProxySettings) - - NS_IMETHODIMP - nsUnixSystemProxySettings::GetMainThreadOnly(bool* aMainThreadOnly) { - // dbus prevents us from being threadsafe, but this routine should not block - // anyhow -@@ -388,24 +392,49 @@ nsresult nsUnixSystemProxySettings::GetP - return NS_OK; - } - - nsresult nsUnixSystemProxySettings::GetProxyForURI(const nsACString& aSpec, - const nsACString& aScheme, - const nsACString& aHost, - const int32_t aPort, - nsACString& aResult) { -+ if (nsKDEUtils::kdeSupport()) -+ return GetProxyFromKDE(aScheme, aHost, aPort, aResult); -+ - if (mProxySettings) { - nsresult rv = GetProxyFromGSettings(aScheme, aHost, aPort, aResult); - if (NS_SUCCEEDED(rv)) return rv; - } - - return GetProxyFromEnvironment(aScheme, aHost, aPort, aResult); - } - -+nsresult nsUnixSystemProxySettings::GetProxyFromKDE(const nsACString& aScheme, -+ const nsACString& aHost, -+ PRInt32 aPort, -+ nsACString& aResult) { -+ nsAutoCString url; -+ url = aScheme; -+ url += "://"; -+ url += aHost; -+ if (aPort >= 0) { -+ url += ":"; -+ url += nsPrintfCString("%d", aPort); -+ } -+ nsTArray command; -+ command.AppendElement("GETPROXY"_ns); -+ command.AppendElement(url); -+ nsTArray result; -+ if (!nsKDEUtils::command(command, &result) || result.Length() != 1) -+ return NS_ERROR_FAILURE; -+ aResult = result[0]; -+ return NS_OK; -+} -+ - NS_IMETHODIMP - nsUnixSystemProxySettings::GetSystemWPADSetting(bool* aSystemWPADSetting) { - *aSystemWPADSetting = false; - return NS_OK; - } - - NS_IMPL_COMPONENT_FACTORY(nsUnixSystemProxySettings) { - auto result = MakeRefPtr(); -diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build ---- a/toolkit/xre/moz.build -+++ b/toolkit/xre/moz.build -@@ -91,17 +91,19 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "co - "../components/printingui", - ] - elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "uikit": - UNIFIED_SOURCES += [ - "nsNativeAppSupportDefault.cpp", - "UIKitDirProvider.mm", - ] - elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": -+ EXPORTS += ['nsKDEUtils.h'] - UNIFIED_SOURCES += [ -+ "nsKDEUtils.cpp", - "nsNativeAppSupportUnix.cpp", - ] - CXXFLAGS += CONFIG["MOZ_X11_SM_CFLAGS"] - else: - UNIFIED_SOURCES += [ - "nsNativeAppSupportDefault.cpp", - ] - -diff --git a/toolkit/xre/nsKDEUtils.cpp b/toolkit/xre/nsKDEUtils.cpp -new file mode 100644 ---- /dev/null -+++ b/toolkit/xre/nsKDEUtils.cpp -@@ -0,0 +1,286 @@ -+/* -*- Mode: C++; tab-width: 4; 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 "nsKDEUtils.h" -+#include "nsIWidget.h" -+#include "nsISupportsPrimitives.h" -+#include "nsIMutableArray.h" -+#include "nsComponentManagerUtils.h" -+#include "nsArrayUtils.h" -+ -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+// copied from X11/X.h as a hack since for an unknown -+// reason it's not picked up from X11/X.h -+//#ifndef None -+//# define None 0L /* universal null resource or null atom */ -+//#endif -+ -+// #define DEBUG_KDE -+#ifdef DEBUG_KDE -+# define KMOZILLAHELPER "kmozillahelper" -+#else -+// not need for lib64, it's a binary -+# define KMOZILLAHELPER "/usr/lib/mozilla/kmozillahelper" -+#endif -+ -+#define KMOZILLAHELPER_VERSION 6 -+#define MAKE_STR2(n) #n -+#define MAKE_STR(n) MAKE_STR2(n) -+ -+static bool getKdeSession() { -+ if (PR_GetEnv("KDE_FULL_SESSION")) { -+ return true; -+ } -+ return false; -+} -+ -+static bool getKdeSupport() { -+ nsTArray command; -+ command.AppendElement("CHECK"_ns); -+ command.AppendElement("KMOZILLAHELPER_VERSION"_ns); -+ bool kde = nsKDEUtils::command(command); -+#ifdef DEBUG_KDE -+ fprintf(stderr, "KDE RUNNING %d\n", kde); -+#endif -+ return kde; -+} -+ -+nsKDEUtils::nsKDEUtils() : commandFile(NULL), replyFile(NULL) {} -+ -+nsKDEUtils::~nsKDEUtils() { -+ // closeHelper(); not actually useful, exiting will close the fd too -+} -+ -+nsKDEUtils* nsKDEUtils::self() { -+ static nsKDEUtils s; -+ return &s; -+} -+ -+static bool helperRunning = false; -+static bool helperFailed = false; -+ -+bool nsKDEUtils::kdeSession() { -+ static bool session = getKdeSession(); -+ return session; -+} -+ -+bool nsKDEUtils::kdeSupport() { -+ static bool support = kdeSession() && getKdeSupport(); -+ return support && helperRunning; -+} -+ -+struct nsKDECommandData { -+ FILE* file; -+ nsTArray* output; -+ GMainLoop* loop; -+ bool success; -+}; -+ -+static gboolean kdeReadFunc(GIOChannel*, GIOCondition, gpointer data) { -+ nsKDECommandData* p = static_cast(data); -+ char buf[8192]; // TODO big enough -+ bool command_done = false; -+ bool command_failed = false; -+ while (!command_done && !command_failed && -+ fgets(buf, 8192, p->file) != -+ NULL) { // TODO what if the kernel splits a line into two chunks? -+ // #ifdef DEBUG_KDE -+ // fprintf( stderr, "READ: %s %d\n", buf, feof( p->file )); -+ // #endif -+ if (char* eol = strchr(buf, '\n')) *eol = '\0'; -+ command_done = (strcmp(buf, "\\1") == 0); -+ command_failed = (strcmp(buf, "\\0") == 0); -+ nsAutoCString line(buf); -+ line.ReplaceSubstring("\\n", "\n"); -+ line.ReplaceSubstring( -+ "\\" -+ "\\", -+ "\\"); // \\ -> \ , i.e. unescape -+ if (p->output && !(command_done || command_failed)) -+ p->output->AppendElement(nsCString(buf)); // TODO utf8? -+ } -+ bool quit = false; -+ if (feof(p->file) || command_failed) { -+ quit = true; -+ p->success = false; -+ } -+ if (command_done) { // reading one reply finished -+ quit = true; -+ p->success = true; -+ } -+ if (quit) { -+ if (p->loop) g_main_loop_quit(p->loop); -+ return FALSE; -+ } -+ return TRUE; -+} -+ -+bool nsKDEUtils::command(const nsTArray& command, -+ nsTArray* output) { -+ return self()->internalCommand(command, NULL, false, output); -+} -+ -+bool nsKDEUtils::command(nsIArray* command, nsIArray** output) { -+ nsTArray in; -+ PRUint32 length; -+ command->GetLength(&length); -+ for (PRUint32 i = 0; i < length; i++) { -+ nsCOMPtr str = do_QueryElementAt(command, i); -+ if (str) { -+ nsAutoCString s; -+ str->GetData(s); -+ in.AppendElement(s); -+ } -+ } -+ -+ nsTArray out; -+ bool ret = self()->internalCommand(in, NULL, false, &out); -+ -+ if (!output) return ret; -+ -+ nsCOMPtr result = do_CreateInstance(NS_ARRAY_CONTRACTID); -+ if (!result) return false; -+ -+ for (PRUint32 i = 0; i < out.Length(); i++) { -+ nsCOMPtr rstr = -+ do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID); -+ if (!rstr) return false; -+ -+ rstr->SetData(out[i]); -+ result->AppendElement(rstr); -+ } -+ -+ NS_ADDREF(*output = result); -+ return ret; -+} -+ -+bool nsKDEUtils::commandBlockUi(const nsTArray& command, -+ GtkWindow* parent, -+ nsTArray* output) { -+ return self()->internalCommand(command, parent, true, output); -+} -+ -+bool nsKDEUtils::internalCommand(const nsTArray& command, -+ GtkWindow* parent, bool blockUi, -+ nsTArray* output) { -+ if (!startHelper()) return false; -+ feedCommand(command); -+ // do not store the data in 'this' but in extra structure, just in case there -+ // is reentrancy (can there be? the event loop is re-entered) -+ nsKDECommandData data; -+ data.file = replyFile; -+ data.output = output; -+ data.success = false; -+ if (blockUi) { -+ data.loop = g_main_loop_new(NULL, FALSE); -+ GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); -+ if (parent && gtk_window_get_group(parent)) -+ gtk_window_group_add_window(gtk_window_get_group(parent), -+ GTK_WINDOW(window)); -+ gtk_widget_realize(window); -+ gtk_widget_set_sensitive(window, TRUE); -+ gtk_grab_add(window); -+ GIOChannel* channel = g_io_channel_unix_new(fileno(data.file)); -+ g_io_add_watch(channel, -+ static_cast(G_IO_IN | G_IO_ERR | G_IO_HUP), -+ kdeReadFunc, &data); -+ g_io_channel_unref(channel); -+ g_main_loop_run(data.loop); -+ g_main_loop_unref(data.loop); -+ gtk_grab_remove(window); -+ gtk_widget_destroy(window); -+ } else { -+ data.loop = NULL; -+ while (kdeReadFunc(NULL, static_cast(0), &data)) -+ ; -+ } -+ return data.success; -+} -+ -+bool nsKDEUtils::startHelper() { -+ if (helperRunning) return true; -+ if (helperFailed) return false; -+ helperFailed = true; -+ int fdcommand[2]; -+ int fdreply[2]; -+ if (pipe(fdcommand) < 0) return false; -+ if (pipe(fdreply) < 0) { -+ close(fdcommand[0]); -+ close(fdcommand[1]); -+ return false; -+ } -+ char* args[2] = {const_cast(KMOZILLAHELPER), NULL}; -+ switch (fork()) { -+ case -1: { -+ close(fdcommand[0]); -+ close(fdcommand[1]); -+ close(fdreply[0]); -+ close(fdreply[1]); -+ return false; -+ } -+ case 0: // child -+ { -+ if (dup2(fdcommand[0], STDIN_FILENO) < 0) _exit(1); -+ if (dup2(fdreply[1], STDOUT_FILENO) < 0) _exit(1); -+ int maxfd = 1024; // close all other fds -+ struct rlimit rl; -+ if (getrlimit(RLIMIT_NOFILE, &rl) == 0) maxfd = rl.rlim_max; -+ for (int i = 3; i < maxfd; ++i) close(i); -+#ifdef DEBUG_KDE -+ execvp(KMOZILLAHELPER, args); -+#else -+ execv(KMOZILLAHELPER, args); -+#endif -+ _exit(1); // failed -+ } -+ default: // parent -+ { -+ commandFile = fdopen(fdcommand[1], "w"); -+ replyFile = fdopen(fdreply[0], "r"); -+ close(fdcommand[0]); -+ close(fdreply[1]); -+ if (commandFile == NULL || replyFile == NULL) { -+ closeHelper(); -+ return false; -+ } -+ // ok, helper ready, getKdeRunning() will check if it works -+ } -+ } -+ helperFailed = false; -+ helperRunning = true; -+ return true; -+} -+ -+void nsKDEUtils::closeHelper() { -+ if (commandFile != NULL) -+ fclose(commandFile); // this will also make the helper quit -+ if (replyFile != NULL) fclose(replyFile); -+ helperRunning = false; -+} -+ -+void nsKDEUtils::feedCommand(const nsTArray& command) { -+ for (int i = 0; i < command.Length(); ++i) { -+ nsCString line = command[i]; -+ line.ReplaceSubstring("\\", -+ "\\" -+ "\\"); // \ -> \\ , i.e. escape -+ line.ReplaceSubstring("\n", "\\n"); -+#ifdef DEBUG_KDE -+ fprintf(stderr, "COMM: %s\n", line.get()); -+#endif -+ fputs(line.get(), commandFile); -+ fputs("\n", commandFile); -+ } -+ fputs("\\E\n", -+ commandFile); // done as \E, so it cannot happen in normal data -+ fflush(commandFile); -+} -diff --git a/toolkit/xre/nsKDEUtils.h b/toolkit/xre/nsKDEUtils.h -new file mode 100644 ---- /dev/null -+++ b/toolkit/xre/nsKDEUtils.h -@@ -0,0 +1,53 @@ -+/* -*- 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 -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+#ifndef nsKDEUtils_h__ -+#define nsKDEUtils_h__ -+ -+#include "nsString.h" -+#include "nsTArray.h" -+#include -+ -+typedef struct _GtkWindow GtkWindow; -+ -+class nsIArray; -+ -+class NS_EXPORT nsKDEUtils { -+ public: -+ /* Returns true if running inside a KDE session (regardless of whether there -+ is KDE support available for Firefox). This should be used e.g. when -+ determining dialog button order but not for code that requires the KDE -+ support. */ -+ static bool kdeSession(); -+ /* Returns true if running inside a KDE session and KDE support is available -+ for Firefox. This should be used everywhere where the external helper is -+ needed. */ -+ static bool kdeSupport(); -+ /* Executes the given helper command, returns true if helper returned success. -+ */ -+ static bool command(const nsTArray& command, -+ nsTArray* output = NULL); -+ static bool command(nsIArray* command, nsIArray** output = NULL); -+ /* Like command(), but additionally blocks the parent widget like if there was -+ a modal dialog shown and enters the event loop (i.e. there are still paint -+ updates, this is for commands that take long). */ -+ static bool commandBlockUi(const nsTArray& command, -+ GtkWindow* parent, -+ nsTArray* output = NULL); -+ -+ private: -+ nsKDEUtils(); -+ ~nsKDEUtils(); -+ static nsKDEUtils* self(); -+ bool startHelper(); -+ void closeHelper(); -+ void feedCommand(const nsTArray& command); -+ bool internalCommand(const nsTArray& command, GtkWindow* parent, -+ bool isParent, nsTArray* output); -+ FILE* commandFile; -+ FILE* replyFile; -+}; -+ -+#endif // nsKDEUtils -diff --git a/uriloader/exthandler/HandlerServiceParent.cpp b/uriloader/exthandler/HandlerServiceParent.cpp ---- a/uriloader/exthandler/HandlerServiceParent.cpp -+++ b/uriloader/exthandler/HandlerServiceParent.cpp -@@ -13,17 +13,17 @@ - #include "ContentHandlerService.h" - #include "nsIExternalProtocolService.h" - #include "nsStringEnumerator.h" - #include "nsIMutableArray.h" - #include "nsCExternalHandlerService.h" - #include "nsComponentManagerUtils.h" - #include "nsServiceManagerUtils.h" - #ifdef MOZ_WIDGET_GTK --# include "unix/nsGNOMERegistry.h" -+# include "unix/nsCommonRegistry.h" - #endif - - using mozilla::dom::ContentHandlerService; - using mozilla::dom::HandlerApp; - using mozilla::dom::HandlerInfo; - using mozilla::dom::RemoteHandlerApp; - - namespace { -@@ -309,18 +309,18 @@ mozilla::ipc::IPCResult HandlerServicePa - mozilla::ipc::IPCResult HandlerServiceParent::RecvExistsForProtocolOS( - const nsACString& 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(PromiseFlatCString(aProtocolScheme).get()); -+ *aHandlerExists = nsCommonRegistry::HandlerExists( -+ PromiseFlatCString(aProtocolScheme).get()); - #else - *aHandlerExists = false; - #endif - return IPC_OK(); - } - - /* - * Check if a handler exists for the provided protocol. Check the datastore -diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build ---- a/uriloader/exthandler/moz.build -+++ b/uriloader/exthandler/moz.build -@@ -81,17 +81,19 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "ui - else: - # These files can't be built in unified mode because they redefine LOG. - SOURCES += [ - osdir + "/nsOSHelperAppService.cpp", - ] - - if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - UNIFIED_SOURCES += [ -+ "unix/nsCommonRegistry.cpp", - "unix/nsGNOMERegistry.cpp", -+ "unix/nsKDERegistry.cpp", - "unix/nsMIMEInfoUnix.cpp", - ] - elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "android": - UNIFIED_SOURCES += [ - "android/nsMIMEInfoAndroid.cpp", - ] - elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "windows": - UNIFIED_SOURCES += [ -@@ -130,15 +132,16 @@ include("/ipc/chromium/chromium-config.m - FINAL_LIBRARY = "xul" - - LOCAL_INCLUDES += [ - "/docshell/base", - "/dom/base", - "/dom/ipc", - "/netwerk/base", - "/netwerk/protocol/http", -+ "/toolkit/xre", - ] - - if CONFIG["MOZ_ENABLE_DBUS"]: - CXXFLAGS += CONFIG["MOZ_DBUS_CFLAGS"] - - if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] -diff --git a/uriloader/exthandler/unix/nsCommonRegistry.cpp b/uriloader/exthandler/unix/nsCommonRegistry.cpp -new file mode 100644 ---- /dev/null -+++ b/uriloader/exthandler/unix/nsCommonRegistry.cpp -@@ -0,0 +1,42 @@ -+/* -*- 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 -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+#include "nsCommonRegistry.h" -+ -+#include "nsGNOMERegistry.h" -+#include "nsKDERegistry.h" -+#include "nsString.h" -+#include "nsKDEUtils.h" -+ -+/* static */ bool nsCommonRegistry::HandlerExists(const char* aProtocolScheme) { -+ if (nsKDEUtils::kdeSupport()) -+ return nsKDERegistry::HandlerExists(aProtocolScheme); -+ return nsGNOMERegistry::HandlerExists(aProtocolScheme); -+} -+ -+/* static */ nsresult nsCommonRegistry::LoadURL(nsIURI* aURL) { -+ if (nsKDEUtils::kdeSupport()) return nsKDERegistry::LoadURL(aURL); -+ return nsGNOMERegistry::LoadURL(aURL); -+} -+ -+/* static */ void nsCommonRegistry::GetAppDescForScheme( -+ const nsACString& aScheme, nsAString& aDesc) { -+ if (nsKDEUtils::kdeSupport()) -+ return nsKDERegistry::GetAppDescForScheme(aScheme, aDesc); -+ return nsGNOMERegistry::GetAppDescForScheme(aScheme, aDesc); -+} -+ -+/* static */ already_AddRefed -+nsCommonRegistry::GetFromExtension(const nsACString& aFileExt) { -+ if (nsKDEUtils::kdeSupport()) -+ return nsKDERegistry::GetFromExtension(aFileExt); -+ return nsGNOMERegistry::GetFromExtension(aFileExt); -+} -+ -+/* static */ already_AddRefed nsCommonRegistry::GetFromType( -+ const nsACString& aMIMEType) { -+ if (nsKDEUtils::kdeSupport()) return nsKDERegistry::GetFromType(aMIMEType); -+ return nsGNOMERegistry::GetFromType(aMIMEType); -+} -diff --git a/uriloader/exthandler/unix/nsCommonRegistry.h b/uriloader/exthandler/unix/nsCommonRegistry.h -new file mode 100644 ---- /dev/null -+++ b/uriloader/exthandler/unix/nsCommonRegistry.h -@@ -0,0 +1,28 @@ -+/* 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 nsCommonRegistry_h__ -+#define nsCommonRegistry_h__ -+ -+#include "nsIURI.h" -+#include "nsCOMPtr.h" -+ -+class nsMIMEInfoBase; -+ -+class nsCommonRegistry { -+ public: -+ static bool HandlerExists(const char* aProtocolScheme); -+ -+ static nsresult LoadURL(nsIURI* aURL); -+ -+ static void GetAppDescForScheme(const nsACString& aScheme, nsAString& aDesc); -+ -+ static already_AddRefed GetFromExtension( -+ const nsACString& aFileExt); -+ -+ static already_AddRefed GetFromType( -+ const nsACString& aMIMEType); -+}; -+ -+#endif -diff --git a/uriloader/exthandler/unix/nsKDERegistry.cpp b/uriloader/exthandler/unix/nsKDERegistry.cpp -new file mode 100644 ---- /dev/null -+++ b/uriloader/exthandler/unix/nsKDERegistry.cpp -@@ -0,0 +1,75 @@ -+/* -*- 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 -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+#include "mozilla/StaticPrefs_browser.h" -+#include "nsKDERegistry.h" -+#include "prlink.h" -+#include "prmem.h" -+#include "nsString.h" -+#include "nsMIMEInfoUnix.h" -+#include "nsKDEUtils.h" -+ -+/* static */ bool nsKDERegistry::HandlerExists(const char* aProtocolScheme) { -+ nsTArray command; -+ command.AppendElement("HANDLEREXISTS"_ns); -+ command.AppendElement(nsAutoCString(aProtocolScheme)); -+ return nsKDEUtils::command(command); -+} -+ -+/* static */ nsresult nsKDERegistry::LoadURL(nsIURI* aURL) { -+ nsTArray command; -+ command.AppendElement("OPEN"_ns); -+ nsCString url; -+ aURL->GetSpec(url); -+ command.AppendElement(url); -+ bool rv = nsKDEUtils::command(command); -+ if (!rv) return NS_ERROR_FAILURE; -+ -+ return NS_OK; -+} -+ -+/* static */ void nsKDERegistry::GetAppDescForScheme(const nsACString& aScheme, -+ nsAString& aDesc) { -+ nsTArray command; -+ command.AppendElement("GETAPPDESCFORSCHEME"_ns); -+ command.AppendElement(aScheme); -+ nsTArray output; -+ if (nsKDEUtils::command(command, &output) && output.Length() == 1) -+ CopyUTF8toUTF16(output[0], aDesc); -+} -+ -+/* static */ already_AddRefed nsKDERegistry::GetFromExtension( -+ const nsACString& aFileExt) { -+ NS_ASSERTION(aFileExt[0] != '.', "aFileExt shouldn't start with a dot"); -+ nsTArray command; -+ command.AppendElement("GETFROMEXTENSION"_ns); -+ command.AppendElement(aFileExt); -+ return GetFromHelper(command); -+} -+ -+/* static */ already_AddRefed nsKDERegistry::GetFromType( -+ const nsACString& aMIMEType) { -+ nsTArray command; -+ command.AppendElement("GETFROMTYPE"_ns); -+ command.AppendElement(aMIMEType); -+ return GetFromHelper(command); -+} -+ -+/* static */ already_AddRefed nsKDERegistry::GetFromHelper( -+ const nsTArray& command) { -+ nsTArray output; -+ if (nsKDEUtils::command(command, &output) && output.Length() == 3) { -+ nsCString mimetype = output[0]; -+ RefPtr mimeInfo = new nsMIMEInfoUnix(mimetype); -+ NS_ENSURE_TRUE(mimeInfo, nullptr); -+ nsCString description = output[1]; -+ mimeInfo->SetDescription(NS_ConvertUTF8toUTF16(description)); -+ nsCString handlerAppName = output[2]; -+ mimeInfo->SetPreferredAction(nsIMIMEInfo::saveToDisk); -+ mimeInfo->SetDefaultDescription(NS_ConvertUTF8toUTF16(handlerAppName)); -+ return mimeInfo.forget(); -+ } -+ return nullptr; -+} -diff --git a/uriloader/exthandler/unix/nsKDERegistry.h b/uriloader/exthandler/unix/nsKDERegistry.h -new file mode 100644 ---- /dev/null -+++ b/uriloader/exthandler/unix/nsKDERegistry.h -@@ -0,0 +1,35 @@ -+/* 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 nsKDERegistry_h__ -+#define nsKDERegistry_h__ -+ -+#include "nsIURI.h" -+#include "nsCOMPtr.h" -+#include "nsTArray.h" -+ -+class nsMIMEInfoBase; -+// class nsAutoCString; -+// class nsCString; -+ -+class nsKDERegistry { -+ public: -+ static bool HandlerExists(const char* aProtocolScheme); -+ -+ static nsresult LoadURL(nsIURI* aURL); -+ -+ static void GetAppDescForScheme(const nsACString& aScheme, nsAString& aDesc); -+ -+ static already_AddRefed GetFromExtension( -+ const nsACString& aFileExt); -+ -+ static already_AddRefed GetFromType( -+ const nsACString& aMIMEType); -+ -+ private: -+ static already_AddRefed GetFromHelper( -+ const nsTArray& command); -+}; -+ -+#endif // nsKDERegistry_h__ -diff --git a/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp b/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp ---- a/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp -+++ b/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp -@@ -1,27 +1,30 @@ - /* -*- Mode: C++; tab-width: 3; 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 - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - #include "nsMIMEInfoUnix.h" --#include "nsGNOMERegistry.h" -+#include "nsCommonRegistry.h" - #include "nsIGIOService.h" - #include "nsNetCID.h" - #include "nsIIOService.h" - #include "nsLocalFile.h" - - #ifdef MOZ_ENABLE_DBUS - # include "nsDBusHandlerApp.h" - #endif -+#if defined(XP_UNIX) && !defined(XP_MACOSX) -+# include "nsKDEUtils.h" -+#endif - - nsresult nsMIMEInfoUnix::LoadUriInternal(nsIURI* aURI) { -- return nsGNOMERegistry::LoadURL(aURI); -+ return nsCommonRegistry::LoadURL(aURI); - } - - NS_IMETHODIMP nsMIMEInfoUnix::GetDefaultExecutable(nsIFile** aExecutable) { - // This needs to be implemented before FirefoxBridge will work on Linux. - // To implement this and be consistent, GetHasDefaultHandler and - // LaunchDefaultWithFile should probably be made to be consistent. - // Right now, they aren't. GetHasDefaultHandler reports true in cases - // where calling LaunchDefaultWithFile will fail due to not finding the -@@ -37,25 +40,25 @@ nsMIMEInfoUnix::GetHasDefaultHandler(boo - // give the GNOME answer. - if (GetDefaultApplication()) { - return nsMIMEInfoImpl::GetHasDefaultHandler(_retval); - } - - *_retval = false; - - if (mClass == eProtocolInfo) { -- *_retval = nsGNOMERegistry::HandlerExists(mSchemeOrType.get()); -+ *_retval = nsCommonRegistry::HandlerExists(mSchemeOrType.get()); - } else { - RefPtr mimeInfo = -- nsGNOMERegistry::GetFromType(mSchemeOrType); -+ nsCommonRegistry::GetFromType(mSchemeOrType); - if (!mimeInfo) { - nsAutoCString ext; - nsresult rv = GetPrimaryExtension(ext); - if (NS_SUCCEEDED(rv)) { -- mimeInfo = nsGNOMERegistry::GetFromExtension(ext); -+ mimeInfo = nsCommonRegistry::GetFromExtension(ext); - } - } - if (mimeInfo) *_retval = true; - } - - if (*_retval) return NS_OK; - - return NS_OK; -@@ -67,16 +70,31 @@ nsresult nsMIMEInfoUnix::LaunchDefaultWi - // give the GNOME answer. - if (GetDefaultApplication()) { - return nsMIMEInfoImpl::LaunchDefaultWithFile(aFile); - } - - nsAutoCString nativePath; - aFile->GetNativePath(nativePath); - -+ if (nsKDEUtils::kdeSupport()) { -+ bool supports; -+ if (NS_SUCCEEDED(GetHasDefaultHandler(&supports)) && supports) { -+ nsTArray command; -+ command.AppendElement("OPEN"_ns); -+ command.AppendElement(nativePath); -+ command.AppendElement("MIMETYPE"_ns); -+ command.AppendElement(mSchemeOrType); -+ if (nsKDEUtils::command(command)) return NS_OK; -+ } -+ if (!GetDefaultApplication()) return NS_ERROR_FILE_NOT_FOUND; -+ -+ return LaunchWithIProcess(GetDefaultApplication(), nativePath); -+ } -+ - nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); - if (!giovfs) { - return NS_ERROR_FAILURE; - } - - // nsGIOMimeApp->Launch wants a URI string instead of local file - nsresult rv; - nsCOMPtr ioservice = -diff --git a/uriloader/exthandler/unix/nsOSHelperAppService.cpp b/uriloader/exthandler/unix/nsOSHelperAppService.cpp ---- a/uriloader/exthandler/unix/nsOSHelperAppService.cpp -+++ b/uriloader/exthandler/unix/nsOSHelperAppService.cpp -@@ -5,17 +5,17 @@ - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - #include - #include - - #include "nsOSHelperAppService.h" - #include "nsMIMEInfoUnix.h" - #ifdef MOZ_WIDGET_GTK --# include "nsGNOMERegistry.h" -+# include "nsCommonRegistry.h" - # ifdef MOZ_BUILD_APP_IS_BROWSER - # include "nsIToolkitShellService.h" - # include "nsIGNOMEShellService.h" - # endif - #endif - #include "nsISupports.h" - #include "nsString.h" - #include "nsReadableUtils.h" -@@ -1101,17 +1101,17 @@ nsresult nsOSHelperAppService::GetHandle - - nsresult nsOSHelperAppService::OSProtocolHandlerExists( - const char* aProtocolScheme, bool* aHandlerExists) { - nsresult rv = NS_OK; - - if (!XRE_IsContentProcess()) { - #ifdef MOZ_WIDGET_GTK - // Check the GNOME registry for a protocol handler -- *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme); -+ *aHandlerExists = nsCommonRegistry::HandlerExists(aProtocolScheme); - #else - *aHandlerExists = false; - #endif - } else { - *aHandlerExists = false; - nsCOMPtr handlerSvc = - do_GetService(NS_HANDLERSERVICE_CONTRACTID, &rv); - if (NS_SUCCEEDED(rv) && handlerSvc) { -@@ -1121,17 +1121,17 @@ nsresult nsOSHelperAppService::OSProtoco - } - - return rv; - } - - NS_IMETHODIMP nsOSHelperAppService::GetApplicationDescription( - const nsACString& aScheme, nsAString& _retval) { - #ifdef MOZ_WIDGET_GTK -- nsGNOMERegistry::GetAppDescForScheme(aScheme, _retval); -+ nsCommonRegistry::GetAppDescForScheme(aScheme, _retval); - return _retval.IsEmpty() ? NS_ERROR_NOT_AVAILABLE : NS_OK; - #else - return NS_ERROR_NOT_AVAILABLE; - #endif - } - - NS_IMETHODIMP nsOSHelperAppService::IsCurrentAppOSDefaultForProtocol( - const nsACString& aScheme, bool* _retval) { -@@ -1226,17 +1226,17 @@ already_AddRefed nsOSHel - nsresult rv = - LookUpTypeAndDescription(NS_ConvertUTF8toUTF16(aFileExt), majorType, - minorType, mime_types_description, true); - - if (NS_FAILED(rv) || majorType.IsEmpty()) { - #ifdef MOZ_WIDGET_GTK - LOG("Looking in GNOME registry\n"); - RefPtr gnomeInfo = -- nsGNOMERegistry::GetFromExtension(aFileExt); -+ nsCommonRegistry::GetFromExtension(aFileExt); - if (gnomeInfo) { - LOG("Got MIMEInfo from GNOME registry\n"); - return gnomeInfo.forget(); - } - #endif - - rv = LookUpTypeAndDescription(NS_ConvertUTF8toUTF16(aFileExt), majorType, - minorType, mime_types_description, false); -@@ -1339,17 +1339,17 @@ already_AddRefed nsOSHel - - // Now look up our extensions - nsAutoString extensions, mime_types_description; - LookUpExtensionsAndDescription(majorType, minorType, extensions, - mime_types_description); - - #ifdef MOZ_WIDGET_GTK - if (handler.IsEmpty()) { -- RefPtr gnomeInfo = nsGNOMERegistry::GetFromType(aMIMEType); -+ RefPtr gnomeInfo = nsCommonRegistry::GetFromType(aMIMEType); - if (gnomeInfo) { - LOG("Got MIMEInfo from GNOME registry without extensions; setting them " - "to %s\n", - NS_LossyConvertUTF16toASCII(extensions).get()); - - NS_ASSERTION(!gnomeInfo->HasExtensions(), "How'd that happen?"); - gnomeInfo->SetFileExtensions(NS_ConvertUTF16toUTF8(extensions)); - return gnomeInfo.forget(); -diff --git a/widget/gtk/moz.build b/widget/gtk/moz.build ---- a/widget/gtk/moz.build -+++ b/widget/gtk/moz.build -@@ -146,16 +146,17 @@ FINAL_LIBRARY = "xul" - - LOCAL_INCLUDES += [ - "/layout/base", - "/layout/forms", - "/layout/generic", - "/layout/xul", - "/other-licenses/atk-1.0", - "/third_party/cups/include", -+ "/toolkit/xre", - "/widget", - "/widget/headless", - "/widget/x11", - ] - - DEFINES["CAIRO_GFX"] = True - - DEFINES["MOZ_APP_NAME"] = '"%s"' % CONFIG["MOZ_APP_NAME"] -diff --git a/widget/gtk/nsFilePicker.cpp b/widget/gtk/nsFilePicker.cpp ---- a/widget/gtk/nsFilePicker.cpp -+++ b/widget/gtk/nsFilePicker.cpp -@@ -1,15 +1,16 @@ - /* -*- 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 - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - #include - #include -+#include - #include - #include - #include - - #include "mozilla/Types.h" - #include "AsyncDBus.h" - #include "nsGtkUtils.h" - #include "nsIFileURL.h" -@@ -25,16 +26,18 @@ - #include "nsArrayEnumerator.h" - #include "nsEnumeratorUtils.h" - #include "nsNetUtil.h" - #include "nsReadableUtils.h" - #include "MozContainer.h" - #include "WidgetUtilsGtk.h" - - #include "nsFilePicker.h" -+#include "nsKDEUtils.h" -+#include "nsURLHelper.h" - - #undef LOG - #ifdef MOZ_LOGGING - # include "mozilla/Logging.h" - # include "nsTArray.h" - # include "Units.h" - extern mozilla::LazyLogModule gWidgetLog; - # define LOG(args) MOZ_LOG(gWidgetLog, mozilla::LogLevel::Debug, args) -@@ -302,17 +305,18 @@ nsFilePicker::AppendFilters(int32_t aFil - mAllowURLs = !!(aFilterMask & filterAllowURLs); - return nsBaseFilePicker::AppendFilters(aFilterMask); - } - - NS_IMETHODIMP - nsFilePicker::AppendFilter(const nsAString& aTitle, const nsAString& aFilter) { - if (aFilter.EqualsLiteral("..apps")) { - // No platform specific thing we can do here, really.... -- return NS_OK; -+ // Unless it's KDE. -+ if (mMode != modeOpen || !nsKDEUtils::kdeSupport()) return NS_OK; - } - - nsAutoCString filter, name; - CopyUTF16toUTF8(aFilter, filter); - CopyUTF16toUTF8(aTitle, name); - - mFilters.AppendElement(filter); - mFilterNames.AppendElement(name); -@@ -416,16 +420,39 @@ NS_IMETHODIMP - nsFilePicker::Open(nsIFilePickerShownCallback* aCallback) { - // Can't show two dialogs concurrently with the same filepicker - if (mFileChooser) return NS_ERROR_NOT_AVAILABLE; - - if (MaybeBlockFilePicker(aCallback)) { - return NS_OK; - } - -+ // KDE file picker is not handled via callback -+ if (nsKDEUtils::kdeSupport()) { -+ mCallback = aCallback; -+ NS_ADDREF_THIS(); -+ g_idle_add( -+ [](gpointer data) -> gboolean { -+ nsFilePicker* queuedPicker = (nsFilePicker*)data; -+ nsIFilePicker::ResultCode result; -+ queuedPicker->kdeFileDialog(&result); -+ if (queuedPicker->mCallback) { -+ queuedPicker->mCallback->Done(result); -+ queuedPicker->mCallback = nullptr; -+ } else { -+ queuedPicker->mResult = result; -+ } -+ NS_RELEASE(queuedPicker); -+ return G_SOURCE_REMOVE; -+ }, -+ this); -+ -+ return NS_OK; -+ } -+ - NS_ConvertUTF16toUTF8 title(mTitle); - - GtkWindow* parent_widget = - GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)); - - GtkFileChooserAction action = GetGtkFileChooserAction(mMode); - - const gchar* accept_button; -@@ -697,16 +724,215 @@ void nsFilePicker::Done(void* file_choos - mCallback->Done(result); - mCallback = nullptr; - } else { - mResult = result; - } - NS_RELEASE_THIS(); - } - -+nsCString nsFilePicker::kdeMakeFilter(int index) { -+ nsCString buf = mFilters[index]; -+ for (PRUint32 i = 0; i < buf.Length(); ++i) -+ if (buf[i] == ';') // KDE separates just using spaces -+ buf.SetCharAt(' ', i); -+ if (!mFilterNames[index].IsEmpty()) { -+ buf += "|"; -+ buf += mFilterNames[index].get(); -+ } -+ return buf; -+} -+ -+static PRInt32 windowToXid(nsIWidget* widget) { -+ GtkWindow* parent_widget = -+ GTK_WINDOW(widget->GetNativeData(NS_NATIVE_SHELLWIDGET)); -+ GdkWindow* gdk_window = -+ gtk_widget_get_window(gtk_widget_get_toplevel(GTK_WIDGET(parent_widget))); -+ return GDK_WINDOW_XID(gdk_window); -+} -+ -+NS_IMETHODIMP nsFilePicker::kdeFileDialog(nsIFilePicker::ResultCode* aReturn) { -+ NS_ENSURE_ARG_POINTER(aReturn); -+ -+ if (mMode == modeOpen && mFilters.Length() == 1 && -+ mFilters[0].EqualsLiteral("..apps")) -+ return kdeAppsDialog(aReturn); -+ -+ nsCString title; -+ title.Adopt(ToNewUTF8String(mTitle)); -+ -+ const char* arg = NULL; -+ if (mAllowURLs) { -+ switch (mMode) { -+ case nsIFilePicker::modeOpen: -+ case nsIFilePicker::modeOpenMultiple: -+ arg = "GETOPENURL"; -+ break; -+ case nsIFilePicker::modeSave: -+ arg = "GETSAVEURL"; -+ break; -+ case nsIFilePicker::modeGetFolder: -+ arg = "GETDIRECTORYURL"; -+ break; -+ } -+ } else { -+ switch (mMode) { -+ case nsIFilePicker::modeOpen: -+ case nsIFilePicker::modeOpenMultiple: -+ arg = "GETOPENFILENAME"; -+ break; -+ case nsIFilePicker::modeSave: -+ arg = "GETSAVEFILENAME"; -+ break; -+ case nsIFilePicker::modeGetFolder: -+ arg = "GETDIRECTORYFILENAME"; -+ break; -+ } -+ } -+ -+ nsAutoCString directory; -+ if (mDisplayDirectory) { -+ mDisplayDirectory->GetNativePath(directory); -+ } else if (mPrevDisplayDirectory) { -+ mPrevDisplayDirectory->GetNativePath(directory); -+ } -+ -+ nsAutoCString startdir; -+ if (!directory.IsEmpty()) { -+ startdir = directory; -+ } -+ if (mMode == nsIFilePicker::modeSave) { -+ if (!startdir.IsEmpty()) { -+ startdir += "/"; -+ startdir += ToNewUTF8String(mDefault); -+ } else -+ startdir = ToNewUTF8String(mDefault); -+ } -+ -+ nsAutoCString filters; -+ PRInt32 count = mFilters.Length(); -+ if (count == 0) // just in case -+ filters = "*"; -+ else { -+ filters = kdeMakeFilter(0); -+ for (PRInt32 i = 1; i < count; ++i) { -+ filters += "\n"; -+ filters += kdeMakeFilter(i); -+ } -+ } -+ -+ nsTArray command; -+ command.AppendElement(nsAutoCString(arg)); -+ command.AppendElement(startdir); -+ if (mMode != nsIFilePicker::modeGetFolder) { -+ command.AppendElement(filters); -+ nsAutoCString selected; -+ selected.AppendInt(mSelectedType); -+ command.AppendElement(selected); -+ } -+ command.AppendElement(title); -+ if (mMode == nsIFilePicker::modeOpenMultiple) -+ command.AppendElement("MULTIPLE"_ns); -+ if (PRInt32 xid = windowToXid(mParentWidget)) { -+ command.AppendElement("PARENT"_ns); -+ nsAutoCString parent; -+ parent.AppendInt(xid); -+ command.AppendElement(parent); -+ } -+ -+ nsTArray output; -+ if (nsKDEUtils::commandBlockUi( -+ command, -+ GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)), -+ &output)) { -+ *aReturn = nsIFilePicker::returnOK; -+ mFiles.Clear(); -+ if (mMode != nsIFilePicker::modeGetFolder) { -+ mSelectedType = atoi(output[0].get()); -+ output.RemoveElementAt(0); -+ } -+ if (mMode == nsIFilePicker::modeOpenMultiple) { -+ mFileURL.Truncate(); -+ PRUint32 count = output.Length(); -+ for (PRUint32 i = 0; i < count; ++i) { -+ nsCOMPtr localfile; -+ nsresult rv = NS_NewNativeLocalFile(output[i], PR_FALSE, -+ getter_AddRefs(localfile)); -+ if (NS_SUCCEEDED(rv)) mFiles.AppendObject(localfile); -+ } -+ } else { -+ if (output.Length() == 0) -+ mFileURL = nsCString(); -+ else if (mAllowURLs) -+ mFileURL = output[0]; -+ else // GetFile() actually requires it to be url even for local files :-/ -+ { -+ nsCOMPtr localfile; -+ nsresult rv = NS_NewNativeLocalFile(output[0], PR_FALSE, -+ getter_AddRefs(localfile)); -+ if (NS_SUCCEEDED(rv)) -+ rv = net_GetURLSpecFromActualFile(localfile, mFileURL); -+ } -+ } -+ // Remember last used directory. -+ nsCOMPtr file; -+ GetFile(getter_AddRefs(file)); -+ if (file) { -+ nsCOMPtr dir; -+ file->GetParent(getter_AddRefs(dir)); -+ nsCOMPtr localDir(dir); -+ if (localDir) { -+ localDir.swap(mPrevDisplayDirectory); -+ } -+ } -+ if (mMode == nsIFilePicker::modeSave) { -+ nsCOMPtr file; -+ GetFile(getter_AddRefs(file)); -+ if (file) { -+ bool exists = false; -+ file->Exists(&exists); -+ if (exists) // TODO do overwrite check in the helper app -+ *aReturn = nsIFilePicker::returnReplace; -+ } -+ } -+ } else { -+ *aReturn = nsIFilePicker::returnCancel; -+ } -+ return NS_OK; -+} -+ -+NS_IMETHODIMP nsFilePicker::kdeAppsDialog(nsIFilePicker::ResultCode* aReturn) { -+ NS_ENSURE_ARG_POINTER(aReturn); -+ -+ nsCString title; -+ title.Adopt(ToNewUTF8String(mTitle)); -+ -+ nsTArray command; -+ command.AppendElement("APPSDIALOG"_ns); -+ command.AppendElement(title); -+ if (PRInt32 xid = windowToXid(mParentWidget)) { -+ command.AppendElement("PARENT"_ns); -+ nsAutoCString parent; -+ parent.AppendInt(xid); -+ command.AppendElement(parent); -+ } -+ -+ nsTArray output; -+ if (nsKDEUtils::commandBlockUi( -+ command, -+ GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)), -+ &output)) { -+ *aReturn = nsIFilePicker::returnOK; -+ mFileURL = output.Length() > 0 ? output[0] : nsCString(); -+ } else { -+ *aReturn = nsIFilePicker::returnCancel; -+ } -+ return NS_OK; -+} -+ - // All below functions available as of GTK 3.20+ - void* nsFilePicker::GtkFileChooserNew(const gchar* title, GtkWindow* parent, - GtkFileChooserAction action, - const gchar* accept_label) { - static auto sGtkFileChooserNativeNewPtr = - (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 -@@ -70,16 +70,22 @@ class nsFilePicker : public nsBaseFilePi - nsString mDefaultExtension; - - nsTArray mFilters; - nsTArray mFilterNames; - - private: - static nsIFile* mPrevDisplayDirectory; - -+ bool kdeRunning(); -+ bool getKdeRunning(); -+ NS_IMETHODIMP kdeFileDialog(nsIFilePicker::ResultCode* aReturn); -+ NS_IMETHODIMP kdeAppsDialog(nsIFilePicker::ResultCode* aReturn); -+ nsCString kdeMakeFilter(int index); -+ - 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, - gboolean modal); - -diff --git a/xpcom/components/ManifestParser.cpp b/xpcom/components/ManifestParser.cpp ---- a/xpcom/components/ManifestParser.cpp -+++ b/xpcom/components/ManifestParser.cpp -@@ -38,16 +38,17 @@ - #include "nsTextFormatter.h" - #include "nsVersionComparator.h" - #include "nsXPCOMCIDInternal.h" - - #include "nsIConsoleService.h" - #include "nsIScriptError.h" - #include "nsIXULAppInfo.h" - #include "nsIXULRuntime.h" -+#include "nsKDEUtils.h" - - using namespace mozilla; - - struct ManifestDirective { - const char* directive; - int argc; - - bool ischrome; -@@ -389,16 +390,17 @@ void ParseManifest(NSLocationType aType, - constexpr auto kRemoteEnabled = u"remoteenabled"_ns; - constexpr auto kRemoteRequired = u"remoterequired"_ns; - constexpr auto kApplication = u"application"_ns; - constexpr auto kAppVersion = u"appversion"_ns; - constexpr auto kGeckoVersion = u"platformversion"_ns; - constexpr auto kOs = u"os"_ns; - constexpr auto kOsVersion = u"osversion"_ns; - constexpr auto kABI = u"abi"_ns; -+ constexpr auto kDesktop = u"desktop"_ns; - constexpr auto kProcess = u"process"_ns; - #if defined(MOZ_WIDGET_ANDROID) - constexpr auto kTablet = u"tablet"_ns; - #endif - // You might expect this to be guarded by MOZ_BACKGROUNDTASKS, but it's not - // possible to have conditional manifest contents, so we need to recognize and - // discard these tokens even when MOZ_BACKGROUNDTASKS is not set. - constexpr auto kBackgroundTask = u"backgroundtask"_ns; -@@ -448,39 +450,44 @@ void ParseManifest(NSLocationType aType, - CopyUTF8toUTF16(s, abi); - abi.Insert(char16_t('_'), 0); - abi.Insert(osTarget, 0); - } - } - } - - nsAutoString osVersion; -+ nsAutoString desktop; - #if defined(XP_WIN) - # 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 = u"win"_ns; - # pragma warning(pop) - #elif defined(MOZ_WIDGET_COCOA) - SInt32 majorVersion = nsCocoaFeatures::macOSVersionMajor(); - SInt32 minorVersion = nsCocoaFeatures::macOSVersionMinor(); - nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", majorVersion, minorVersion); -+ desktop = u"macosx"_ns); - #elif defined(MOZ_WIDGET_GTK) - nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", gtk_major_version, - gtk_minor_version); -+ desktop = nsKDEUtils::kdeSession() ? u"kde"_ns : u"gnome"_ns; - #elif defined(MOZ_WIDGET_ANDROID) - bool isTablet = false; - if (jni::IsAvailable()) { - jni::String::LocalRef release = java::sdk::Build::VERSION::RELEASE(); - osVersion.Assign(release->ToString()); - isTablet = java::GeckoAppShell::IsTablet(); - } -+ desktop = u"android"_ns; - #endif - - if (XRE_IsContentProcess()) { - process = kContent; - } else { - process = kMain; - } - -@@ -571,25 +578,27 @@ void ParseManifest(NSLocationType aType, - // When in background task mode, default to not registering - // category directivies unless backgroundtask=1 is specified. - TriState stBackgroundTask = (BackgroundTasks::IsBackgroundTaskMode() && - strcmp("category", directive->directive) == 0) - ? eBad - : eUnspecified; - #endif - int flags = 0; -+ TriState stDesktop = eUnspecified; - - while ((token = nsCRT::strtok(whitespace, kWhitespace, &whitespace)) && - ok) { - ToLowerCase(token); - NS_ConvertASCIItoUTF16 wtoken(token); - - if (CheckStringFlag(kApplication, wtoken, appID, stApp) || - CheckOsFlag(kOs, wtoken, osTarget, stOs) || - CheckStringFlag(kABI, wtoken, abi, stABI) || -+ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || - CheckStringFlag(kProcess, wtoken, process, stProcess) || - CheckVersionFlag(kOsVersion, wtoken, osVersion, stOsVersion) || - CheckVersionFlag(kAppVersion, wtoken, appVersion, stAppVersion) || - CheckVersionFlag(kGeckoVersion, wtoken, geckoVersion, - stGeckoVersion)) { - continue; - } - -@@ -639,16 +648,17 @@ void ParseManifest(NSLocationType aType, - - LogMessageWithContext( - aFile, line, "Unrecognized chrome manifest modifier '%s'.", token); - ok = false; - } - - if (!ok || stApp == eBad || stAppVersion == eBad || - stGeckoVersion == eBad || stOs == eBad || stOsVersion == eBad || -+ stDesktop == eBad || - #ifdef MOZ_WIDGET_ANDROID - stTablet == eBad || - #endif - #ifdef MOZ_BACKGROUNDTASKS - stBackgroundTask == eBad || - #endif - stABI == eBad || stProcess == eBad) { - continue; -diff --git a/xpcom/components/moz.build b/xpcom/components/moz.build ---- a/xpcom/components/moz.build -+++ b/xpcom/components/moz.build -@@ -67,16 +67,17 @@ LOCAL_INCLUDES += [ - "../base", - "../build", - "../ds", - "/chrome", - "/js/xpconnect/loader", - "/js/xpconnect/src", - "/layout/build", - "/modules/libjar", -+ "/toolkit/xre", - ] - - if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] - - include("/ipc/chromium/chromium-config.mozbuild") - - PYTHON_UNITTEST_MANIFESTS += [ -diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp ---- a/xpcom/io/nsLocalFileUnix.cpp -+++ b/xpcom/io/nsLocalFileUnix.cpp -@@ -47,16 +47,17 @@ - #include "nsString.h" - #include "nsIDirectoryEnumerator.h" - #include "nsSimpleEnumerator.h" - #include "private/pprio.h" - #include "prlink.h" - - #ifdef MOZ_WIDGET_GTK - # include "nsIGIOService.h" -+# include "nsKDEUtils.h" - # ifdef MOZ_ENABLE_DBUS - # include "mozilla/widget/AsyncDBus.h" - # include "mozilla/WidgetUtilsGtk.h" - # include - # endif - #endif - - #ifdef MOZ_WIDGET_COCOA -@@ -2366,20 +2367,28 @@ nsLocalFile::SetPersistentDescriptor(con - - NS_IMETHODIMP - nsLocalFile::Reveal() { - if (!FilePreferences::IsAllowedPath(mPath)) { - return NS_ERROR_FILE_ACCESS_DENIED; - } - - #ifdef MOZ_WIDGET_GTK -+ nsAutoCString url; - nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); -- if (!giovfs) { -- return NS_ERROR_FAILURE; -+ url = mPath; -+ if (nsKDEUtils::kdeSupport()) { -+ nsTArray command; -+ command.AppendElement("REVEAL"_ns); -+ command.AppendElement(mPath); -+ return nsKDEUtils::command(command) ? NS_OK : NS_ERROR_FAILURE; - } -+ -+ if (!giovfs) return NS_ERROR_FAILURE; -+ - return giovfs->RevealFile(this); - #elif defined(MOZ_WIDGET_COCOA) - CFURLRef url; - if (NS_SUCCEEDED(GetCFURL(&url))) { - nsresult rv = CocoaFileUtils::RevealFileInFinder(url); - ::CFRelease(url); - return rv; - } -@@ -2391,16 +2400,23 @@ nsLocalFile::Reveal() { - - NS_IMETHODIMP - nsLocalFile::Launch() { - if (!FilePreferences::IsAllowedPath(mPath)) { - return NS_ERROR_FILE_ACCESS_DENIED; - } - - #ifdef MOZ_WIDGET_GTK -+ if (nsKDEUtils::kdeSupport()) { -+ nsTArray command; -+ command.AppendElement("OPEN"_ns); -+ command.AppendElement(mPath); -+ return nsKDEUtils::command(command) ? NS_OK : NS_ERROR_FAILURE; -+ } -+ - nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); - if (!giovfs) { - return NS_ERROR_FAILURE; - } - - return giovfs->LaunchFile(mPath); - #elif defined(MOZ_WIDGET_ANDROID) - // Not supported on GeckoView diff --git a/mozilla-ntlm-full-path.patch b/mozilla-ntlm-full-path.patch index dc8bb4e..7949349 100644 --- a/mozilla-ntlm-full-path.patch +++ b/mozilla-ntlm-full-path.patch @@ -1,18 +1,28 @@ # HG changeset patch # User Petr Cerny # Parent 7308e4a7c1f769f4bbbc90870b849cadd99495a6 -# Parent 1c6a565013e4c5f3494f964269783939cd5ed0b8 +# Parent 3399aced682c232525633755ff79b37a0be75548 Bug 634334 - call to the ntlm_auth helper fails diff --git a/extensions/auth/nsAuthSambaNTLM.cpp b/extensions/auth/nsAuthSambaNTLM.cpp --- a/extensions/auth/nsAuthSambaNTLM.cpp +++ b/extensions/auth/nsAuthSambaNTLM.cpp -@@ -160,7 +160,7 @@ nsresult nsAuthSambaNTLM::SpawnNTLMAuthH - const char* username = PR_GetEnv("USER"); - if (!username) return NS_ERROR_FAILURE; +@@ -148,17 +148,17 @@ nsresult nsAuthSambaNTLM::SpawnNTLMAuthH + } + + base::LaunchOptions options; + options.fds_to_remap.push_back( + std::pair{toChildPipeRead.get(), STDIN_FILENO}); + options.fds_to_remap.push_back( + std::pair{fromChildPipeWrite.get(), STDOUT_FILENO}); + +- std::vector argvVec{"ntlm_auth", "--helper-protocol", ++ std::vector argvVec{"/usr/bin/ntlm_auth", "--helper-protocol", + "ntlmssp-client-1", "--use-cached-creds", + "--username", username}; + + auto result = base::LaunchApp(argvVec, std::move(options), &mChildPID); + if (result.isErr()) { + return NS_ERROR_FAILURE; + } -- const char* const args[] = {"ntlm_auth", -+ const char* const args[] = {"/usr/bin/ntlm_auth", - "--helper-protocol", - "ntlmssp-client-1", - "--use-cached-creds", diff --git a/mozilla-silence-no-return-type.patch b/mozilla-silence-no-return-type.patch index 6d45245..237abc3 100644 --- a/mozilla-silence-no-return-type.patch +++ b/mozilla-silence-no-return-type.patch @@ -1,5 +1,5 @@ # HG changeset patch -# Parent 104c34af9ec233f7cd5e8dc955ba7ee763f47a21 +# Parent 5cc2e34f46adee952bab6c6955d5b2d5a248d06a diff --git a/gfx/skia/skia/include/codec/SkEncodedOrigin.h b/gfx/skia/skia/include/codec/SkEncodedOrigin.h --- a/gfx/skia/skia/include/codec/SkEncodedOrigin.h @@ -405,7 +405,7 @@ diff --git a/third_party/libwebrtc/api/adaptation/resource.cc b/third_party/libw diff --git a/third_party/libwebrtc/api/rtp_parameters.cc b/third_party/libwebrtc/api/rtp_parameters.cc --- a/third_party/libwebrtc/api/rtp_parameters.cc +++ b/third_party/libwebrtc/api/rtp_parameters.cc -@@ -28,16 +28,17 @@ const char* DegradationPreferenceToStrin +@@ -32,16 +32,17 @@ const char* DegradationPreferenceToStrin case DegradationPreference::MAINTAIN_FRAMERATE: return "maintain-framerate"; case DegradationPreference::MAINTAIN_RESOLUTION: @@ -745,7 +745,7 @@ diff --git a/third_party/libwebrtc/modules/audio_processing/audio_processing_imp const StreamConfig& input_config, const StreamConfig& output_config) { AudioFormatValidity input_validity = ValidateAudioFormat(input_config); -@@ -2420,16 +2421,17 @@ void AudioProcessingImpl::InitializeNois +@@ -2176,16 +2177,17 @@ void AudioProcessingImpl::InitializeNois case NoiseSuppresionConfig::kModerate: return NsConfig::SuppressionLevel::k12dB; case NoiseSuppresionConfig::kHigh: @@ -951,7 +951,7 @@ diff --git a/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_laye diff --git a/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc b/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc --- a/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc +++ b/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc -@@ -66,16 +66,17 @@ bool BeginningOfIdr(const H26xPacketBuff +@@ -58,16 +58,17 @@ bool BeginningOfIdr(const H26xPacketBuff case kH264StapA: case kH264SingleNalu: { return contains_idr_nalu; @@ -966,7 +966,7 @@ diff --git a/third_party/libwebrtc/modules/video_coding/h26x_packet_buffer.cc b/ bool HasSps(const H26xPacketBuffer::Packet& packet) { auto& h264_header = absl::get(packet.video_header.video_type_header); - return absl::c_any_of(GetNaluInfos(h264_header), [](const auto& nalu_info) { + return absl::c_any_of(h264_header.nalus, [](const auto& nalu_info) { return nalu_info.type == H264::NaluType::kSps; }); diff --git a/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc b/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc @@ -990,3 +990,45 @@ diff --git a/third_party/libwebrtc/video/adaptation/video_stream_encoder_resourc flags.resize(codec.VP9().numberOfSpatialLayers); for (size_t i = 0; i < flags.size(); ++i) { flags[i] = codec.spatialLayers[i].active; +diff --git a/third_party/libwebrtc/video/config/encoder_stream_factory.cc b/third_party/libwebrtc/video/config/encoder_stream_factory.cc +--- a/third_party/libwebrtc/video/config/encoder_stream_factory.cc ++++ b/third_party/libwebrtc/video/config/encoder_stream_factory.cc +@@ -104,16 +104,17 @@ int GetDefaultMaxQp(webrtc::VideoCodecTy + case webrtc::kVideoCodecH265: + return kDefaultVideoMaxQpH26x; + case webrtc::kVideoCodecVP8: + case webrtc::kVideoCodecVP9: + case webrtc::kVideoCodecAV1: + case webrtc::kVideoCodecGeneric: + return kDefaultVideoMaxQpVpx; + } ++ return kDefaultVideoMaxQpVpx; // fake return for hopefully not reached + } + + // Round size to nearest simulcast-friendly size. + // Simulcast stream width and height must both be dividable by + // |2 ^ (simulcast_layers - 1)|. + int NormalizeSimulcastSize(const FieldTrialsView& field_trials, + int size, + size_t simulcast_layers) { +diff --git a/third_party/libwebrtc/video/quality_convergence_controller.cc b/third_party/libwebrtc/video/quality_convergence_controller.cc +--- a/third_party/libwebrtc/video/quality_convergence_controller.cc ++++ b/third_party/libwebrtc/video/quality_convergence_controller.cc +@@ -31,16 +31,17 @@ int GetDefaultStaticQpThreshold(VideoCod + return kAv1DefaultStaticQpThreshold; + case kVideoCodecGeneric: + case kVideoCodecH264: + case kVideoCodecH265: + // -1 will effectively disable the static QP threshold since QP values are + // always >= 0. + return -1; + } ++ return -1; + } + } // namespace + + void QualityConvergenceController::Initialize( + int number_of_layers, + absl::optional static_qp_threshold, + VideoCodecType codec, + const FieldTrialsView& trials) { diff --git a/tar_stamps b/tar_stamps index de3db85..c87e770 100644 --- a/tar_stamps +++ b/tar_stamps @@ -1,10 +1,10 @@ PRODUCT="firefox" CHANNEL="release" -VERSION="131.0.3" +VERSION="132.0.1" VERSION_SUFFIX="" -PREV_VERSION="131.0.2" +PREV_VERSION="132.0" PREV_VERSION_SUFFIX="" #SKIP_LOCALES="" # Uncomment to skip l10n and compare-locales-generation RELEASE_REPO="https://hg.mozilla.org/releases/mozilla-release" -RELEASE_TAG="e69783530d6d036a3621031d0a316a66e933a070" -RELEASE_TIMESTAMP="20241011205646" +RELEASE_TAG="99c7a0bf814d88a82ce4173924e96bb582cae5dc" +RELEASE_TIMESTAMP="20241103194048"