diff options
author | Kyle K <kylek389@gmail.com> | 2020-02-16 16:35:01 -0600 |
---|---|---|
committer | Kyle K <kylek389@gmail.com> | 2020-02-16 16:35:01 -0600 |
commit | b84bd85d3dc45dda57aae4c0e499c5f0aaf0425c (patch) | |
tree | 5ade5897da645f3617ef26820637c302360d557c /patches | |
parent | faafb704e8fd9769250ad64522158ffde88f57bd (diff) | |
download | gentoox-b84bd85d3dc45dda57aae4c0e499c5f0aaf0425c.tar.gz gentoox-b84bd85d3dc45dda57aae4c0e499c5f0aaf0425c.tar.bz2 gentoox-b84bd85d3dc45dda57aae4c0e499c5f0aaf0425c.zip |
firefox 73.0 opensuse KDE patches and unity global menu
Diffstat (limited to 'patches')
-rw-r--r-- | patches/www-client/firefox/firefox-branded-icons.patch | 51 | ||||
-rw-r--r-- | patches/www-client/firefox/firefox-kde.patch | 283 | ||||
-rw-r--r-- | patches/www-client/firefox/mozilla-kde.patch | 1940 |
3 files changed, 0 insertions, 2274 deletions
diff --git a/patches/www-client/firefox/firefox-branded-icons.patch b/patches/www-client/firefox/firefox-branded-icons.patch deleted file mode 100644 index d7d2552..0000000 --- a/patches/www-client/firefox/firefox-branded-icons.patch +++ /dev/null @@ -1,51 +0,0 @@ -# HG changeset patch -# Parent e0751ad74e835e80041a61ea00c2a63bf6fbe2de -# Parent 127964dc93cc35715852bc811dcc67016d918628 - -diff --git a/browser/branding/branding-common.mozbuild b/browser/branding/branding-common.mozbuild ---- a/browser/branding/branding-common.mozbuild -+++ b/browser/branding/branding-common.mozbuild -@@ -22,12 +22,15 @@ def FirefoxBranding(): - FINAL_TARGET_FILES.VisualElements += [ - 'VisualElements_150.png', - 'VisualElements_70.png', - ] - elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk': - FINAL_TARGET_FILES.chrome.icons.default += [ - 'default128.png', - 'default16.png', -+ 'default22.png', -+ 'default24.png', -+ 'default256.png', - 'default32.png', - 'default48.png', - 'default64.png', - ] -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 -@@ -246,20 +246,23 @@ - @RESPATH@/browser/chrome/pdfjs.manifest - @RESPATH@/browser/chrome/pdfjs/* - @RESPATH@/chrome/toolkit@JAREXT@ - @RESPATH@/chrome/toolkit.manifest - @RESPATH@/chrome/recording.manifest - @RESPATH@/chrome/recording/* - #ifdef MOZ_GTK - @RESPATH@/browser/chrome/icons/default/default16.png -+@RESPATH@/browser/chrome/icons/default/default22.png -+@RESPATH@/browser/chrome/icons/default/default24.png - @RESPATH@/browser/chrome/icons/default/default32.png - @RESPATH@/browser/chrome/icons/default/default48.png - @RESPATH@/browser/chrome/icons/default/default64.png - @RESPATH@/browser/chrome/icons/default/default128.png -+@RESPATH@/browser/chrome/icons/default/default256.png - #endif - @RESPATH@/browser/features/* - - ; [DevTools Startup Files] - @RESPATH@/browser/chrome/devtools-startup@JAREXT@ - @RESPATH@/browser/chrome/devtools-startup.manifest - - ; DevTools - diff --git a/patches/www-client/firefox/firefox-kde.patch b/patches/www-client/firefox/firefox-kde.patch deleted file mode 100644 index cb5578b..0000000 --- a/patches/www-client/firefox/firefox-kde.patch +++ /dev/null @@ -1,283 +0,0 @@ -# HG changeset patch -# 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/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 -@@ -341,16 +341,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(); - - 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) { - return; - } - try { - shellSvc.setDefaultBrowser(true, 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) { - Cu.reportError(ex); - return; - } - - let selectedIndex = shellSvc.isDefaultBrowser(false, true) ? 1 : 0; - document.getElementById("setDefaultPane").selectedIndex = selectedIndex; - } -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 -@@ -28,16 +28,18 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'coco - ] - elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk': - XPIDL_SOURCES += [ - 'nsIGNOMEShellService.idl', - ] - - SOURCES += [ - 'nsGNOMEShellService.cpp', -+ 'nsKDEShellService.cpp', -+ 'nsUnixShellService.cpp', - ] - 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,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 -+ * 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<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; -+ -+ str->SetData( NS_LITERAL_CSTRING( "ISDEFAULTBROWSER" )); -+ command->AppendElement( str ); -+ -+ if( nsKDEUtils::command( command )) -+ *aIsDefaultBrowser = true; -+ return NS_OK; -+} -+ -+NS_IMETHODIMP -+nsKDEShellService::SetDefaultBrowser(bool aClaimAllTypes, -+ bool aForAllUsers) -+{ -+ 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> paramstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID ); -+ if (!cmdstr || !paramstr) -+ return NS_ERROR_FAILURE; -+ -+ cmdstr->SetData( NS_LITERAL_CSTRING( "SETDEFAULTBROWSER" )); -+ command->AppendElement( cmdstr ); -+ -+ paramstr->SetData( aClaimAllTypes ? NS_LITERAL_CSTRING( "ALLTYPES" ) : NS_LITERAL_CSTRING( "NORMAL" )); -+ 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; -+} -+ -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(nsISupports *aOuter, REFNSIID aIID, void **aResult) -+{ -+ if( nsKDEUtils::kdeSupport()) -+ return nsKDEShellServiceConstructor( aOuter, aIID, aResult ); -+ return nsGNOMEShellServiceConstructor( aOuter, 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/patches/www-client/firefox/mozilla-kde.patch b/patches/www-client/firefox/mozilla-kde.patch deleted file mode 100644 index 281f29b..0000000 --- a/patches/www-client/firefox/mozilla-kde.patch +++ /dev/null @@ -1,1940 +0,0 @@ -# HG changeset patch -# User msirringhaus@suse.de -# Date 1559294891 -7200 -# Fri May 31 11:28:11 2019 +0200 -# Node ID c2aa7198fb925e7fde96abf65b6f68b9b755f112 -# Parent 52a515e07938d75f7c33e7b724845ce6dc315c0c -Description: Add KDE integration to Firefox (toolkit parts) -Author: Wolfgang Rosenauer <wolfgang@rosenauer.org> -Author: Lubos Lunak <lunak@suse.com> -Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751 - https://bugzilla.novell.com/show_bug.cgi?id=170055 - -diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp ---- a/modules/libpref/Preferences.cpp -+++ b/modules/libpref/Preferences.cpp -@@ -88,16 +88,17 @@ - #include "nsXPCOM.h" - #include "nsXULAppAPI.h" - #include "nsZipArchive.h" - #include "plbase64.h" - #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" - #endif -@@ -4543,25 +4544,37 @@ nsresult Preferences::InitInitialObjects - // application pref files for backwards compatibility. - static const char* specialFiles[] = { - #if defined(XP_MACOSX) - "macprefs.js" - #elif defined(XP_WIN) - "winpref.js" - #elif defined(XP_UNIX) - "unix.js" -+ , "" // placeholder for KDE (empty is otherwise harmless) - # if defined(_AIX) - , - "aix.js" - # endif - #elif defined(XP_BEOS) - "beos.js" - #endif - }; - -+ if(nsKDEUtils::kdeSession()) { // TODO what if some setup actually requires the helper? -+ for(int i = 0; -+ i < MOZ_ARRAY_LENGTH(specialFiles); -+ ++i ) { -+ if( *specialFiles[ i ] == '\0' ) { -+ specialFiles[ i ] = "kde.js"; -+ break; -+ } -+ } -+ } -+ - rv = pref_LoadPrefsInDir(defaultPrefDir, specialFiles, - ArrayLength(specialFiles)); - if (NS_FAILED(rv)) { - NS_WARNING("Error parsing application default preferences."); - } - - // Load jar:$app/omni.jar!/defaults/preferences/*.js - // or jar:$gre/omni.jar!/defaults/preferences/*.js. -@@ -4607,17 +4620,17 @@ nsresult Preferences::InitInitialObjects - } - - nsCOMPtr<nsIFile> path = do_QueryInterface(elem); - if (!path) { - continue; - } - - // Do we care if a file provided by this process fails to load? -- pref_LoadPrefsInDir(path, nullptr, 0); -+ pref_LoadPrefsInDir(path, specialFiles, ArrayLength(specialFiles)); - } - } - - if (XRE_IsParentProcess()) { - SetupTelemetryPref(); - } - - NS_CreateServicesFromCategory(NS_PREFSERVICE_APPDEFAULTS_TOPIC_ID, nullptr, -diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build ---- a/modules/libpref/moz.build -+++ b/modules/libpref/moz.build -@@ -113,16 +113,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) - - GENERATED_FILES += [gen_all_tuple] - - 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 -@@ -227,16 +227,17 @@ class Flags(OrderedDict): - 'contentaccessible': Flag, - 'os': StringFlag, - 'osversion': VersionFlag, - 'abi': StringFlag, - 'platform': Flag, - 'xpcnativewrappers': Flag, - 'tablet': Flag, - 'process': 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 -@@ -36,16 +36,17 @@ class ManifestEntry(object): - 'platformversion', - 'os', - 'osversion', - 'abi', - 'xpcnativewrappers', - 'tablet', - 'process', - 'contentaccessible', -+ '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 -@@ -41,10 +41,14 @@ XPCOM_MANIFESTS += [ - - if CONFIG['MOZ_PLACES']: - EXTRA_JS_MODULES += [ - 'DownloadHistory.jsm', - ] - - FINAL_LIBRARY = 'xul' - -+LOCAL_INCLUDES += [ -+ '/toolkit/xre' -+] -+ - with Files('**'): - BUG_COMPONENT = ('Toolkit', 'Downloads API') -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 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, - 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 -@@ -14,16 +14,17 @@ - #include "nsPrintfCString.h" - #include "nsNetCID.h" - #include "nsNetUtil.h" - #include "nsISupportsPrimitives.h" - #include "nsIGSettingsService.h" - #include "nsInterfaceHashtable.h" - #include "mozilla/Attributes.h" - #include "nsIURI.h" -+#include "nsKDEUtils.h" - - using namespace mozilla; - - class nsUnixSystemProxySettings final : public nsISystemProxySettings { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSISYSTEMPROXYSETTINGS - -@@ -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); - 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 -@@ -381,21 +384,50 @@ 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<nsCString> command; -+ command.AppendElement( NS_LITERAL_CSTRING( "GETPROXY" )); -+ command.AppendElement( url ); -+ nsTArray<nsCString> result; -+ if( !nsKDEUtils::command( command, &result ) || result.Length() != 1 ) -+ return NS_ERROR_FAILURE; -+ aResult = result[0]; -+ 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 -@@ -87,17 +87,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', - ] - else: - UNIFIED_SOURCES += [ - 'nsNativeAppSupportDefault.cpp', - ] - - if CONFIG['MOZ_HAS_REMOTE']: -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,344 @@ -+/* -*- 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 <gtk/gtk.h> -+ -+#include <limits.h> -+#include <stdio.h> -+#include <sys/wait.h> -+#include <sys/resource.h> -+#include <unistd.h> -+#include <X11/Xlib.h> -+// 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() -+ { -+ Display* dpy = XOpenDisplay( NULL ); -+ if( dpy == NULL ) -+ return false; -+ Atom kde_full_session = XInternAtom( dpy, "KDE_FULL_SESSION", true ); -+ bool kde = false; -+ if( kde_full_session != None ) -+ { -+ int cnt; -+ if( Atom* props = XListProperties( dpy, DefaultRootWindow( dpy ), &cnt )) -+ { -+ for( int i = 0; -+ i < cnt; -+ ++i ) -+ { -+ if( props[ i ] == kde_full_session ) -+ { -+ kde = true; -+#ifdef DEBUG_KDE -+ fprintf( stderr, "KDE SESSION %d\n", kde ); -+#endif -+ break; -+ } -+ } -+ XFree( props ); -+ } -+ } -+ XCloseDisplay( dpy ); -+ return kde; -+ } -+ -+static bool getKdeSupport() -+ { -+ nsTArray<nsCString> command; -+ command.AppendElement( NS_LITERAL_CSTRING( "CHECK" )); -+ command.AppendElement( NS_LITERAL_CSTRING( MAKE_STR( KMOZILLAHELPER_VERSION ))); -+ 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<nsCString>* output; -+ GMainLoop* loop; -+ bool success; -+ }; -+ -+static gboolean kdeReadFunc( GIOChannel*, GIOCondition, gpointer data ) -+ { -+ nsKDECommandData* p = static_cast< nsKDECommandData* >( 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<nsCString>& command, nsTArray<nsCString>* output ) -+ { -+ return self()->internalCommand( command, NULL, false, output ); -+ } -+ -+bool nsKDEUtils::command( nsIArray* command, nsIArray** output) -+ { -+ nsTArray<nsCString> in; -+ PRUint32 length; -+ command->GetLength( &length ); -+ for ( PRUint32 i = 0; i < length; i++ ) -+ { -+ nsCOMPtr<nsISupportsCString> str = do_QueryElementAt( command, i ); -+ if( str ) -+ { -+ nsAutoCString s; -+ str->GetData( s ); -+ in.AppendElement( s ); -+ } -+ } -+ -+ nsTArray<nsCString> out; -+ bool ret = self()->internalCommand( in, NULL, false, &out ); -+ -+ if ( !output ) return ret; -+ -+ nsCOMPtr<nsIMutableArray> result = do_CreateInstance( NS_ARRAY_CONTRACTID ); -+ if ( !result ) return false; -+ -+ for ( PRUint32 i = 0; i < out.Length(); i++ ) -+ { -+ nsCOMPtr<nsISupportsCString> 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<nsCString>& command, GtkWindow* parent, nsTArray<nsCString>* output ) -+ { -+ return self()->internalCommand( command, parent, true, output ); -+ } -+ -+bool nsKDEUtils::internalCommand( const nsTArray<nsCString>& command, GtkWindow* parent, bool blockUi, -+ nsTArray<nsCString>* 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< GIOCondition >( 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< GIOCondition >( 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< char* >( 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 ) -+ |