summaryrefslogtreecommitdiffstats
path: root/patches
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2020-02-16 16:35:01 -0600
committerKyle K <kylek389@gmail.com>2020-02-16 16:35:01 -0600
commitb84bd85d3dc45dda57aae4c0e499c5f0aaf0425c (patch)
tree5ade5897da645f3617ef26820637c302360d557c /patches
parentfaafb704e8fd9769250ad64522158ffde88f57bd (diff)
downloadgentoox-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.patch51
-rw-r--r--patches/www-client/firefox/firefox-kde.patch283
-rw-r--r--patches/www-client/firefox/mozilla-kde.patch1940
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 )
-+