diff --git a/MozillaThunderbird.changes b/MozillaThunderbird.changes index ab49ffe..1392ece 100644 --- a/MozillaThunderbird.changes +++ b/MozillaThunderbird.changes @@ -1,3 +1,30 @@ +------------------------------------------------------------------- +Fri Mar 9 20:42:21 UTC 2012 - wr@rosenauer.org + +- update to Thunderbird 11.0 (bnc#750044) + * MFSA 2012-13/CVE-2012-0455 (bmo#704354) + XSS with Drag and Drop and Javascript: URL + * MFSA 2012-14/CVE-2012-0456/CVE-2012-0457 (bmo#711653, #720103) + SVG issues found with Address Sanitizer + * MFSA 2012-15/CVE-2012-0451 (bmo#717511) + XSS with multiple Content Security Policy headers + * MFSA 2012-16/CVE-2012-0458 + Escalation of privilege with Javascript: URL as home page + * MFSA 2012-17/CVE-2012-0459 (bmo#723446) + Crash when accessing keyframe cssText after dynamic modification + * MFSA 2012-18/CVE-2012-0460 (bmo#727303) + window.fullScreen writeable by untrusted content + * MFSA 2012-19/CVE-2012-0461/CVE-2012-0462/CVE-2012-0464/ + CVE-2012-0463 + Miscellaneous memory safety hazards +- update enigmail to 1.4 +- added KDE integration patches (bnc#749440) + +------------------------------------------------------------------- +Mon Feb 27 17:15:05 CET 2012 - jslaby@suse.de + +- update enigmail to 1.3.99 (1.4a1pre) + ------------------------------------------------------------------- Thu Feb 16 10:54:42 UTC 2012 - wr@rosenauer.org diff --git a/MozillaThunderbird.spec b/MozillaThunderbird.spec index 254b422..6ac27fe 100644 --- a/MozillaThunderbird.spec +++ b/MozillaThunderbird.spec @@ -17,6 +17,8 @@ # +%define with_kde 1 + Name: MozillaThunderbird BuildRequires: Mesa-devel BuildRequires: autoconf213 @@ -28,50 +30,56 @@ BuildRequires: libcurl-devel BuildRequires: libgnomeui-devel BuildRequires: libidl-devel BuildRequires: libnotify-devel -BuildRequires: mozilla-nspr-devel >= 4.8.9 -BuildRequires: mozilla-nss-devel >= 3.13.1 +BuildRequires: mozilla-nspr-devel >= 4.9.0 +BuildRequires: mozilla-nss-devel >= 3.13.3 BuildRequires: nss-shared-helper-devel BuildRequires: python BuildRequires: startup-notification-devel BuildRequires: unzip BuildRequires: update-desktop-files +BuildRequires: xorg-x11-libXt-devel BuildRequires: yasm BuildRequires: zip -%define mainversion 10.0.2 +%define mainversion 11.0 Version: %{mainversion} Release: 0 -%define releasedate 2012021500 +%define releasedate 2012031200 Provides: thunderbird = %{version} +%if %{with_kde} +# 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} +%endif Summary: The Stand-Alone Mozilla Mail Component License: MPL-1.1 or GPL-2.0+ or LGPL-2.1+ Group: Productivity/Networking/Email/Clients Url: http://www.mozilla.org/products/thunderbird/ Source: thunderbird-%{version}-source.tar.bz2 -Source1: MozillaThunderbird.desktop +Source1: thunderbird.desktop Source2: add-plugins.sh.in Source3: mozilla.sh.in Source4: l10n-%{version}.tar.bz2 #Source5: shipped-locales Source6: suse-default-prefs.js Source7: find-external-requires.sh -Source8: MozillaThunderbird-rpmlintrc -Source9: enigmail-1.3.5.tar.gz +Source8: thunderbird-rpmlintrc +Source9: enigmail-1.4.tar.gz Source10: create-tar.sh Source11: compare-locales.tar.bz2 +Source12: kde.js # Gecko/Toolkit Patch1: mozilla-shared-nss-db.patch Patch2: mozilla-language.patch Patch3: mozilla-linux3.patch Patch4: mozilla-dump_syms-static.patch Patch5: mozilla-disable-neon-option.patch -Patch6: mozilla-a11y.patch -Patch7: mozilla-bmo703534.patch -Patch8: mozilla-yarr-pcre.patch +Patch6: mozilla-nongnome-proxies.patch +Patch7: mozilla-kde.patch # Thunderbird/mail Patch10: tb-ssldap.patch Patch11: tb-develdirs.patch Patch12: thunderbird-shared-nss-db.patch -Patch13: tb-no-update-channel.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build PreReq: coreutils fileutils textutils /bin/sh ### build options @@ -90,6 +98,7 @@ PreReq: coreutils fileutils textutils /bin/sh %global __find_provides %provfind Requires: mozilla-nspr >= %(rpm -q --queryformat '%{VERSION}' mozilla-nspr) Requires: mozilla-nss >= %(rpm -q --queryformat '%{VERSION}' mozilla-nss) +Conflicts: thunderbird-esr %define progname thunderbird %define progdir %{_prefix}/%_lib/thunderbird %define libgssapi libgssapi_krb5.so.2 @@ -124,7 +133,7 @@ of MozillaThunderbird. Summary: Extra translations for MozillaThunderbird License: MPL-1.1 or GPL-2.0+ or LGPL-2.1+ Group: System/Localization -Provides: locale(%{name}:be;bn_BD;br;el;et;eu;fy_NL;ga_IE;gd;gl;he;id;is;lt;nn_NO;rm;si;sk;sl;sq;ta_LK;tr;uk;vi) +Provides: locale(%{name}:ast;be;bg;bn_BD;br;el;et;eu;fy_NL;ga_IE;gd;gl;he;hr;hy_AM;id;is;lt;nn_NO;pa_IN;rm;ro;si;sk;sl;sq;sr;ta_LK;tr;uk;vi) PreReq: %{name} = %{mainversion} Obsoletes: %{name}-translations < %{version}-%{release} @@ -159,7 +168,7 @@ symbols meant for upload to Mozilla's crash collector database. %if %build_enigmail %package -n enigmail -Version: 1.3.5+%{mainversion} +Version: 1.4.0+%{mainversion} Release: 0 Summary: OpenPGP addon for Thunderbird and SeaMonkey License: MPL-1.1 or GPL-2.0+ @@ -171,6 +180,7 @@ Requires: pinentry-gui %else Requires: pinentry-dialog %endif +Conflicts: thunderbird-esr %description -n enigmail This package contains the Enigmail OpenPGP Addon for Thunderbird and SeaMonkey. @@ -190,14 +200,14 @@ pushd mozilla %patch4 -p1 %patch5 -p1 %patch6 -p1 +%if %{with_kde} %patch7 -p1 -%patch8 -p1 +%endif popd # comm-central patches %patch10 -p1 %patch11 -p1 %patch12 -p1 -%patch13 -p1 %build # no need to add build time to binaries @@ -206,6 +216,13 @@ DATE="\"$(date -d "${modified}" "+%%b %%e %%Y")\"" TIME="\"$(date -d "${modified}" "+%%R")\"" find . -regex ".*\.c\|.*\.cpp\|.*\.h" -exec sed -i "s/__DATE__/${DATE}/g;s/__TIME__/${TIME}/g" {} + # +%if %{with_kde} +kdehelperversion=$(cat mozilla/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 +%endif export SUSE_ASNEEDED=0 export MOZ_BUILD_DATE=%{releasedate} export MOZILLA_OFFICIAL=1 @@ -288,6 +305,13 @@ make -C mail/installer STRIP=/bin/true mkdir -p $RPM_BUILD_ROOT%{progdir} cp -rf $RPM_BUILD_DIR/obj/mozilla/dist/thunderbird/* \ $RPM_BUILD_ROOT%{progdir} +%if %{with_kde} +# install kde.js +install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{progdir}/defaults/pref/kde.js +# make sure that instantApply is true by default +# (TODO: mozilla-kde.patch needs to be improved to really not load kde.js in non-KDE envs) +echo 'pref("browser.preferences.instantApply", true);' > $RPM_BUILD_ROOT%{progdir}/defaults/pref/all-thunderbird.js +%endif # build additional locales %if %localize %if 0%{?SOURCE5:1} @@ -297,7 +321,7 @@ rm -f %{_tmppath}/translations.* touch %{_tmppath}/translations.{common,other} for locale in $(awk '{ print $1; }' ../thunderbird/mail/locales/all-locales); do case $locale in - ja-JP-mac|en-US) #|ta-LK|tr) + ja-JP-mac|en-US|hy-AM) # locales not to be included in translations package ;; *) diff --git a/compare-locales.tar.bz2 b/compare-locales.tar.bz2 index 68ec45a..c87e3f8 100644 --- a/compare-locales.tar.bz2 +++ b/compare-locales.tar.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5146b9128bef1f4a9fb0fa64ca2df6e0042b8428db561f19ba5fdbc96c69202f -size 25679 +oid sha256:6aea105faabd49760a63a704c50ce1b1731308ec7e1848acd4354235ebbc7861 +size 29345 diff --git a/create-tar.sh b/create-tar.sh index 2b2dc91..434bcb1 100644 --- a/create-tar.sh +++ b/create-tar.sh @@ -2,8 +2,8 @@ CHANNEL="release" BRANCH="releases/comm-$CHANNEL" -RELEASE_TAG="THUNDERBIRD_10_0_2_RELEASE" -VERSION="10.0.2" +RELEASE_TAG="THUNDERBIRD_11_0_RELEASE" +VERSION="11.0" echo "cloning $BRANCH..." hg clone http://hg.mozilla.org/$BRANCH thunderbird diff --git a/enigmail-1.3.5.tar.gz b/enigmail-1.3.5.tar.gz deleted file mode 100644 index 760d07e..0000000 --- a/enigmail-1.3.5.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:932a0206e9598eb10056f94622e9c0a64afc93542b43694568df810208a1e3b2 -size 1348362 diff --git a/enigmail-1.4.tar.gz b/enigmail-1.4.tar.gz new file mode 100644 index 0000000..85a2057 --- /dev/null +++ b/enigmail-1.4.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c63990dad45d6bce3e691f75aa226a203f6fbbc2397415df72b289230e2c982a +size 1323467 diff --git a/kde.js b/kde.js new file mode 100644 index 0000000..f06d73a --- /dev/null +++ b/kde.js @@ -0,0 +1 @@ +pref("browser.preferences.instantApply", false); diff --git a/l10n-10.0.2.tar.bz2 b/l10n-10.0.2.tar.bz2 deleted file mode 100644 index cf08d9f..0000000 --- a/l10n-10.0.2.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f403e73eea221c77e235741462d28b1eb5782b7d5258552a9be417d8a9402bac -size 24781851 diff --git a/l10n-11.0.tar.bz2 b/l10n-11.0.tar.bz2 new file mode 100644 index 0000000..b02039a --- /dev/null +++ b/l10n-11.0.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ce2b06615e6ce019793883dc062a3853e6fd544ee023d199f78462a55517d42 +size 25447962 diff --git a/mozilla-a11y.patch b/mozilla-a11y.patch deleted file mode 100644 index 5a03046..0000000 --- a/mozilla-a11y.patch +++ /dev/null @@ -1,415 +0,0 @@ -# HG changeset patch -# User Michael Gorse -# Parent 2c115988d04c0a0a8cb75b3a597ecdb2c4c001c9 -a11y only enabled from Gnome 2's GConf setting -https://bugzilla.novell.com/show_bug.cgi?id=732898 -https://bugzilla.mozilla.org/show_bug.cgi?id=693343 - -diff --git a/accessible/src/atk/Makefile.in b/accessible/src/atk/Makefile.in ---- a/accessible/src/atk/Makefile.in -+++ b/accessible/src/atk/Makefile.in -@@ -87,15 +87,19 @@ EXPORTS = \ - # we want to force the creation of a static lib. - FORCE_STATIC_LIB = 1 - - include $(topsrcdir)/config/rules.mk - - CFLAGS += $(MOZ_GTK2_CFLAGS) - CXXFLAGS += $(MOZ_GTK2_CFLAGS) - -+ifdef MOZ_ENABLE_DBUS -+CXXFLAGS += $(MOZ_DBUS_CFLAGS) -+endif -+ - LOCAL_INCLUDES += \ - -I$(srcdir) \ - -I$(srcdir)/../base \ - -I$(srcdir)/../html \ - -I$(srcdir)/../xul \ - -I$(topsrcdir)/other-licenses/atk-1.0 \ - $(NULL) -diff --git a/accessible/src/atk/nsApplicationAccessibleWrap.cpp b/accessible/src/atk/nsApplicationAccessibleWrap.cpp ---- a/accessible/src/atk/nsApplicationAccessibleWrap.cpp -+++ b/accessible/src/atk/nsApplicationAccessibleWrap.cpp -@@ -47,29 +47,29 @@ - #include "nsIPrefBranch.h" - #include "nsIServiceManager.h" - #include "nsAutoPtr.h" - #include "nsAccessibilityService.h" - #include "AtkSocketAccessible.h" - - #include - #include -+#ifdef MOZ_ENABLE_DBUS -+#include -+#endif -+ -+using namespace mozilla::a11y; - - typedef GType (* AtkGetTypeType) (void); - GType g_atk_hyperlink_impl_type = G_TYPE_INVALID; - static bool sATKChecked = false; - static PRLibrary *sATKLib = nsnull; - static const char sATKLibName[] = "libatk-1.0.so.0"; - static const char sATKHyperlinkImplGetTypeSymbol[] = - "atk_hyperlink_impl_get_type"; --static const char sAccEnv [] = "GNOME_ACCESSIBILITY"; --static const char sSysPrefService [] = -- "@mozilla.org/system-preference-service;1"; --static const char sAccessibilityKey [] = -- "config.use_system_prefs.accessibility"; - - /* gail function pointer */ - static guint (* gail_add_global_event_listener) (GSignalEmissionHook listener, - const gchar *event_type); - static void (* gail_remove_global_event_listener) (guint remove_listener); - static void (* gail_remove_key_event_listener) (guint remove_listener); - static AtkObject * (*gail_get_root) (void); - -@@ -609,36 +609,17 @@ toplevel_event_watcher(GSignalInvocation - } - - return TRUE; - } - - bool - nsApplicationAccessibleWrap::Init() - { -- // XXX following code is copied from widget/src/gtk2/nsWindow.cpp -- // we should put it to somewhere that can be used from both modules -- // see bug 390761 -- -- // check if accessibility enabled/disabled by environment variable -- bool isGnomeATEnabled = false; -- const char *envValue = PR_GetEnv(sAccEnv); -- if (envValue) { -- isGnomeATEnabled = !!atoi(envValue); -- } else { -- //check gconf-2 setting -- nsresult rv; -- nsCOMPtr sysPrefService = -- do_GetService(sSysPrefService, &rv); -- if (NS_SUCCEEDED(rv) && sysPrefService) { -- sysPrefService->GetBoolPref(sAccessibilityKey, &isGnomeATEnabled); -- } -- } -- -- if (isGnomeATEnabled) { -+ if (ShouldA11yBeEnabled()) { - // load and initialize gail library - nsresult rv = LoadGtkModule(sGail); - if (NS_SUCCEEDED(rv)) { - (*sGail.init)(); - } - else { - MAI_LOG_DEBUG(("Fail to load lib: %s\n", sGail.libName)); - } -@@ -877,8 +858,129 @@ LoadGtkModule(GnomeAccessibilityModule& - aModule.init ? aModule.shutdownName : aModule.initName, - aModule.libName)); - PR_UnloadLibrary(aModule.lib); - aModule.lib = NULL; - return NS_ERROR_FAILURE; - } - return NS_OK; - } -+ -+namespace mozilla { -+namespace a11y { -+ -+#ifdef MOZ_ENABLE_DBUS -+ static DBusPendingCall *a11yPendingCall = NULL; -+#endif -+ -+void -+PreInit() -+{ -+ static bool sChecked = false; -+ if (sChecked) -+ return; -+ sChecked = true; -+ DBusError error; -+ dbus_error_init(&error); -+ DBusConnection* bus = dbus_bus_get(DBUS_BUS_SESSION, &error); -+ if (!bus) -+ return; -+ dbus_connection_set_exit_on_disconnect(bus, false); -+ -+ DBusMessage *message; -+ message = dbus_message_new_method_call("org.a11y.Bus", "/org/a11y/bus", -+ "org.freedesktop.DBus.Properties", -+ "Get"); -+ if (!message) -+ goto dbus_done; -+ -+ static const char* iface = "org.a11y.Status"; -+ static const char* member = "IsEnabled"; -+ dbus_message_append_args(message, DBUS_TYPE_STRING, &iface, -+ DBUS_TYPE_STRING, &member, DBUS_TYPE_INVALID); -+ dbus_connection_send_with_reply(bus, message, &a11yPendingCall, 1000); -+ -+dbus_done: -+ if (message) -+ dbus_message_unref(message); -+ if (bus) -+ dbus_connection_unref(bus); -+ dbus_error_free(&error); -+} -+ -+bool -+ShouldA11yBeEnabled() -+{ -+ static bool sChecked = false, sShouldEnable = false; -+ if (sChecked) -+ return sShouldEnable; -+ -+ sChecked = true; -+ -+ // check if accessibility enabled/disabled by environment variable -+ static const char sAccEnv [] = "GNOME_ACCESSIBILITY"; -+ const char* envValue = PR_GetEnv(sAccEnv); -+ if (envValue) -+ return sShouldEnable = !!atoi(envValue); -+ -+#ifdef MOZ_ENABLE_DBUS -+ PreInit(); -+ bool dbusSuccess = false; -+ DBusMessage *reply = nsnull; -+ if (a11yPendingCall) { -+ dbus_pending_call_block(a11yPendingCall); -+ reply = dbus_pending_call_steal_reply(a11yPendingCall); -+ dbus_pending_call_unref(a11yPendingCall); -+ a11yPendingCall = nsnull; -+ } -+ if (!reply || -+ dbus_message_get_type(reply) != DBUS_MESSAGE_TYPE_METHOD_RETURN || -+ strcmp(dbus_message_get_signature (reply), "v")) -+ goto dbus_done; -+ -+ DBusMessageIter iter, iter_variant, iter_struct; -+ dbus_bool_t dResult; -+ dbus_message_iter_init(reply, &iter); -+ dbus_message_iter_recurse (&iter, &iter_variant); -+ switch (dbus_message_iter_get_arg_type(&iter_variant)) { -+ case DBUS_TYPE_STRUCT: -+ // at-spi2-core 2.2.0-2.2.1 had a bug where it returned a struct -+ dbus_message_iter_recurse(&iter_variant, &iter_struct); -+ if (dbus_message_iter_get_arg_type(&iter_struct) == DBUS_TYPE_BOOLEAN) { -+ dbus_message_iter_get_basic(&iter_struct, &dResult); -+ sShouldEnable = dResult; -+ dbusSuccess = true; -+ } -+ -+ break; -+ case DBUS_TYPE_BOOLEAN: -+ dbus_message_iter_get_basic(&iter_variant, &dResult); -+ sShouldEnable = dResult; -+ dbusSuccess = true; -+ break; -+ default: -+ break; -+ } -+ -+ dbus_done: -+ if (reply) -+ dbus_message_unref(reply); -+ -+ if (dbusSuccess) -+ return sShouldEnable; -+#endif -+ -+ //check gconf-2 setting -+ nsresult rv = NS_OK; -+ static const char sSysPrefService [] = -+ "@mozilla.org/system-preference-service;1"; -+ static const char sAccessibilityKey [] = -+ "config.use_system_prefs.accessibility"; -+ nsCOMPtr sysPrefService = -+ do_GetService(sSysPrefService, &rv); -+ if (NS_SUCCEEDED(rv) && sysPrefService) -+ sysPrefService->GetBoolPref(sAccessibilityKey, &sShouldEnable); -+ -+ return sShouldEnable; -+} -+} // namespace a11y -+} // namespace mozilla -+ -diff --git a/accessible/src/base/nsAccessibilityService.h b/accessible/src/base/nsAccessibilityService.h ---- a/accessible/src/base/nsAccessibilityService.h -+++ b/accessible/src/base/nsAccessibilityService.h -@@ -46,16 +46,33 @@ - - #include "mozilla/a11y/FocusManager.h" - - #include "nsIObserver.h" - - namespace mozilla { - namespace a11y { - -+#ifdef MOZ_ACCESSIBILITY_ATK -+/** -+ * + * Perform initialization that should be done as soon as possible, in -+ * order -+ * + * to minimize startup time. -+ * + * XXX: this function and the next defined in -+ * nsApplicationAccessibleWrap.cpp -+ * + */ -+void PreInit(); -+ -+/** -+ * + * Is platform accessibility enabled. -+ * + * Only used on linux with atk for now. -+ * + */ -+bool ShouldA11yBeEnabled(); -+#endif -+ - /** - * Return focus manager. - */ - FocusManager* FocusMgr(); - - } // namespace a11y - } // namespace mozilla - -diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp ---- a/widget/src/gtk2/nsWindow.cpp -+++ b/widget/src/gtk2/nsWindow.cpp -@@ -105,29 +105,21 @@ - #include "nsIStringBundle.h" - #include "nsGfxCIID.h" - #include "nsIObserverService.h" - - #include "nsIdleService.h" - #include "nsIPropertyBag2.h" - - #ifdef ACCESSIBILITY --#include "nsIAccessibilityService.h" -+#include "nsAccessibilityService.h" - #include "nsIAccessibleDocument.h" --#include "prenv.h" --#include "stdlib.h" - - using namespace mozilla; - --static bool sAccessibilityChecked = false; --/* static */ --bool nsWindow::sAccessibilityEnabled = false; --static const char sSysPrefService [] = "@mozilla.org/system-preference-service;1"; --static const char sAccEnv [] = "GNOME_ACCESSIBILITY"; --static const char sAccessibilityKey [] = "config.use_system_prefs.accessibility"; - #endif - - /* For SetIcon */ - #include "nsAppDirectoryServiceDefs.h" - #include "nsXPIDLString.h" - #include "nsIFile.h" - #include "nsILocalFile.h" - -@@ -1111,19 +1103,18 @@ nsWindow::Show(bool aState) - NativeResize(mBounds.x, mBounds.y, mBounds.width, mBounds.height, - false); - } else if (mNeedsResize) { - NativeResize(mBounds.width, mBounds.height, false); - } - } - - #ifdef ACCESSIBILITY -- if (aState && sAccessibilityEnabled) { -+ if (aState && a11y::ShouldA11yBeEnabled()) - CreateRootAccessible(); -- } - #endif - - NativeShow(aState); - - return NS_OK; - } - - NS_IMETHODIMP -@@ -3885,16 +3876,21 @@ nsWindow::Create(nsIWidget *aPare - nsIWidget *baseParent = aInitData && - (aInitData->mWindowType == eWindowType_dialog || - aInitData->mWindowType == eWindowType_toplevel || - aInitData->mWindowType == eWindowType_invisible) ? - nsnull : aParent; - - NS_ASSERTION(!mWindowGroup, "already have window group (leaking it)"); - -+#ifdef ACCESSIBILITY -+ // Send a DBus message to check whether a11y is enabled -+ a11y::PreInit(); -+#endif -+ - // Ensure that the toolkit is created. - nsGTKToolkit::GetToolkit(); - - // initialize all the common bits of this class - BaseCreate(baseParent, aRect, aHandleEventFunction, aContext, aInitData); - - // Do we need to listen for resizes? - bool listenForResizes = false;; -@@ -4278,43 +4274,16 @@ nsWindow::Create(nsIWidget *aPare - LOG(("\tmGdkWindow %p %lx\n", (void *)mGdkWindow, - gdk_x11_window_get_xid(mGdkWindow))); - } - - // resize so that everything is set to the right dimensions - if (!mIsTopLevel) - Resize(mBounds.x, mBounds.y, mBounds.width, mBounds.height, false); - --#ifdef ACCESSIBILITY -- nsresult rv; -- if (!sAccessibilityChecked) { -- sAccessibilityChecked = true; -- -- //check if accessibility enabled/disabled by environment variable -- const char *envValue = PR_GetEnv(sAccEnv); -- if (envValue) { -- sAccessibilityEnabled = atoi(envValue) != 0; -- LOG(("Accessibility Env %s=%s\n", sAccEnv, envValue)); -- } -- //check gconf-2 setting -- else { -- nsCOMPtr sysPrefService = -- do_GetService(sSysPrefService, &rv); -- if (NS_SUCCEEDED(rv) && sysPrefService) { -- -- // do the work to get gconf setting. -- // will be done soon later. -- sysPrefService->GetBoolPref(sAccessibilityKey, -- &sAccessibilityEnabled); -- } -- -- } -- } --#endif -- - #ifdef MOZ_DFB - if (!mDFB) { - DirectFBCreate( &mDFB ); - - D_ASSUME( mDFB != NULL ); - - if (mDFB) - mDFB->GetDisplayLayer( mDFB, DLID_PRIMARY, &mDFBLayer ); -@@ -6504,19 +6473,18 @@ nsWindow::DispatchAccessibleEvent() - DispatchEvent(&event, status); - - return event.mAccessible; - } - - void - nsWindow::DispatchEventToRootAccessible(PRUint32 aEventType) - { -- if (!sAccessibilityEnabled) { -+ if (!a11y::ShouldA11yBeEnabled()) - return; -- } - - nsCOMPtr accService = - do_GetService("@mozilla.org/accessibilityService;1"); - if (!accService) { - return; - } - - // Get the root document accessible and fire event to it. diff --git a/mozilla-bmo703534.patch b/mozilla-bmo703534.patch deleted file mode 100644 index 29f6d8d..0000000 --- a/mozilla-bmo703534.patch +++ /dev/null @@ -1,29 +0,0 @@ -# HG changeset patch -# User Mike Hommey -# Date 1321613368 -3600 -# Node ID 15cf58eb7923d34de7e61df80fa5f8a18a995abf -# Parent aeb035da53283c56370992f254e4f79d7dd180f8 -Bug 703534 - Fix build failure on platforms without YARR JIT. r=luke -target: M11 - -diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp ---- a/js/src/jscompartment.cpp -+++ b/js/src/jscompartment.cpp -@@ -45,17 +45,16 @@ - #include "jsiter.h" - #include "jsmath.h" - #include "jsproxy.h" - #include "jsscope.h" - #include "jstracer.h" - #include "jswatchpoint.h" - #include "jswrapper.h" - #include "assembler/wtf/Platform.h" --#include "assembler/jit/ExecutableAllocator.h" - #include "yarr/BumpPointerAllocator.h" - #include "methodjit/MethodJIT.h" - #include "methodjit/PolyIC.h" - #include "methodjit/MonoIC.h" - #include "vm/Debugger.h" - - #include "jsgcinlines.h" - #include "jsscopeinlines.h" diff --git a/mozilla-disable-neon-option.patch b/mozilla-disable-neon-option.patch index f23654a..aa61e24 100644 --- a/mozilla-disable-neon-option.patch +++ b/mozilla-disable-neon-option.patch @@ -1,12 +1,12 @@ # HG changeset patch # User Joop Boonen -# Parent be20a0ae420eb2b3584ce2c5d241e2817bac8593 +# Parent 5f38d3aa0414fe0ac7ff1f0b47da44069e7ccdda Add configure option to allow disabling of neon. diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in -@@ -1674,41 +1674,47 @@ if test -n "$all_flags"; then +@@ -1726,41 +1726,47 @@ if test -n "$all_flags"; then ASFLAGS="$ASFLAGS $all_flags" if test -n "$thumb_flag"; then LDFLAGS="$LDFLAGS $thumb_flag" @@ -20,26 +20,6 @@ diff --git a/configure.in b/configure.in - # We try to link so that this also fails when - # building with LTO. - AC_TRY_LINK([], -- [asm("uqadd8 r1, r1, r2");], -- result="yes", result="no") -- AC_MSG_RESULT("$result") -- if test "$result" = "yes"; then -- AC_DEFINE(HAVE_ARM_SIMD) -- HAVE_ARM_SIMD=1 -- fi -- -- AC_MSG_CHECKING(for ARM NEON support in compiler) -- # We try to link so that this also fails when -- # building with LTO. -- AC_TRY_LINK([], -- [asm(".fpu neon\n vadd.i8 d0, d0, d0");], -- result="yes", result="no") -- AC_MSG_RESULT("$result") -- if test "$result" = "yes"; then -- AC_DEFINE(HAVE_ARM_NEON) -- HAVE_ARM_NEON=1 -- fi --fi # CPU_ARCH = arm +MOZ_ARG_DISABLE_BOOL(neon, +[ --disable-neon Disable neon extensions], + NS_DISABLE_NEON=1, @@ -50,24 +30,36 @@ diff --git a/configure.in b/configure.in + # We try to link so that this also fails when + # building with LTO. + AC_TRY_LINK([], -+ [asm("uqadd8 r1, r1, r2");], -+ result="yes", result="no") + [asm("uqadd8 r1, r1, r2");], + result="yes", result="no") +- AC_MSG_RESULT("$result") +- if test "$result" = "yes"; then + AC_MSG_RESULT("$result") + if test "$result" = "yes"; then -+ AC_DEFINE(HAVE_ARM_SIMD) -+ HAVE_ARM_SIMD=1 + AC_DEFINE(HAVE_ARM_SIMD) + HAVE_ARM_SIMD=1 +- fi +- +- AC_MSG_CHECKING(for ARM NEON support in compiler) +- # We try to link so that this also fails when +- # building with LTO. +- AC_TRY_LINK([], + fi + + AC_MSG_CHECKING(for ARM NEON support in compiler) + # We try to link so that this also fails when + # building with LTO. + AC_TRY_LINK([], -+ [asm(".fpu neon\n vadd.i8 d0, d0, d0");], -+ result="yes", result="no") + [asm(".fpu neon\n vadd.i8 d0, d0, d0");], + result="yes", result="no") +- AC_MSG_RESULT("$result") +- if test "$result" = "yes"; then + AC_MSG_RESULT("$result") + if test "$result" = "yes"; then -+ AC_DEFINE(HAVE_ARM_NEON) -+ HAVE_ARM_NEON=1 + AC_DEFINE(HAVE_ARM_NEON) + HAVE_ARM_NEON=1 +- fi +-fi # CPU_ARCH = arm + fi + fi # CPU_ARCH = arm +fi @@ -75,14 +67,14 @@ diff --git a/configure.in b/configure.in AC_SUBST(HAVE_ARM_SIMD) AC_SUBST(HAVE_ARM_NEON) - dnl ======================================================== - dnl Android libstdc++, placed here so it can use MOZ_ARCH - dnl computed above. - dnl ======================================================== + dnl ================================================================= + dnl Set up and test static assertion macros used to avoid AC_TRY_RUN, + dnl which is bad when cross compiling. + dnl ================================================================= diff --git a/js/src/configure.in b/js/src/configure.in --- a/js/src/configure.in +++ b/js/src/configure.in -@@ -1604,41 +1604,47 @@ if test -n "$all_flags"; then +@@ -1664,41 +1664,47 @@ if test -n "$all_flags"; then ASFLAGS="$ASFLAGS $all_flags" if test -n "$thumb_flag"; then LDFLAGS="$LDFLAGS $thumb_flag" @@ -96,26 +88,6 @@ diff --git a/js/src/configure.in b/js/src/configure.in - # We try to link so that this also fails when - # building with LTO. - AC_TRY_LINK([], -- [asm("uqadd8 r1, r1, r2");], -- result="yes", result="no") -- AC_MSG_RESULT("$result") -- if test "$result" = "yes"; then -- AC_DEFINE(HAVE_ARM_SIMD) -- HAVE_ARM_SIMD=1 -- fi -- -- AC_MSG_CHECKING(for ARM NEON support in compiler) -- # We try to link so that this also fails when -- # building with LTO. -- AC_TRY_LINK([], -- [asm(".fpu neon\n vadd.i8 d0, d0, d0");], -- result="yes", result="no") -- AC_MSG_RESULT("$result") -- if test "$result" = "yes"; then -- AC_DEFINE(HAVE_ARM_NEON) -- HAVE_ARM_NEON=1 -- fi --fi # CPU_ARCH = arm +MOZ_ARG_DISABLE_BOOL(neon, +[ --disable-neon Disable neon extensions], + NS_DISABLE_NEON=1, @@ -126,24 +98,36 @@ diff --git a/js/src/configure.in b/js/src/configure.in + # We try to link so that this also fails when + # building with LTO. + AC_TRY_LINK([], -+ [asm("uqadd8 r1, r1, r2");], -+ result="yes", result="no") + [asm("uqadd8 r1, r1, r2");], + result="yes", result="no") +- AC_MSG_RESULT("$result") +- if test "$result" = "yes"; then + AC_MSG_RESULT("$result") + if test "$result" = "yes"; then -+ AC_DEFINE(HAVE_ARM_SIMD) -+ HAVE_ARM_SIMD=1 + AC_DEFINE(HAVE_ARM_SIMD) + HAVE_ARM_SIMD=1 +- fi +- +- AC_MSG_CHECKING(for ARM NEON support in compiler) +- # We try to link so that this also fails when +- # building with LTO. +- AC_TRY_LINK([], + fi + + AC_MSG_CHECKING(for ARM NEON support in compiler) + # We try to link so that this also fails when + # building with LTO. + AC_TRY_LINK([], -+ [asm(".fpu neon\n vadd.i8 d0, d0, d0");], -+ result="yes", result="no") + [asm(".fpu neon\n vadd.i8 d0, d0, d0");], + result="yes", result="no") +- AC_MSG_RESULT("$result") +- if test "$result" = "yes"; then + AC_MSG_RESULT("$result") + if test "$result" = "yes"; then -+ AC_DEFINE(HAVE_ARM_NEON) -+ HAVE_ARM_NEON=1 + AC_DEFINE(HAVE_ARM_NEON) + HAVE_ARM_NEON=1 +- fi +-fi # CPU_ARCH = arm + fi + fi # CPU_ARCH = arm +fi @@ -151,7 +135,7 @@ diff --git a/js/src/configure.in b/js/src/configure.in AC_SUBST(HAVE_ARM_SIMD) AC_SUBST(HAVE_ARM_NEON) - dnl ======================================================== - dnl Android libstdc++, placed here so it can use MOZ_ARCH - dnl computed above. - dnl ======================================================== + dnl ================================================================= + dnl Set up and test static assertion macros used to avoid AC_TRY_RUN, + dnl which is bad when cross compiling. + dnl ================================================================= diff --git a/mozilla-dump_syms-static.patch b/mozilla-dump_syms-static.patch index b4903cd..bc811e1 100644 --- a/mozilla-dump_syms-static.patch +++ b/mozilla-dump_syms-static.patch @@ -1,16 +1,16 @@ # HG changeset patch -# Parent e589abb2c4d6aaa6083d254416211ac90360dbdd +# Parent 364802dc5df3b480143a54d318ceef74f32453fb NO-BUG: Ignore a hack which is not needed in distribution build environments. diff --git a/toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/Makefile.in b/toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/Makefile.in --- a/toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/Makefile.in +++ b/toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/Makefile.in -@@ -59,11 +59,11 @@ HOST_LIBS += \ +@@ -58,11 +58,11 @@ HOST_LIBS += \ + $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/dwarf/$(LIB_PREFIX)host_breakpad_dwarf_s.$(LIB_SUFFIX) \ $(NULL) # force C++ linking CPP_PROG_LINK = 1 - FORCE_USE_PIC = 1 #XXX: bug 554854 causes us to be unable to run binaries on the build slaves # due to them having an older libstdc++ diff --git a/mozilla-kde.patch b/mozilla-kde.patch new file mode 100644 index 0000000..7d704d5 --- /dev/null +++ b/mozilla-kde.patch @@ -0,0 +1,3882 @@ +Description: Add KDE integration to Firefox (toolkit parts) +Author: Wolfgang Rosenauer +Author: Lubos Lunak +Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=140751 + https://bugzilla.novell.com/show_bug.cgi?id=170055 + +diff --git a/modules/libpref/src/Makefile.in b/modules/libpref/src/Makefile.in +--- a/modules/libpref/src/Makefile.in ++++ b/modules/libpref/src/Makefile.in +@@ -77,14 +77,16 @@ GREPREF_FILES = $(topsrcdir)/netwerk/bas + # Optimizer bug with GCC 3.2.2 on OS/2 + ifeq ($(OS_ARCH), OS2) + nsPrefService.$(OBJ_SUFFIX): nsPrefService.cpp + $(REPORT_BUILD) + @$(MAKE_DEPS_AUTO_CXX) + $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:-O2=-O1) $(_VPATH_SRCS) + endif + ++LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre ++ + + greprefs.js: $(GREPREF_FILES) + $(PYTHON) $(topsrcdir)/config/Preprocessor.py $(PREF_PPFLAGS) $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) $^ > $@ + + libs:: greprefs.js + $(INSTALL) $^ $(DIST)/bin/ +diff --git a/modules/libpref/src/Preferences.cpp b/modules/libpref/src/Preferences.cpp +--- a/modules/libpref/src/Preferences.cpp ++++ b/modules/libpref/src/Preferences.cpp +@@ -56,16 +56,17 @@ + #include "nsIStringEnumerator.h" + #include "nsIZipReader.h" + #include "nsPrefBranch.h" + #include "nsXPIDLString.h" + #include "nsCRT.h" + #include "nsCOMArray.h" + #include "nsXPCOMCID.h" + #include "nsAutoPtr.h" ++#include "nsKDEUtils.h" + + #include "nsQuickSort.h" + #include "prmem.h" + #include "pldhash.h" + + #include "prefapi.h" + #include "prefread.h" + #include "prefapi_private_data.h" +@@ -935,30 +936,48 @@ pref_LoadPrefsInDir(nsIFile* aDir, char + } + + static nsresult pref_LoadPrefsInDirList(const char *listId) + { + nsresult rv; + nsCOMPtr dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv)); + if (NS_FAILED(rv)) return rv; + ++ // make sure we load these special files after all the others ++ static const char* specialFiles[] = { ++#if defined(XP_UNIX) ++ "" ++#endif ++ }; ++ ++ if (nsKDEUtils::kdeSession()) { ++ for(int i = 0; ++ i < NS_ARRAY_LENGTH(specialFiles); ++ ++i ) { ++ if (*specialFiles[ i ] == '\0') { ++ specialFiles[ i ] = "kde.js"; ++ break; ++ } ++ } ++ } ++ + nsCOMPtr dirList; + dirSvc->Get(listId, + NS_GET_IID(nsISimpleEnumerator), + getter_AddRefs(dirList)); + if (dirList) { + bool hasMore; + while (NS_SUCCEEDED(dirList->HasMoreElements(&hasMore)) && hasMore) { + nsCOMPtr elem; + dirList->GetNext(getter_AddRefs(elem)); + if (elem) { + nsCOMPtr dir = do_QueryInterface(elem); + if (dir) { + // Do we care if a file provided by this process fails to load? +- pref_LoadPrefsInDir(dir, nsnull, 0); ++ pref_LoadPrefsInDir(dir, specialFiles, NS_ARRAY_LENGTH(specialFiles)); + } + } + } + } + return NS_OK; + } + + static nsresult pref_ReadPrefFromJar(nsZipArchive* jarReader, const char *name) +@@ -1051,28 +1070,40 @@ static nsresult pref_InitInitialObjects( + /* these pref file names should not be used: we process them after all other 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(VMS) + , "openvms.js" + #elif defined(_AIX) + , "aix.js" + #endif + #elif defined(XP_OS2) + "os2pref.js" + #elif defined(XP_BEOS) + "beos.js" + #endif + }; + ++ if(nsKDEUtils::kdeSession()) { // TODO what if some setup actually requires the helper? ++ for(int i = 0; ++ i < NS_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 + nsRefPtr appJarReader = mozilla::Omnijar::GetReader(mozilla::Omnijar::APP); + if (appJarReader) { + rv = appJarReader->FindInit("defaults/preferences/*.js$", &findPtr); +diff --git a/toolkit/components/downloads/Makefile.in b/toolkit/components/downloads/Makefile.in +--- a/toolkit/components/downloads/Makefile.in ++++ b/toolkit/components/downloads/Makefile.in +@@ -75,8 +75,10 @@ EXTRA_COMPONENTS = \ + $(NULL) + endif + + ifdef ENABLE_TESTS + DIRS += test + endif + + include $(topsrcdir)/config/rules.mk ++ ++LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre +diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/components/downloads/nsDownloadManager.cpp +--- a/toolkit/components/downloads/nsDownloadManager.cpp ++++ b/toolkit/components/downloads/nsDownloadManager.cpp +@@ -74,16 +74,20 @@ + + #ifdef XP_WIN + #include + #ifdef DOWNLOAD_SCANNER + #include "nsDownloadScanner.h" + #endif + #endif + ++#if defined(XP_UNIX) && !defined(XP_MACOSX) ++#include "nsKDEUtils.h" ++#endif ++ + #ifdef XP_MACOSX + #include + #endif + + #ifdef MOZ_WIDGET_ANDROID + #include "AndroidBridge.h" + #endif + +@@ -2214,16 +2218,25 @@ nsDownload::SetState(DownloadState aStat + nsCOMPtr pref(do_GetService(NS_PREFSERVICE_CONTRACTID)); + + // Master pref to control this function. + bool showTaskbarAlert = true; + if (pref) + pref->GetBoolPref(PREF_BDM_SHOWALERTONCOMPLETE, &showTaskbarAlert); + + if (showTaskbarAlert) { ++ if( nsKDEUtils::kdeSupport()) { ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING( "DOWNLOADFINISHED" )); ++ nsAutoString displayName; ++ GetDisplayName( displayName ); ++ command.AppendElement( nsCAutoString( ToNewUTF8String( displayName ))); ++ nsKDEUtils::command( command ); ++ } else { ++ // begin non-KDE block + PRInt32 alertInterval = 2000; + if (pref) + pref->GetIntPref(PREF_BDM_SHOWALERTINTERVAL, &alertInterval); + + PRInt64 alertIntervalUSec = alertInterval * PR_USEC_PER_MSEC; + PRInt64 goat = PR_Now() - mStartTime; + showTaskbarAlert = goat > alertIntervalUSec; + +@@ -2247,19 +2260,20 @@ nsDownload::SetState(DownloadState aStat + // If downloads are automatically removed per the user's + // retention policy, there's no reason to make the text clickable + // because if it is, they'll click open the download manager and + // the items they downloaded will have been removed. + alerts->ShowAlertNotification( + NS_LITERAL_STRING(DOWNLOAD_MANAGER_ALERT_ICON), title, + message, !removeWhenDone, EmptyString(), mDownloadManager, + EmptyString()); +- } ++ } + } + } ++ } + + #if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_ANDROID) + nsCOMPtr fileURL = do_QueryInterface(mTarget); + nsCOMPtr file; + nsAutoString path; + + if (fileURL && + NS_SUCCEEDED(fileURL->GetFile(getter_AddRefs(file))) && +diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn +--- a/toolkit/content/jar.mn ++++ b/toolkit/content/jar.mn +@@ -40,29 +40,33 @@ toolkit.jar: + *+ content/global/viewZoomOverlay.js (viewZoomOverlay.js) + *+ content/global/bindings/autocomplete.xml (widgets/autocomplete.xml) + *+ content/global/bindings/browser.xml (widgets/browser.xml) + *+ content/global/bindings/button.xml (widgets/button.xml) + *+ content/global/bindings/checkbox.xml (widgets/checkbox.xml) + *+ content/global/bindings/colorpicker.xml (widgets/colorpicker.xml) + *+ content/global/bindings/datetimepicker.xml (widgets/datetimepicker.xml) + *+ content/global/bindings/dialog.xml (widgets/dialog.xml) ++*+ content/global/bindings/dialog-kde.xml (widgets/dialog-kde.xml) ++% override chrome://global/content/bindings/dialog.xml chrome://global/content/bindings/dialog-kde.xml desktop=kde + *+ content/global/bindings/editor.xml (widgets/editor.xml) + * content/global/bindings/expander.xml (widgets/expander.xml) + * content/global/bindings/filefield.xml (widgets/filefield.xml) + *+ content/global/bindings/findbar.xml (widgets/findbar.xml) + *+ content/global/bindings/general.xml (widgets/general.xml) + *+ content/global/bindings/groupbox.xml (widgets/groupbox.xml) + *+ content/global/bindings/listbox.xml (widgets/listbox.xml) + *+ content/global/bindings/menu.xml (widgets/menu.xml) + *+ content/global/bindings/menulist.xml (widgets/menulist.xml) + *+ content/global/bindings/notification.xml (widgets/notification.xml) + *+ content/global/bindings/numberbox.xml (widgets/numberbox.xml) + *+ content/global/bindings/popup.xml (widgets/popup.xml) + *+ content/global/bindings/preferences.xml (widgets/preferences.xml) ++*+ content/global/bindings/preferences-kde.xml (widgets/preferences-kde.xml) ++% override chrome://global/content/bindings/preferences.xml chrome://global/content/bindings/preferences-kde.xml desktop=kde + *+ content/global/bindings/progressmeter.xml (widgets/progressmeter.xml) + *+ content/global/bindings/radio.xml (widgets/radio.xml) + *+ content/global/bindings/resizer.xml (widgets/resizer.xml) + *+ content/global/bindings/richlistbox.xml (widgets/richlistbox.xml) + *+ content/global/bindings/scale.xml (widgets/scale.xml) + *+ content/global/bindings/scrollbar.xml (widgets/scrollbar.xml) + *+ content/global/bindings/scrollbox.xml (widgets/scrollbox.xml) + *+ content/global/bindings/splitter.xml (widgets/splitter.xml) +diff --git a/toolkit/content/widgets/dialog-kde.xml b/toolkit/content/widgets/dialog-kde.xml +new file mode 100644 +--- /dev/null ++++ b/toolkit/content/widgets/dialog-kde.xml +@@ -0,0 +1,447 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ null ++ (function(event) { ++ if (!document.documentElement.cancelDialog()) ++ event.preventDefault(); ++ }) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ (screen.availLeft + screen.availWidth)) ++ newX = (screen.availLeft + screen.availWidth) - window.outerWidth - 20; ++ ++ if (newY < screen.availTop) ++ newY = screen.availTop + 20; ++ if ((newY + window.outerHeight) > (screen.availTop + screen.availHeight)) ++ newY = (screen.availTop + screen.availHeight) - window.outerHeight - 60; ++ ++ window.moveTo( newX, newY ); ++ ]]> ++ ++ ++ ++ ++ ++ 0 ? xOffset : 0; ++ yOffset = yOffset > 0 ? yOffset : 0; ++ window.moveTo(xOffset, yOffset); ++ ]]> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ // see bug 63370 for details ++ this._mStrBundle = Components.classes["@mozilla.org/intl/stringbundle;1"] ++ .getService(Components.interfaces.nsIStringBundleService) ++ .createBundle("chrome://global/locale/dialog.properties"); ++ } ++ return this._mStrBundle; ++ ]]> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ if (!event.defaultPrevented) ++ this.cancelDialog(); ++ ++#ifdef XP_MACOSX ++ ++#else ++ ++ var btn = this.getButton(this.defaultButton); ++ if (btn) ++ btn.setAttribute("default", event.originalTarget == btn || !(event.originalTarget instanceof Components.interfaces.nsIDOMXULButtonElement)); ++ ++#endif ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/toolkit/content/widgets/preferences-kde.xml b/toolkit/content/widgets/preferences-kde.xml +new file mode 100644 +--- /dev/null ++++ b/toolkit/content/widgets/preferences-kde.xml +@@ -0,0 +1,1373 @@ ++ ++ ++ ++ %preferencesDTD; ++ ++ %globalKeysDTD; ++]> ++ ++ ++ ++# ++# = Preferences Window Framework ++# ++# The syntax for use looks something like: ++# ++# ++# ++# ++# ++# ++# ++# ++# ++# ++# ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Components.classes["@mozilla.org/preferences-service;1"] ++ .getService(Components.interfaces.nsIPrefService); ++ ++ ++ Components.classes["@mozilla.org/preferences-service;1"] ++ .getService(Components.interfaces.nsIPrefBranch); ++ ++ ++ this.service.getDefaultBranch(""); ++ ++ ++ Components.classes["@mozilla.org/preferences-service;1"] ++ .getService(Components.interfaces.nsIPrefBranchInternal); ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ this.preferences.rootBranchInternal ++ .removeObserver(this.name, this.preferences); ++ ++ ++ ++ ++ return this.getAttribute("instantApply") == "true" || this.preferences.instantApply; ++ ++ ++ ++ ++ ++ ++ if (val == this.name) ++ return val; ++ ++ this.preferences.rootBranchInternal ++ .removeObserver(this.name, this.preferences); ++ this.setAttribute('name', val); ++ this.preferences.rootBranchInternal ++ .addObserver(val, this.preferences, false); ++ ++ return val; ++ ++ ++ ++ ++ ++ ++ null ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ return this.preferences.rootBranch.prefIsLocked(this.name); ++ ++ ++ ++ ++ ++ return this.getAttribute("disabled") == "true"; ++ ++ ++ ++ ++ ++ ++ ++ ++ return parseInt(this.getAttribute("tabindex")); ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ // defer reset until preference update ++ this.value = undefined; ++ ++ ++ ++ false ++ ++ ++ ++ ++ ++ ++ ++ ++ return this._useDefault ? this.preferences.defaultBranch : this.preferences.rootBranch; ++ ++ ++ ++ false ++ ++ ++ ++ with id='" + this.id + "' and name='" + ++ this.name + "' has unknown type '" + this.type + "'."; ++ consoleService.logStringMessage(msg); ++ ]]> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ this.updateElements(); ++ ++ ++ ++ ++ ++ ++ ++ ++ ++#else ++ title="&preferencesDefaultTitleMac.title;"> ++#endif ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ false ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ this.setAttribute("lastSelected", val); ++ document.persist(this.id, "lastSelected"); ++ return val; ++ ++ ++ ++ ++ if (!this._currentPane) ++ this._currentPane = this.preferencePanes[0]; ++ ++ return this._currentPane; ++ ++ ++ null ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ false ++ ++ ++ ++ 1) ++ aPaneElement.removeAttribute("flex"); ++ // Calling sizeToContent after the first prefpane is loaded ++ // will size the windows contents so style information is ++ // available to calculate correct sizing. ++ if (!this._initialized && prefpanes.length > 1) { ++ if (this._shouldAnimate) ++ this.style.minHeight = 0; ++ window.sizeToContent(); ++ } ++ ++ var oldPane = this.lastSelected ? document.getElementById(this.lastSelected) : this.preferencePanes[0]; ++ oldPane.selected = !(aPaneElement.selected = true); ++ this.lastSelected = aPaneElement.id; ++ this.currentPane = aPaneElement; ++ this._initialized = true; ++ ++ // Only animate if we've switched between prefpanes ++ if (this._shouldAnimate && oldPane.id != aPaneElement.id) { ++ aPaneElement.style.opacity = 0.0; ++ this.animate(oldPane, aPaneElement); ++ } ++ else if (!this._shouldAnimate && prefpanes.length > 1) { ++ var targetHeight = parseInt(window.getComputedStyle(this._paneDeckContainer, "").height); ++ var verticalPadding = parseInt(window.getComputedStyle(aPaneElement, "").paddingTop); ++ verticalPadding += parseInt(window.getComputedStyle(aPaneElement, "").paddingBottom); ++ if (aPaneElement.contentHeight > targetHeight - verticalPadding) { ++ // To workaround the bottom border of a groupbox from being ++ // cutoff an hbox with a class of bottomBox may enclose it. ++ // This needs to include its padding to resize properly. ++ // See bug 394433 ++ var bottomPadding = 0; ++ var bottomBox = aPaneElement.getElementsByAttribute("class", "bottomBox")[0]; ++ if (bottomBox) ++ bottomPadding = parseInt(window.getComputedStyle(bottomBox, "").paddingBottom); ++ window.innerHeight += bottomPadding + verticalPadding + aPaneElement.contentHeight - targetHeight; ++ } ++ ++ // XXX rstrong - extend the contents of the prefpane to ++ // prevent elements from being cutoff (see bug 349098). ++ if (aPaneElement.contentHeight + verticalPadding < targetHeight) ++ aPaneElement._content.style.height = targetHeight - verticalPadding + "px"; ++ } ++ } ++ break; ++ } ++ } ++ ]]> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ oldHeight ? 1 : -1; ++ var sizeDelta = Math.abs(oldHeight - aNewPane.contentHeight); ++ this._animateRemainder = sizeDelta % this._animateIncrement; ++ ++ this._setUpAnimationTimer(oldHeight); ++ ]]> ++ ++ ++ ++ ++ ++ 0 && this._currentHeight >= lastSelectedPane.contentHeight) || ++ (this._multiplier < 0 && this._currentHeight <= lastSelectedPane.contentHeight)) ++ return 0; ++ ++ if ((this._multiplier > 0 && newHeight > lastSelectedPane.contentHeight) || ++ (this._multiplier < 0 && newHeight < lastSelectedPane.contentHeight)) ++ increment = this._animateRemainder * this._multiplier; ++ return increment; ++ ]]> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ null ++ null ++ 15 ++ 40 ++ 5 ++ 0.40 ++ 0 ++ 0 ++ 0 ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ return openDialog(aURL, "", "modal,centerscreen,resizable=no" + (aFeatures != "" ? ("," + aFeatures) : ""), aParams); ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ if (event.originalTarget.hasAttribute("pane")) { ++ var pane = document.getElementById(event.originalTarget.getAttribute("pane")); ++ this.showPane(pane); ++ } ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ false ++ ++ ++ ++ ++ ++ return document.getElementById(aElement.getAttribute("preference")); ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ var targetHeight = parseInt(window.getComputedStyle(this._content, "").height); ++ targetHeight += parseInt(window.getComputedStyle(this._content, "").marginTop); ++ targetHeight += parseInt(window.getComputedStyle(this._content, "").marginBottom); ++ return targetHeight; ++ ++ ++ ++ document.getAnonymousElementByAttribute(this, "class", "content-box"); ++ ++ ++ ++ ++ // This "command" event handler tracks changes made to preferences by ++ // the user in this window. ++ if (event.sourceEvent) ++ event = event.sourceEvent; ++ this.userChangedValue(event.target); ++ ++ ++ // This "select" event handler tracks changes made to colorpicker ++ // preferences by the user in this window. ++ if (event.target.localName == "colorpicker") ++ this.userChangedValue(event.target); ++ ++ ++ // This "change" event handler tracks changes made to preferences by ++ // the user in this window. ++ this.userChangedValue(event.target); ++ ++ ++ // This "input" event handler tracks changes made to preferences by ++ // the user in this window. ++ this.userChangedValue(event.target); ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- ++# ***** BEGIN LICENSE BLOCK ***** ++# Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++# ++# The contents of this file are subject to the Mozilla Public License Version ++# 1.1 (the "License"); you may not use this file except in compliance with ++# the License. You may obtain a copy of the License at ++# http://www.mozilla.org/MPL/ ++# ++# Software distributed under the License is distributed on an "AS IS" basis, ++# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++# for the specific language governing rights and limitations under the ++# License. ++# ++# The Original Code is the Preferences System. ++# ++# The Initial Developer of the Original Code is ++# Ben Goodger. ++# Portions created by the Initial Developer are Copyright (C) 2005 ++# the Initial Developer. All Rights Reserved. ++# ++# Contributor(s): ++# Ben Goodger ++# Josh Aas ++# ++# Alternatively, the contents of this file may be used under the terms of ++# either the GNU General Public License Version 2 or later (the "GPL"), or ++# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++# in which case the provisions of the GPL or the LGPL are applicable instead ++# of those above. If you wish to allow use of your version of this file only ++# under the terms of either the GPL or the LGPL, and not to allow others to ++# use your version of this file under the terms of the MPL, indicate your ++# decision by deleting the provisions above and replace them with the notice ++# and other provisions required by the GPL or the LGPL. If you do not delete ++# the provisions above, a recipient may use your version of this file under ++# the terms of any one of the MPL, the GPL or the LGPL. ++# ++# ***** END LICENSE BLOCK ***** ++ ++# ++# This is PrefWindow 6. The Code Could Well Be Ready, Are You? ++# ++# Historical References: ++# PrefWindow V (February 1, 2003) ++# PrefWindow IV (April 24, 2000) ++# PrefWindow III (January 6, 2000) ++# PrefWindow II (???) ++# PrefWindow I (June 4, 1999) ++# +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 +@@ -45,16 +45,18 @@ + #include "nsReadableUtils.h" + #include "nsArrayUtils.h" + #include "prnetdb.h" + #include "prenv.h" + #include "nsPrintfCString.h" + #include "nsNetUtil.h" + #include "nsISupportsPrimitives.h" + #include "nsIGSettingsService.h" ++#include "nsVoidArray.h" ++#include "nsKDEUtils.h" + + class nsUnixSystemProxySettings : public nsISystemProxySettings { + public: + NS_DECL_ISUPPORTS + NS_DECL_NSISYSTEMPROXYSETTINGS + + nsUnixSystemProxySettings() {} + nsresult Init(); +@@ -64,16 +66,17 @@ private: + + nsCOMPtr mGConf; + nsCOMPtr mGSettings; + bool IsProxyMode(const char* aMode); + nsresult SetProxyResultFromGConf(const char* aKeyBase, const char* aType, nsACString& aResult); + nsresult GetProxyFromGConf(const nsACString& aScheme, const nsACString& aHost, PRInt32 aPort, nsACString& aResult); + nsresult GetProxyFromGSettings(const nsACString& aScheme, const nsACString& aHost, PRInt32 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_ISUPPORTS1(nsUnixSystemProxySettings, nsISystemProxySettings) + + nsresult + nsUnixSystemProxySettings::Init() + { + // If this is a GNOME session, load gconf and try to use its preferences. +@@ -526,16 +529,19 @@ nsUnixSystemProxySettings::GetProxyForUR + nsCAutoString host; + rv = aURI->GetHost(host); + NS_ENSURE_SUCCESS(rv, rv); + + PRInt32 port; + rv = aURI->GetPort(&port); + NS_ENSURE_SUCCESS(rv, rv); + ++ if( nsKDEUtils::kdeSupport()) ++ return GetProxyFromKDE(scheme, host, port, aResult); ++ + if (mGSettings) { + rv = GetProxyFromGSettings(scheme, host, port, aResult); + if (rv == NS_OK) + return rv; + } + if (mGConf) + return GetProxyFromGConf(scheme, host, port, aResult); + +@@ -561,8 +567,34 @@ static const mozilla::Module::ContractID + + static const mozilla::Module kUnixProxyModule = { + mozilla::Module::kVersion, + kUnixProxyCIDs, + kUnixProxyContracts + }; + + NSMODULE_DEFN(nsUnixProxyModule) = &kUnixProxyModule; ++ ++nsresult ++nsUnixSystemProxySettings::GetProxyFromKDE(const nsACString& aScheme, ++ const nsACString& aHost, ++ PRInt32 aPort, ++ nsACString& aResult) ++{ ++ nsCAutoString url; ++ url = aScheme; ++ url += "://"; ++ url += aHost; ++ if( aPort >= 0 ) ++ { ++ url += ":"; ++ url += nsPrintfCString("%d", aPort); ++ } ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING( "GETPROXY" )); ++ command.AppendElement( url ); ++ nsTArray result; ++ if( !nsKDEUtils::command( command, &result ) || result.Length() != 1 ) ++ return NS_ERROR_FAILURE; ++ aResult = result[0]; ++ return NS_OK; ++} ++ +diff --git a/toolkit/xre/Makefile.in b/toolkit/xre/Makefile.in +--- a/toolkit/xre/Makefile.in ++++ b/toolkit/xre/Makefile.in +@@ -96,17 +96,18 @@ else + ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa) + CMMSRCS = nsNativeAppSupportCocoa.mm + EXPORTS += MacQuirks.h + else + ifeq ($(MOZ_WIDGET_TOOLKIT),os2) + CPPSRCS += nsNativeAppSupportOS2.cpp + else + ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) +-CPPSRCS += nsNativeAppSupportUnix.cpp ++CPPSRCS += nsNativeAppSupportUnix.cpp nsKDEUtils.cpp ++EXPORTS += nsKDEUtils.h + else + ifeq ($(MOZ_WIDGET_TOOLKIT),qt) + MOCSRCS += moc_nsNativeAppSupportQt.cpp + CPPSRCS += $(MOCSRCS) + CPPSRCS += nsNativeAppSupportQt.cpp + CPPSRCS += nsQAppInstance.cpp + EXPORTS += nsQAppInstance.h + else +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,372 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++ * ++ * The contents of this file are subject to the Mozilla Public License Version ++ * 1.1 (the "License"); you may not use this file except in compliance with ++ * the License. You may obtain a copy of the License at ++ * http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS IS" basis, ++ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++ * for the specific language governing rights and limitations under the ++ * License. ++ * ++ * The Original Code is Unix Native App Support. ++ * ++ * The Initial Developer of the Original Code is ++ * Mozilla Corporation. ++ * Portions created by the Initial Developer are Copyright (C) 2007 ++ * the Initial Developer. All Rights Reserved. ++ * ++ * Contributor(s): ++ * ++ * Alternatively, the contents of this file may be used under the terms of ++ * either the GNU General Public License Version 2 or later (the "GPL"), or ++ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++ * in which case the provisions of the GPL or the LGPL are applicable instead ++ * of those above. If you wish to allow use of your version of this file only ++ * under the terms of either the GPL or the LGPL, and not to allow others to ++ * use your version of this file under the terms of the MPL, indicate your ++ * decision by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL or the LGPL. If you do not delete ++ * the provisions above, a recipient may use your version of this file under ++ * the terms of any one of the MPL, the GPL or the LGPL. ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include "nsKDEUtils.h" ++#include "nsIWidget.h" ++#include "nsISupportsPrimitives.h" ++#include "nsIMutableArray.h" ++#include "nsComponentManagerUtils.h" ++#include "nsArrayUtils.h" ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++//#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 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* 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 ); ++ nsCAutoString 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) ++ { ++ NS_ENSURE_ARG( command ); ++ ++ nsTArray in; ++ PRUint32 length; ++ command->GetLength( &length ); ++ for ( PRUint32 i = 0; i < length; i++ ) ++ { ++ nsCOMPtr str = do_QueryElementAt( command, i ); ++ if( str ) ++ { ++ nsCAutoString 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, false ); ++ } ++ ++ NS_ADDREF( *output = result); ++ return ret; ++ } ++ ++ ++bool nsKDEUtils::commandBlockUi( const nsTArray& command, const GtkWindow* parent, nsTArray* output ) ++ { ++ return self()->internalCommand( command, parent, true, output ); ++ } ++ ++bool nsKDEUtils::internalCommand( const nsTArray& command, const 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 && parent->group ) ++ gtk_window_group_add_window( parent->group, 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 ) ++ _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,81 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- ++ * ++ * ***** BEGIN LICENSE BLOCK ***** ++ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++ * ++ * The contents of this file are subject to the Mozilla Public License Version ++ * 1.1 (the "License"); you may not use this file except in compliance with ++ * the License. You may obtain a copy of the License at ++ * http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS IS" basis, ++ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++ * for the specific language governing rights and limitations under the ++ * License. ++ * ++ * The Original Code is Mozilla Communicator client code. ++ * ++ * The Initial Developer of the Original Code is ++ * Netscape Communications Corporation. ++ * Portions created by the Initial Developer are Copyright (C) 1998 ++ * the Initial Developer. All Rights Reserved. ++ * ++ * Contributor(s): ++ * ++ * Alternatively, the contents of this file may be used under the terms of ++ * either of the GNU General Public License Version 2 or later (the "GPL"), ++ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++ * in which case the provisions of the GPL or the LGPL are applicable instead ++ * of those above. If you wish to allow use of your version of this file only ++ * under the terms of either the GPL or the LGPL, and not to allow others to ++ * use your version of this file under the terms of the MPL, indicate your ++ * decision by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL or the LGPL. If you do not delete ++ * the provisions above, a recipient may use your version of this file under ++ * the terms of any one of the MPL, the GPL or the LGPL. ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#ifndef nsKDEUtils_h__ ++#define nsKDEUtils_h__ ++ ++#include "nsStringGlue.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, const 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, const GtkWindow* parent, bool isParent, ++ nsTArray* output ); ++ FILE* commandFile; ++ FILE* replyFile; ++ }; ++ ++#endif // nsKDEUtils +diff --git a/uriloader/exthandler/Makefile.in b/uriloader/exthandler/Makefile.in +--- a/uriloader/exthandler/Makefile.in ++++ b/uriloader/exthandler/Makefile.in +@@ -92,18 +92,19 @@ LOCAL_INCLUDES = -I$(srcdir) + LOCAL_INCLUDES += -I$(topsrcdir)/dom/base \ + -I$(topsrcdir)/dom/ipc \ + -I$(topsrcdir)/content/base/src \ + -I$(topsrcdir)/content/events/src \ + -I$(topsrcdir)/netwerk/base/src \ + -I$(topsrcdir)/netwerk/protocol/http + + ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) +-OSHELPER += nsGNOMERegistry.cpp ++OSHELPER += nsCommonRegistry.cpp nsGNOMERegistry.cpp nsKDERegistry.cpp + OSHELPER += nsMIMEInfoUnix.cpp ++LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre + endif + + ifeq ($(MOZ_WIDGET_TOOLKIT),android) + OSHELPER += nsMIMEInfoAndroid.cpp + OSHELPER += nsAndroidHandlerApp.cpp + OSHELPER += nsExternalSharingAppService.cpp + EXPORTS += nsExternalSharingAppService.h + OSHELPER += nsExternalURLHandlerService.cpp +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,87 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++ * ++ * The contents of this file are subject to the Mozilla Public License Version ++ * 1.1 (the "License"); you may not use this file except in compliance with ++ * the License. You may obtain a copy of the License at ++ * http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS IS" basis, ++ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++ * for the specific language governing rights and limitations under the ++ * License. ++ * ++ * The Original Code is the GNOME helper app implementation. ++ * ++ * The Initial Developer of the Original Code is ++ * IBM Corporation. ++ * Portions created by the Initial Developer are Copyright (C) 2003 ++ * the Initial Developer. All Rights Reserved. ++ * ++ * Contributor(s): ++ * Brian Ryner (Original Author) ++ * ++ * Alternatively, the contents of this file may be used under the terms of ++ * either the GNU General Public License Version 2 or later (the "GPL"), or ++ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++ * in which case the provisions of the GPL or the LGPL are applicable instead ++ * of those above. If you wish to allow use of your version of this file only ++ * under the terms of either the GPL or the LGPL, and not to allow others to ++ * use your version of this file under the terms of the MPL, indicate your ++ * decision by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL or the LGPL. If you do not delete ++ * the provisions above, a recipient may use your version of this file under ++ * the terms of any one of the MPL, the GPL or the LGPL. ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include "nsCommonRegistry.h" ++ ++#include "nsGNOMERegistry.h" ++#include "nsKDERegistry.h" ++#include "nsString.h" ++#include "nsVoidArray.h" ++#include "nsKDEUtils.h" ++ ++/* static */ PRBool ++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,56 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++ * ++ * The contents of this file are subject to the Mozilla Public License Version ++ * 1.1 (the "License"); you may not use this file except in compliance with ++ * the License. You may obtain a copy of the License at ++ * http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS IS" basis, ++ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++ * for the specific language governing rights and limitations under the ++ * License. ++ * ++ * The Original Code is the GNOME helper app implementation. ++ * ++ * The Initial Developer of the Original Code is ++ * IBM Corporation. ++ * Portions created by the Initial Developer are Copyright (C) 2003 ++ * the Initial Developer. All Rights Reserved. ++ * ++ * Contributor(s): ++ * Brian Ryner (Original Author) ++ * ++ * Alternatively, the contents of this file may be used under the terms of ++ * either the GNU General Public License Version 2 or later (the "GPL"), or ++ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++ * in which case the provisions of the GPL or the LGPL are applicable instead ++ * of those above. If you wish to allow use of your version of this file only ++ * under the terms of either the GPL or the LGPL, and not to allow others to ++ * use your version of this file under the terms of the MPL, indicate your ++ * decision by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL or the LGPL. If you do not delete ++ * the provisions above, a recipient may use your version of this file under ++ * the terms of any one of the MPL, the GPL or the LGPL. ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include "nsIURI.h" ++#include "nsCOMPtr.h" ++ ++class nsMIMEInfoBase; ++ ++class nsCommonRegistry ++{ ++ public: ++ static PRBool 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); ++}; +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,119 @@ ++/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++ * ++ * The contents of this file are subject to the Mozilla Public License Version ++ * 1.1 (the "License"); you may not use this file except in compliance with ++ * the License. You may obtain a copy of the License at ++ * http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS IS" basis, ++ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++ * for the specific language governing rights and limitations under the ++ * License. ++ * ++ * The Original Code is the GNOME helper app implementation. ++ * ++ * The Initial Developer of the Original Code is ++ * IBM Corporation. ++ * Portions created by the Initial Developer are Copyright (C) 2003 ++ * the Initial Developer. All Rights Reserved. ++ * ++ * Contributor(s): ++ * Brian Ryner (Original Author) ++ * ++ * Alternatively, the contents of this file may be used under the terms of ++ * either the GNU General Public License Version 2 or later (the "GPL"), or ++ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++ * in which case the provisions of the GPL or the LGPL are applicable instead ++ * of those above. If you wish to allow use of your version of this file only ++ * under the terms of either the GPL or the LGPL, and not to allow others to ++ * use your version of this file under the terms of the MPL, indicate your ++ * decision by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL or the LGPL. If you do not delete ++ * the provisions above, a recipient may use your version of this file under ++ * the terms of any one of the MPL, the GPL or the LGPL. ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include "nsKDERegistry.h" ++#include "prlink.h" ++#include "prmem.h" ++#include "nsString.h" ++#include "nsILocalFile.h" ++#include "nsMIMEInfoUnix.h" ++#include "nsAutoPtr.h" ++#include "nsKDEUtils.h" ++ ++/* static */ PRBool ++nsKDERegistry::HandlerExists(const char *aProtocolScheme) ++{ ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING( "HANDLEREXISTS" )); ++ command.AppendElement( nsCAutoString( aProtocolScheme )); ++ return nsKDEUtils::command( command ); ++} ++ ++/* static */ nsresult ++nsKDERegistry::LoadURL(nsIURI *aURL) ++{ ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING( "OPEN" )); ++ nsCString url; ++ aURL->GetSpec( url ); ++ command.AppendElement( url ); ++ return nsKDEUtils::command( command ); ++} ++ ++/* static */ void ++nsKDERegistry::GetAppDescForScheme(const nsACString& aScheme, ++ nsAString& aDesc) ++{ ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING( "GETAPPDESCFORSCHEME" )); ++ 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( NS_LITERAL_CSTRING( "GETFROMEXTENSION" )); ++ command.AppendElement( aFileExt ); ++ return GetFromHelper( command ); ++} ++ ++/* static */ already_AddRefed ++nsKDERegistry::GetFromType(const nsACString& aMIMEType) ++{ ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING( "GETFROMTYPE" )); ++ 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 ]; ++ nsRefPtr mimeInfo = new nsMIMEInfoUnix( mimetype ); ++ NS_ENSURE_TRUE(mimeInfo, nsnull); ++ nsCString description = output[ 1 ]; ++ mimeInfo->SetDescription(NS_ConvertUTF8toUTF16(description)); ++ nsCString handlerAppName = output[ 2 ]; ++ mimeInfo->SetDefaultDescription(NS_ConvertUTF8toUTF16(handlerAppName)); ++ mimeInfo->SetPreferredAction(nsIMIMEInfo::useSystemDefault); ++ nsMIMEInfoBase* retval; ++ NS_ADDREF((retval = mimeInfo)); ++ return retval; ++ } ++ return nsnull; ++} +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,62 @@ ++/* ***** BEGIN LICENSE BLOCK ***** ++ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 ++ * ++ * The contents of this file are subject to the Mozilla Public License Version ++ * 1.1 (the "License"); you may not use this file except in compliance with ++ * the License. You may obtain a copy of the License at ++ * http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS IS" basis, ++ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ++ * for the specific language governing rights and limitations under the ++ * License. ++ * ++ * The Original Code is the GNOME helper app implementation. ++ * ++ * The Initial Developer of the Original Code is ++ * IBM Corporation. ++ * Portions created by the Initial Developer are Copyright (C) 2003 ++ * the Initial Developer. All Rights Reserved. ++ * ++ * Contributor(s): ++ * Brian Ryner (Original Author) ++ * ++ * Alternatively, the contents of this file may be used under the terms of ++ * either the GNU General Public License Version 2 or later (the "GPL"), or ++ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ++ * in which case the provisions of the GPL or the LGPL are applicable instead ++ * of those above. If you wish to allow use of your version of this file only ++ * under the terms of either the GPL or the LGPL, and not to allow others to ++ * use your version of this file under the terms of the MPL, indicate your ++ * decision by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL or the LGPL. If you do not delete ++ * the provisions above, a recipient may use your version of this file under ++ * the terms of any one of the MPL, the GPL or the LGPL. ++ * ++ * ***** END LICENSE BLOCK ***** */ ++ ++#include "nsIURI.h" ++#include "nsCOMPtr.h" ++#include "nsTArray.h" ++ ++class nsMIMEInfoBase; ++class nsCAutoString; ++class nsCString; ++ ++class nsKDERegistry ++{ ++ public: ++ static PRBool 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); ++ ++}; +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 +@@ -50,30 +50,33 @@ + #include + #if (MOZ_ENABLE_CONTENTACTION) + #include + #include "nsContentHandlerApp.h" + #endif + #endif + + #include "nsMIMEInfoUnix.h" +-#include "nsGNOMERegistry.h" ++#include "nsCommonRegistry.h" + #include "nsIGIOService.h" + #include "nsNetCID.h" + #include "nsIIOService.h" + #include "nsIGnomeVFSService.h" + #include "nsAutoPtr.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) + { +- nsresult rv = nsGNOMERegistry::LoadURL(aURI); ++ nsresult rv = nsCommonRegistry::LoadURL(aURI); + + #if (MOZ_PLATFORM_MAEMO == 5) && defined (MOZ_ENABLE_GNOMEVFS) + if (NS_FAILED(rv)){ + HildonURIAction *action = hildon_uri_get_default_action(mSchemeOrType.get(), nsnull); + if (action) { + nsCAutoString spec; + aURI->GetAsciiSpec(spec); + if (hildon_uri_open(spec.get(), action, nsnull)) +@@ -95,22 +98,22 @@ nsMIMEInfoUnix::LoadUriInternal(nsIURI * + + return rv; + } + + NS_IMETHODIMP + nsMIMEInfoUnix::GetHasDefaultHandler(bool *_retval) + { + *_retval = false; +- nsRefPtr mimeInfo = nsGNOMERegistry::GetFromType(mSchemeOrType); ++ nsRefPtr mimeInfo = nsCommonRegistry::GetFromType(mSchemeOrType); + if (!mimeInfo) { + nsCAutoString 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; + +@@ -153,16 +156,33 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns + ContentAction::Action::defaultActionForFile(uri, QString(mSchemeOrType.get())); + if (action.isValid()) { + action.trigger(); + return NS_OK; + } + return NS_ERROR_FAILURE; + #endif + ++ if( nsKDEUtils::kdeSupport()) { ++ bool supports; ++ if( NS_SUCCEEDED( GetHasDefaultHandler( &supports )) && supports ) { ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING( "OPEN" )); ++ command.AppendElement( nativePath ); ++ command.AppendElement( NS_LITERAL_CSTRING( "MIMETYPE" )); ++ command.AppendElement( mSchemeOrType ); ++ if( nsKDEUtils::command( command )) ++ return NS_OK; ++ } ++ if (!mDefaultApplication) ++ return NS_ERROR_FILE_NOT_FOUND; ++ ++ return LaunchWithIProcess(mDefaultApplication, nativePath); ++ } ++ + nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); + nsCAutoString uriSpec; + if (giovfs) { + // nsGIOMimeApp->Launch wants a URI string instead of local file + nsresult rv; + nsCOMPtr ioservice = do_GetService(NS_IOSERVICE_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr uri; +@@ -180,17 +200,17 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns + /* Fallback to GnomeVFS */ + nsCOMPtr app; + if (NS_SUCCEEDED(gnomevfs->GetAppForMimeType(mSchemeOrType, getter_AddRefs(app))) && app) + return app->Launch(nativePath); + } + + // If we haven't got an app we try to get a valid one by searching for the + // extension mapped type +- nsRefPtr mimeInfo = nsGNOMERegistry::GetFromExtension(nativePath); ++ nsRefPtr mimeInfo = nsCommonRegistry::GetFromExtension(nativePath); + if (mimeInfo) { + nsCAutoString type; + mimeInfo->GetType(type); + if (giovfs) { + nsCOMPtr app; + if (NS_SUCCEEDED(giovfs->GetAppForMimeType(type, getter_AddRefs(app))) && app) + return app->Launch(uriSpec); + } else if (gnomevfs) { +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 +@@ -44,17 +44,17 @@ + #if defined(MOZ_ENABLE_CONTENTACTION) + #include + #include + #endif + + #include "nsOSHelperAppService.h" + #include "nsMIMEInfoUnix.h" + #ifdef MOZ_WIDGET_GTK2 +-#include "nsGNOMERegistry.h" ++#include "nsCommonRegistry.h" + #endif + #include "nsISupports.h" + #include "nsString.h" + #include "nsReadableUtils.h" + #include "nsUnicharUtils.h" + #include "nsXPIDLString.h" + #include "nsIURL.h" + #include "nsIFileStreams.h" +@@ -1191,29 +1191,29 @@ nsresult nsOSHelperAppService::OSProtoco + ContentAction::Action::defaultActionForScheme(QString(aProtocolScheme) + ':'); + + if (action.isValid()) + *aHandlerExists = true; + #endif + + #ifdef MOZ_WIDGET_GTK2 + // Check the GConf registry for a protocol handler +- *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme); ++ *aHandlerExists = nsCommonRegistry::HandlerExists(aProtocolScheme); + #if (MOZ_PLATFORM_MAEMO == 5) && defined (MOZ_ENABLE_GNOMEVFS) + *aHandlerExists = nsMIMEInfoUnix::HandlerExists(aProtocolScheme); + #endif + #endif + + return NS_OK; + } + + NS_IMETHODIMP nsOSHelperAppService::GetApplicationDescription(const nsACString& aScheme, nsAString& _retval) + { + #ifdef MOZ_WIDGET_GTK2 +- nsGNOMERegistry::GetAppDescForScheme(aScheme, _retval); ++ nsCommonRegistry::GetAppDescForScheme(aScheme, _retval); + return _retval.IsEmpty() ? NS_ERROR_NOT_AVAILABLE : NS_OK; + #else + return NS_ERROR_NOT_AVAILABLE; + #endif + } + + nsresult nsOSHelperAppService::GetFileTokenForPath(const PRUnichar * platformAppPath, nsIFile ** aFile) + { +@@ -1299,17 +1299,17 @@ nsOSHelperAppService::GetFromExtension(c + minorType, + mime_types_description, + true); + + if (NS_FAILED(rv) || majorType.IsEmpty()) { + + #ifdef MOZ_WIDGET_GTK2 + LOG(("Looking in GNOME registry\n")); +- nsMIMEInfoBase *gnomeInfo = nsGNOMERegistry::GetFromExtension(aFileExt).get(); ++ nsMIMEInfoBase *gnomeInfo = nsCommonRegistry::GetFromExtension(aFileExt).get(); + if (gnomeInfo) { + LOG(("Got MIMEInfo from GNOME registry\n")); + return gnomeInfo; + } + #endif + + rv = LookUpTypeAndDescription(NS_ConvertUTF8toUTF16(aFileExt), + majorType, +@@ -1425,17 +1425,17 @@ nsOSHelperAppService::GetFromType(const + #ifdef MOZ_WIDGET_GTK2 + nsMIMEInfoBase *gnomeInfo = nsnull; + if (handler.IsEmpty()) { + // No useful data yet. Check the GNOME registry. Unfortunately, newer + // GNOME versions no longer have type-to-extension mappings, so we might + // get back a MIMEInfo without any extensions set. In that case we'll have + // to look in our mime.types files for the extensions. + LOG(("Looking in GNOME registry\n")); +- gnomeInfo = nsGNOMERegistry::GetFromType(aMIMEType).get(); ++ gnomeInfo = nsCommonRegistry::GetFromType(aMIMEType).get(); + if (gnomeInfo && gnomeInfo->HasExtensions()) { + LOG(("Got MIMEInfo from GNOME registry, and it has extensions set\n")); + return gnomeInfo; + } + } + #endif + + // Now look up our extensions +diff --git a/widget/src/gtk2/Makefile.in b/widget/src/gtk2/Makefile.in +--- a/widget/src/gtk2/Makefile.in ++++ b/widget/src/gtk2/Makefile.in +@@ -135,11 +135,14 @@ DEFINES += -DCAIRO_GFX + + INCLUDES += \ + -I$(srcdir)/../xpwidgets \ + -I$(srcdir)/../shared \ + -I$(topsrcdir)/layout/generic \ + -I$(topsrcdir)/layout/xul/base/src \ + -I$(topsrcdir)/other-licenses/atk-1.0 \ + $(NULL) ++ ++LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre ++ + ifdef MOZ_X11 + INCLUDES += -I$(srcdir)/../shared/x11 + endif +diff --git a/widget/src/gtk2/nsFilePicker.cpp b/widget/src/gtk2/nsFilePicker.cpp +--- a/widget/src/gtk2/nsFilePicker.cpp ++++ b/widget/src/gtk2/nsFilePicker.cpp +@@ -33,16 +33,17 @@ + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + #include "mozilla/Util.h" + + #include ++#include + + #include "nsIFileURL.h" + #include "nsIURI.h" + #include "nsIWidget.h" + #include "nsILocalFile.h" + #include "nsIStringBundle.h" + + #include "nsArrayEnumerator.h" +@@ -51,16 +52,17 @@ + #include "nsNetUtil.h" + #include "nsReadableUtils.h" + #include "mozcontainer.h" + + #include "prmem.h" + #include "prlink.h" + + #include "nsFilePicker.h" ++#include "nsKDEUtils.h" + + #if (MOZ_PLATFORM_MAEMO == 5) + #include + #endif + + using namespace mozilla; + + #define MAX_PREVIEW_SIZE 180 +@@ -285,17 +287,19 @@ nsFilePicker::AppendFilters(PRInt32 aFil + 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; + } + + nsCAutoString filter, name; + CopyUTF16toUTF8(aFilter, filter); + CopyUTF16toUTF8(aTitle, name); + + mFilters.AppendElement(filter); + mFilterNames.AppendElement(name); +@@ -390,16 +394,19 @@ nsFilePicker::GetFiles(nsISimpleEnumerat + return NS_ERROR_FAILURE; + } + + NS_IMETHODIMP + nsFilePicker::Show(PRInt16 *aReturn) + { + NS_ENSURE_ARG_POINTER(aReturn); + ++ if( nsKDEUtils::kdeSupport()) ++ return kdeFileDialog(aReturn); ++ + nsXPIDLCString title; + title.Adopt(ToNewUTF8String(mTitle)); + + GtkWindow *parent_widget = get_gtk_window_for_nsiwidget(mParentWidget); + + GtkFileChooserAction action = GetGtkFileChooserAction(mMode); + const gchar *accept_button = (action == GTK_FILE_CHOOSER_ACTION_SAVE) + ? GTK_STOCK_SAVE : GTK_STOCK_OPEN; +@@ -538,8 +545,234 @@ nsFilePicker::Show(PRInt16 *aReturn) + *aReturn = nsIFilePicker::returnCancel; + break; + } + + gtk_widget_destroy(file_chooser); + + return NS_OK; + } ++ ++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 = get_gtk_window_for_nsiwidget( widget ); ++ 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(PRInt16 *aReturn) ++ { ++ NS_ENSURE_ARG_POINTER(aReturn); ++ ++ if( mMode == modeOpen && mFilters.Length() == 1 && mFilters[ 0 ].EqualsLiteral( "..apps" )) ++ return kdeAppsDialog( aReturn ); ++ ++ nsXPIDLCString 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; ++ } ++ } ++ ++ nsCAutoString directory; ++ if (mDisplayDirectory) { ++ mDisplayDirectory->GetNativePath(directory); ++ } else if (mPrevDisplayDirectory) { ++ mPrevDisplayDirectory->GetNativePath(directory); ++ } ++ ++ nsCAutoString startdir; ++ if (!directory.IsEmpty()) { ++ startdir = directory; ++ } ++ if (mMode == nsIFilePicker::modeSave) { ++ if( !startdir.IsEmpty()) ++ { ++ startdir += "/"; ++ startdir += ToNewUTF8String(mDefault); ++ } ++ else ++ startdir = ToNewUTF8String(mDefault); ++ } ++ if( startdir.IsEmpty()) ++ startdir = "."; ++ ++ nsCAutoString 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( nsCAutoString( arg )); ++ command.AppendElement( startdir ); ++ if( mMode != nsIFilePicker::modeGetFolder ) ++ { ++ command.AppendElement( filters ); ++ nsCAutoString selected; ++ selected.AppendInt( mSelectedType ); ++ command.AppendElement( selected ); ++ } ++ command.AppendElement( title ); ++ if( mMode == nsIFilePicker::modeOpenMultiple ) ++ command.AppendElement( NS_LITERAL_CSTRING( "MULTIPLE" )); ++ if( PRInt32 xid = windowToXid( mParentWidget )) ++ { ++ command.AppendElement( NS_LITERAL_CSTRING( "PARENT" )); ++ nsCAutoString parent; ++ parent.AppendInt( xid ); ++ command.AppendElement( parent ); ++ } ++ ++ nsTArray output; ++ if( nsKDEUtils::commandBlockUi( command, get_gtk_window_for_nsiwidget( mParentWidget ), &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 :-/ ++ { ++ mFileURL = nsCString( "file://" ); ++ mFileURL.Append( output[ 0 ] ); ++ } ++ } ++ // Remember last used directory. ++ nsCOMPtr file; ++ GetFile(getter_AddRefs(file)); ++ if (file) { ++ nsCOMPtr dir; ++ file->GetParent(getter_AddRefs(dir)); ++ nsCOMPtr localDir(do_QueryInterface(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(PRInt16 *aReturn) ++ { ++ NS_ENSURE_ARG_POINTER(aReturn); ++ ++ nsXPIDLCString title; ++ title.Adopt(ToNewUTF8String(mTitle)); ++ ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING( "APPSDIALOG" )); ++ command.AppendElement( title ); ++ if( PRInt32 xid = windowToXid( mParentWidget )) ++ { ++ command.AppendElement( NS_LITERAL_CSTRING( "PARENT" )); ++ nsCAutoString parent; ++ parent.AppendInt( xid ); ++ command.AppendElement( parent ); ++ } ++ ++ nsTArray output; ++ if( nsKDEUtils::commandBlockUi( command, get_gtk_window_for_nsiwidget( mParentWidget ), &output )) ++ { ++ *aReturn = nsIFilePicker::returnOK; ++ mFileURL = output.Length() > 0 ? output[ 0 ] : nsCString(); ++ } ++ else ++ { ++ *aReturn = nsIFilePicker::returnCancel; ++ } ++ return NS_OK; ++ } +diff --git a/widget/src/gtk2/nsFilePicker.h b/widget/src/gtk2/nsFilePicker.h +--- a/widget/src/gtk2/nsFilePicker.h ++++ b/widget/src/gtk2/nsFilePicker.h +@@ -89,11 +89,17 @@ protected: + nsString mDefault; + nsString mDefaultExtension; + + nsTArray mFilters; + nsTArray mFilterNames; + + private: + static nsILocalFile *mPrevDisplayDirectory; ++ ++ bool kdeRunning(); ++ bool getKdeRunning(); ++ NS_IMETHODIMP kdeFileDialog(PRInt16 *aReturn); ++ NS_IMETHODIMP kdeAppsDialog(PRInt16 *aReturn); ++ nsCString kdeMakeFilter( int index ); + }; + + #endif +diff --git a/xpcom/components/Makefile.in b/xpcom/components/Makefile.in +--- a/xpcom/components/Makefile.in ++++ b/xpcom/components/Makefile.in +@@ -92,10 +92,11 @@ LOCAL_INCLUDES = \ + # we don't want the shared lib, but we want to force the creation of a static lib. + FORCE_STATIC_LIB = 1 + + include $(topsrcdir)/config/rules.mk + + DEFINES += -D_IMPL_NS_COM + + ifneq (,$(filter gtk2,$(MOZ_WIDGET_TOOLKIT))) ++LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre + CXXFLAGS += $(MOZ_GTK2_CFLAGS) + endif +diff --git a/xpcom/components/ManifestParser.cpp b/xpcom/components/ManifestParser.cpp +--- a/xpcom/components/ManifestParser.cpp ++++ b/xpcom/components/ManifestParser.cpp +@@ -62,16 +62,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; + +@@ -429,16 +430,17 @@ ParseManifest(NSLocationType type, FileL + NS_NAMED_LITERAL_STRING(kPlatform, "platform"); + NS_NAMED_LITERAL_STRING(kContentAccessible, "contentaccessible"); + NS_NAMED_LITERAL_STRING(kApplication, "application"); + NS_NAMED_LITERAL_STRING(kAppVersion, "appversion"); + NS_NAMED_LITERAL_STRING(kGeckoVersion, "platformversion"); + NS_NAMED_LITERAL_STRING(kOs, "os"); + NS_NAMED_LITERAL_STRING(kOsVersion, "osversion"); + NS_NAMED_LITERAL_STRING(kABI, "abi"); ++ NS_NAMED_LITERAL_STRING(kDesktop, "desktop"); + #if defined(MOZ_WIDGET_ANDROID) + NS_NAMED_LITERAL_STRING(kTablet, "tablet"); + #endif + + // Obsolete + NS_NAMED_LITERAL_STRING(kXPCNativeWrappers, "xpcnativewrappers"); + + nsAutoString appID; +@@ -476,41 +478,46 @@ ParseManifest(NSLocationType type, FileL + CopyUTF8toUTF16(s, abi); + abi.Insert(PRUnichar('_'), 0); + abi.Insert(osTarget, 0); + } + } + } + + nsAutoString osVersion; ++ nsAutoString desktop; + #if defined(XP_WIN) + OSVERSIONINFO info = { sizeof(OSVERSIONINFO) }; + if (GetVersionEx(&info)) { + nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(), + info.dwMajorVersion, + info.dwMinorVersion); + } ++ desktop = NS_LITERAL_STRING("win"); + #elif defined(MOZ_WIDGET_COCOA) + SInt32 majorVersion, minorVersion; + if ((Gestalt(gestaltSystemVersionMajor, &majorVersion) == noErr) && + (Gestalt(gestaltSystemVersionMinor, &minorVersion) == noErr)) { + nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(), + majorVersion, + minorVersion); + } ++ desktop = NS_LITERAL_STRING("macosx"); + #elif defined(MOZ_WIDGET_GTK2) + nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(), + gtk_major_version, + gtk_minor_version); ++ desktop = nsKDEUtils::kdeSession() ? NS_LITERAL_STRING("kde") : NS_LITERAL_STRING("gnome"); + #elif defined(MOZ_WIDGET_ANDROID) + bool isTablet = false; + if (mozilla::AndroidBridge::Bridge()) { + mozilla::AndroidBridge::Bridge()->GetStaticStringField("android/os/Build$VERSION", "RELEASE", osVersion); + isTablet = mozilla::AndroidBridge::Bridge()->IsTablet(); + } ++ desktop = NS_LITERAL_STRING("android"); + #endif + + // Because contracts must be registered after CIDs, we save and process them + // at the end. + nsTArray contracts; + + char *token; + char *newline = buf; +@@ -592,24 +599,26 @@ ParseManifest(NSLocationType type, FileL + TriState stOsVersion = eUnspecified; + TriState stOs = eUnspecified; + TriState stABI = eUnspecified; + #if defined(MOZ_WIDGET_ANDROID) + TriState stTablet = eUnspecified; + #endif + bool platform = false; + bool contentAccessible = false; ++ TriState stDesktop = eUnspecified; + + while (NULL != (token = nsCRT::strtok(whitespace, kWhitespace, &whitespace)) && ok) { + ToLowerCase(token); + NS_ConvertASCIItoUTF16 wtoken(token); + + if (CheckStringFlag(kApplication, wtoken, appID, stApp) || + CheckStringFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kABI, wtoken, abi, stABI) || ++ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || + CheckVersionFlag(kOsVersion, wtoken, osVersion, stOsVersion) || + CheckVersionFlag(kAppVersion, wtoken, appVersion, stAppVersion) || + CheckVersionFlag(kGeckoVersion, wtoken, geckoVersion, stGeckoVersion)) + continue; + + #if defined(MOZ_WIDGET_ANDROID) + bool tablet = false; + if (CheckFlag(kTablet, wtoken, tablet)) { +@@ -638,16 +647,17 @@ ParseManifest(NSLocationType type, FileL + } + + if (!ok || + stApp == eBad || + stAppVersion == eBad || + stGeckoVersion == eBad || + stOs == eBad || + stOsVersion == eBad || ++ stDesktop == eBad || + #ifdef MOZ_WIDGET_ANDROID + stTablet == eBad || + #endif + stABI == eBad) + continue; + + if (directive->regfunc) { + if (GeckoProcessType_Default != XRE_GetProcessType()) +diff --git a/xpcom/io/Makefile.in b/xpcom/io/Makefile.in +--- a/xpcom/io/Makefile.in ++++ b/xpcom/io/Makefile.in +@@ -188,17 +188,17 @@ include $(topsrcdir)/ipc/chromium/chromi + DEFINES += -D_IMPL_NS_COM + + ifeq ($(OS_ARCH),Linux) + ifneq (,$(findstring lib64,$(libdir))) + DEFINES += -DHAVE_USR_LIB64_DIR + endif + endif + +-LOCAL_INCLUDES += -I.. ++LOCAL_INCLUDES += -I.. -I$(topsrcdir)/toolkit/xre + + ifeq ($(MOZ_PLATFORM_MAEMO),5) + CFLAGS += $(MOZ_DBUS_CFLAGS) + CXXFLAGS += $(MOZ_DBUS_CFLAGS) + endif + + ifdef MOZ_PLATFORM_MAEMO + CFLAGS += $(MOZ_PLATFORM_MAEMO_CFLAGS) $(MOZ_QT_CFLAGS) +diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp +--- a/xpcom/io/nsLocalFileUnix.cpp ++++ b/xpcom/io/nsLocalFileUnix.cpp +@@ -90,16 +90,17 @@ + #include "prproces.h" + #include "nsIDirectoryEnumerator.h" + #include "nsISimpleEnumerator.h" + #include "private/pprio.h" + + #ifdef MOZ_WIDGET_GTK2 + #include "nsIGIOService.h" + #include "nsIGnomeVFSService.h" ++#include "nsKDEUtils.h" + #endif + + #ifdef MOZ_WIDGET_COCOA + #include + #include "CocoaFileUtils.h" + #include "prmem.h" + #include "plbase64.h" + +@@ -1795,44 +1796,51 @@ nsLocalFile::SetPersistentDescriptor(con + return InitWithNativePath(aPersistentDescriptor); + #endif + } + + NS_IMETHODIMP + nsLocalFile::Reveal() + { + #ifdef MOZ_WIDGET_GTK2 +- nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); +- nsCOMPtr gnomevfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); +- if (!giovfs && !gnomevfs) +- return NS_ERROR_FAILURE; +- ++ nsCAutoString url; + bool isDirectory; + if (NS_FAILED(IsDirectory(&isDirectory))) + return NS_ERROR_FAILURE; + + if (isDirectory) { +- if (giovfs) +- return giovfs->ShowURIForInput(mPath); +- else +- /* Fallback to GnomeVFS */ +- return gnomevfs->ShowURIForInput(mPath); ++ url = mPath; + } else { + nsCOMPtr parentDir; + nsCAutoString dirPath; + if (NS_FAILED(GetParent(getter_AddRefs(parentDir)))) + return NS_ERROR_FAILURE; + if (NS_FAILED(parentDir->GetNativePath(dirPath))) + return NS_ERROR_FAILURE; + +- if (giovfs) +- return giovfs->ShowURIForInput(dirPath); +- else +- return gnomevfs->ShowURIForInput(dirPath); ++ url = dirPath; + } ++ ++ if(nsKDEUtils::kdeSupport()) { ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING("OPEN") ); ++ command.AppendElement( url ); ++ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; ++ } ++ ++ nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); ++ nsCOMPtr gnomevfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); ++ if (!giovfs && !gnomevfs) ++ return NS_ERROR_FAILURE; ++ ++ if (giovfs) ++ return giovfs->ShowURIForInput(url); ++ else ++ return gnomevfs->ShowURIForInput(url); ++ + #elif defined(MOZ_WIDGET_COCOA) + CFURLRef url; + if (NS_SUCCEEDED(GetCFURL(&url))) { + nsresult rv = CocoaFileUtils::RevealFileInFinder(url); + ::CFRelease(url); + return rv; + } + return NS_ERROR_FAILURE; +@@ -1858,16 +1866,23 @@ nsLocalFile::Launch() + + if (nsnull == connection) + return NS_ERROR_FAILURE; + + if (hildon_mime_open_file(connection, mPath.get()) != kHILDON_SUCCESS) + return NS_ERROR_FAILURE; + return NS_OK; + #else ++ if( nsKDEUtils::kdeSupport()) { ++ nsTArray command; ++ command.AppendElement( NS_LITERAL_CSTRING("OPEN") ); ++ command.AppendElement( mPath ); ++ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; ++ } ++ + nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); + nsCOMPtr gnomevfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); + if (giovfs) { + return giovfs->ShowURIForInput(mPath); + } else if (gnomevfs) { + /* GnomeVFS fallback */ + return gnomevfs->ShowURIForInput(mPath); + } diff --git a/mozilla-nongnome-proxies.patch b/mozilla-nongnome-proxies.patch new file mode 100644 index 0000000..b1fae8b --- /dev/null +++ b/mozilla-nongnome-proxies.patch @@ -0,0 +1,38 @@ +From: Wolfgang Rosenauer +Subject: Do not use gconf for proxy settings if not running within Gnome + +Index: toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp +=================================================================== +RCS file: /cvsroot/mozilla/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp,v +retrieving revision 1.1 + +diff --git a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp +--- a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp ++++ b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp +@@ -71,18 +71,24 @@ private: + nsresult SetProxyResultFromGSettings(const char* aKeyBase, const char* aType, nsACString& aResult); + }; + + NS_IMPL_ISUPPORTS1(nsUnixSystemProxySettings, nsISystemProxySettings) + + nsresult + nsUnixSystemProxySettings::Init() + { +- mGConf = do_GetService(NS_GCONFSERVICE_CONTRACTID); +- mGSettings = do_GetService(NS_GSETTINGSSERVICE_CONTRACTID); ++ // If this is a GNOME session, load gconf and try to use its preferences. ++ // If gconf is not available (which would be stupid) we'll proceed as if ++ // this was not a GNOME session, using *_PROXY environment variables. ++ const char* sessionType = PR_GetEnv("DESKTOP_SESSION"); ++ if (sessionType && !strcmp(sessionType, "gnome")) { ++ mGConf = do_GetService(NS_GCONFSERVICE_CONTRACTID); ++ mGSettings = do_GetService(NS_GSETTINGSSERVICE_CONTRACTID); ++ } + return NS_OK; + } + + bool + nsUnixSystemProxySettings::IsProxyMode(const char* aMode) + { + nsCAutoString mode; + return NS_SUCCEEDED(mGConf->GetString(NS_LITERAL_CSTRING("/system/proxy/mode"), mode)) && diff --git a/mozilla-shared-nss-db.patch b/mozilla-shared-nss-db.patch index b1af4b3..e69fd1c 100644 --- a/mozilla-shared-nss-db.patch +++ b/mozilla-shared-nss-db.patch @@ -7,7 +7,7 @@ References: diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in --- a/config/autoconf.mk.in +++ b/config/autoconf.mk.in -@@ -567,16 +567,20 @@ MOZ_LIBNOTIFY_LIBS = @MOZ_LIBNOTIFY_LIBS +@@ -581,16 +581,20 @@ MOZ_LIBNOTIFY_LIBS = @MOZ_LIBNOTIFY_LIBS MOZ_ENABLE_LIBNOTIFY = @MOZ_ENABLE_LIBNOTIFY@ MOZ_ALSA_LIBS = @MOZ_ALSA_LIBS@ @@ -31,7 +31,7 @@ diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in -@@ -8093,16 +8093,31 @@ AC_SUBST(QCMS_LIBS) +@@ -8213,16 +8213,31 @@ AC_SUBST(QCMS_LIBS) dnl ======================================================== dnl HarfBuzz @@ -55,23 +55,23 @@ diff --git a/configure.in b/configure.in +AC_SUBST(NSSHELPER_LIBS) + +dnl ======================================================== - dnl OTS - dnl ======================================================== - MOZ_OTS_LIBS='$(DEPTH)/gfx/ots/src/$(LIB_PREFIX)mozots.$(LIB_SUFFIX)' - AC_SUBST(MOZ_OTS_LIBS) - - dnl ======================================================== - dnl Skia + dnl SIL Graphite dnl ======================================================== + if test "$MOZ_GRAPHITE"; then + MOZ_GRAPHITE_LIBS='$(DEPTH)/gfx/graphite2/src/$(LIB_PREFIX)mozgraphite2.$(LIB_SUFFIX)' + AC_DEFINE(MOZ_GRAPHITE) + else + MOZ_GRAPHITE_LIBS= + fi diff --git a/security/manager/ssl/src/Makefile.in b/security/manager/ssl/src/Makefile.in --- a/security/manager/ssl/src/Makefile.in +++ b/security/manager/ssl/src/Makefile.in -@@ -114,12 +114,14 @@ CSRCS += md4.c - - - EXTRA_DEPS = $(NSS_DEP_LIBS) - - DEFINES += -DNSS_ENABLE_ECC +@@ -118,12 +118,14 @@ EXTRA_DEPS = $(NSS_DEP_LIBS) + DEFINES += \ + -DNSS_ENABLE_ECC \ + -DDLL_PREFIX=\"$(DLL_PREFIX)\" \ + -DDLL_SUFFIX=\"$(DLL_SUFFIX)\" \ + $(NULL) # Use local includes because they are inserted before INCLUDES # so that Mozilla's nss.h is used, not glibc's @@ -104,12 +104,12 @@ diff --git a/security/manager/ssl/src/nsNSSComponent.cpp b/security/manager/ssl/ #include "nsNSSComponent.h" #include "nsNSSCallbacks.h" #include "nsNSSIOLayer.h" - #include "nsSSLThread.h" #include "nsCertVerificationThread.h" #include "nsNetUtil.h" #include "nsAppDirectoryServiceDefs.h" -@@ -1725,18 +1732,34 @@ nsNSSComponent::InitializeNSS(bool showW + #include "nsDirectoryService.h" +@@ -1733,18 +1740,34 @@ nsNSSComponent::InitializeNSS(bool showW ConfigureInternalPKCS11Token(); // The NSS_INIT_NOROOTINIT flag turns off the loading of the root certs @@ -149,7 +149,7 @@ diff --git a/security/manager/ssl/src/nsNSSComponent.cpp b/security/manager/ssl/ diff --git a/toolkit/library/Makefile.in b/toolkit/library/Makefile.in --- a/toolkit/library/Makefile.in +++ b/toolkit/library/Makefile.in -@@ -126,17 +126,17 @@ EXTRA_DSO_LDOPTS += -INCREMENTAL:NO +@@ -471,17 +471,17 @@ EXTRA_DSO_LDOPTS += -INCREMENTAL:NO endif endif endif @@ -162,9 +162,9 @@ diff --git a/toolkit/library/Makefile.in b/toolkit/library/Makefile.in +EXTRA_DSO_LDOPTS += $(NSPR_LIBS) $(MOZALLOC_LIB) $(NSSHELPER_LIBS) ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa) - CXXFLAGS += $(TK_CFLAGS) + CXXFLAGS += $(TK_CFLAGS) OS_LIBS += \ - -framework SystemConfiguration \ - -framework QuickTime \ - -framework IOKit \ - -F/System/Library/PrivateFrameworks -framework CoreUI \ + -framework SystemConfiguration \ + -framework QuickTime \ + -framework IOKit \ + -F/System/Library/PrivateFrameworks -framework CoreUI \ diff --git a/mozilla-yarr-pcre.patch b/mozilla-yarr-pcre.patch deleted file mode 100644 index 294bf6e..0000000 --- a/mozilla-yarr-pcre.patch +++ /dev/null @@ -1,285 +0,0 @@ -From: Mike Hommey -Date: Sat, 24 Dec 2011 09:56:58 +0100 -Subject: Bug 691898 - Use YARR interpreter instead of PCRE on platforms where - YARR JIT is not supported - ---- - js/src/Makefile.in | 21 +++++++++++++-------- - js/src/vm/RegExpObject-inl.h | 28 ++++++---------------------- - js/src/vm/RegExpObject.cpp | 36 ------------------------------------ - js/src/vm/RegExpObject.h | 27 ++++++--------------------- - js/src/yarr/wtfbridge.h | 2 -- - 5 files changed, 25 insertions(+), 89 deletions(-) - -diff --git a/js/src/Makefile.in b/js/src/Makefile.in -index fc48cbd..49f0bdc 100644 ---- a/js/src/Makefile.in -+++ b/js/src/Makefile.in -@@ -416,15 +416,20 @@ CPPSRCS += checks.cc \ - - ifeq (,$(filter arm% sparc %86 x86_64,$(TARGET_CPU))) - --VPATH += $(srcdir)/yarr/pcre \ -+VPATH += $(srcdir)/assembler \ -+ $(srcdir)/assembler/wtf \ -+ $(srcdir)/yarr \ - $(NULL) - - CPPSRCS += \ -- pcre_compile.cpp \ -- pcre_exec.cpp \ -- pcre_tables.cpp \ -- pcre_xclass.cpp \ -- pcre_ucp_searchfuncs.cpp \ -+ Assertions.cpp \ -+ OSAllocatorOS2.cpp \ -+ OSAllocatorPosix.cpp \ -+ OSAllocatorWin.cpp \ -+ PageBlock.cpp \ -+ YarrInterpreter.cpp \ -+ YarrPattern.cpp \ -+ YarrSyntaxChecker.cpp \ - $(NULL) - else - -@@ -1015,10 +1020,10 @@ endif - # Needed to "configure" it correctly. Unfortunately these - # flags wind up being applied to all code in js/src, not just - # the code in js/src/assembler. --CXXFLAGS += -DUSE_SYSTEM_MALLOC=1 -DENABLE_ASSEMBLER=1 -+CXXFLAGS += -DUSE_SYSTEM_MALLOC=1 - - ifneq (,$(ENABLE_YARR_JIT)$(ENABLE_TRACEJIT)$(ENABLE_METHODJIT)) --CXXFLAGS += -DENABLE_JIT=1 -+CXXFLAGS += -DENABLE_JIT=1 -DENABLE_ASSEMBLER=1 - endif - - INCLUDES += -I$(srcdir)/assembler -I$(srcdir)/yarr -diff --git a/js/src/vm/RegExpObject-inl.h b/js/src/vm/RegExpObject-inl.h -index 5f7817d..91108a7 100644 ---- a/js/src/vm/RegExpObject-inl.h -+++ b/js/src/vm/RegExpObject-inl.h -@@ -327,6 +327,7 @@ RegExpPrivate::create(JSContext *cx, JSString *source, RegExpFlag flags, TokenSt - return RetType(self); - } - -+#if ENABLE_YARR_JIT - /* This function should be deleted once bad Android platforms phase out. See bug 604774. */ - inline bool - RegExpPrivateCode::isJITRuntimeEnabled(JSContext *cx) -@@ -337,12 +338,12 @@ RegExpPrivateCode::isJITRuntimeEnabled(JSContext *cx) - return true; - #endif - } -+#endif - - inline bool - RegExpPrivateCode::compile(JSContext *cx, JSLinearString &pattern, TokenStream *ts, - uintN *parenCount, RegExpFlag flags) - { --#if ENABLE_YARR_JIT - /* Parse the pattern. */ - ErrorCode yarrError; - YarrPattern yarrPattern(pattern, bool(flags & IgnoreCaseFlag), bool(flags & MultilineFlag), -@@ -359,7 +360,7 @@ RegExpPrivateCode::compile(JSContext *cx, JSLinearString &pattern, TokenStream * - * case we have to bytecode compile it. - */ - --#ifdef JS_METHODJIT -+#if ENABLE_YARR_JIT && defined(JS_METHODJIT) - if (isJITRuntimeEnabled(cx) && !yarrPattern.m_containsBackreferences) { - if (!cx->compartment->ensureJaegerCompartmentExists(cx)) - return false; -@@ -371,21 +372,11 @@ RegExpPrivateCode::compile(JSContext *cx, JSLinearString &pattern, TokenStream * - } - #endif - -+#if ENABLE_YARR_JIT - codeBlock.setFallBack(true); -+#endif - byteCode = byteCompile(yarrPattern, cx->compartment->regExpAllocator).get(); - return true; --#else /* !defined(ENABLE_YARR_JIT) */ -- int error = 0; -- compiled = jsRegExpCompile(pattern.chars(), pattern.length(), -- ignoreCase() ? JSRegExpIgnoreCase : JSRegExpDoNotIgnoreCase, -- multiline() ? JSRegExpMultiline : JSRegExpSingleLine, -- parenCount, &error); -- if (error) { -- reportPCREError(cx, error); -- return false; -- } -- return true; --#endif - } - - inline bool -@@ -431,19 +422,12 @@ RegExpPrivateCode::execute(JSContext *cx, const jschar *chars, size_t start, siz - else - result = JSC::Yarr::execute(codeBlock, chars, start, length, output); - #else -- result = jsRegExpExecute(cx, compiled, chars, length, start, output, outputCount); -+ result = JSC::Yarr::interpret(byteCode, chars, start, length, output); - #endif - - if (result == -1) - return Success_NotFound; - --#if !ENABLE_YARR_JIT -- if (result < 0) { -- reportPCREError(cx, result); -- return Error; -- } --#endif -- - JS_ASSERT(result >= 0); - return Success; - } -diff --git a/js/src/vm/RegExpObject.cpp b/js/src/vm/RegExpObject.cpp -index f75c6a5..7631dd5 100644 ---- a/js/src/vm/RegExpObject.cpp -+++ b/js/src/vm/RegExpObject.cpp -@@ -251,7 +251,6 @@ Class js::RegExpClass = { - NULL /* trace */ - }; - --#if ENABLE_YARR_JIT - void - RegExpPrivateCode::reportYarrError(JSContext *cx, TokenStream *ts, ErrorCode error) - { -@@ -283,41 +282,6 @@ RegExpPrivateCode::reportYarrError(JSContext *cx, TokenStream *ts, ErrorCode err - } - } - --#else /* !ENABLE_YARR_JIT */ -- --void --RegExpPrivateCode::reportPCREError(JSContext *cx, int error) --{ --#define REPORT(msg_) \ -- JS_ReportErrorFlagsAndNumberUC(cx, JSREPORT_ERROR, js_GetErrorMessage, NULL, msg_); \ -- return -- switch (error) { -- case -2: REPORT(JSMSG_REGEXP_TOO_COMPLEX); -- case 0: JS_NOT_REACHED("Precondition violation: an error must have occurred."); -- case 1: REPORT(JSMSG_TRAILING_SLASH); -- case 2: REPORT(JSMSG_TRAILING_SLASH); -- case 3: REPORT(JSMSG_REGEXP_TOO_COMPLEX); -- case 4: REPORT(JSMSG_BAD_QUANTIFIER); -- case 5: REPORT(JSMSG_BAD_QUANTIFIER); -- case 6: REPORT(JSMSG_BAD_CLASS_RANGE); -- case 7: REPORT(JSMSG_REGEXP_TOO_COMPLEX); -- case 8: REPORT(JSMSG_BAD_CLASS_RANGE); -- case 9: REPORT(JSMSG_BAD_QUANTIFIER); -- case 10: REPORT(JSMSG_UNMATCHED_RIGHT_PAREN); -- case 11: REPORT(JSMSG_REGEXP_TOO_COMPLEX); -- case 12: REPORT(JSMSG_UNMATCHED_RIGHT_PAREN); -- case 13: REPORT(JSMSG_REGEXP_TOO_COMPLEX); -- case 14: REPORT(JSMSG_MISSING_PAREN); -- case 15: REPORT(JSMSG_BAD_BACKREF); -- case 16: REPORT(JSMSG_REGEXP_TOO_COMPLEX); -- case 17: REPORT(JSMSG_REGEXP_TOO_COMPLEX); -- default: -- JS_NOT_REACHED("Precondition violation: unknown PCRE error code."); -- } --#undef REPORT --} --#endif /* ENABLE_YARR_JIT */ -- - bool - js::ParseRegExpFlags(JSContext *cx, JSString *flagStr, RegExpFlag *flagsOut) - { -diff --git a/js/src/vm/RegExpObject.h b/js/src/vm/RegExpObject.h -index 1449d56..279f3c0 100644 ---- a/js/src/vm/RegExpObject.h -+++ b/js/src/vm/RegExpObject.h -@@ -49,8 +49,6 @@ - #include "yarr/Yarr.h" - #if ENABLE_YARR_JIT - #include "yarr/YarrJIT.h" --#else --#include "yarr/pcre/pcre.h" - #endif - - namespace js { -@@ -153,48 +151,39 @@ ResetRegExpObject(JSContext *cx, AlreadyIncRefed rep); - /* Abstracts away the gross |RegExpPrivate| backend details. */ - class RegExpPrivateCode - { --#if ENABLE_YARR_JIT - typedef JSC::Yarr::BytecodePattern BytecodePattern; - typedef JSC::Yarr::ErrorCode ErrorCode; -+ typedef JSC::Yarr::YarrPattern YarrPattern; -+#if ENABLE_YARR_JIT - typedef JSC::Yarr::JSGlobalData JSGlobalData; - typedef JSC::Yarr::YarrCodeBlock YarrCodeBlock; -- typedef JSC::Yarr::YarrPattern YarrPattern; - - /* Note: Native code is valid only if |codeBlock.isFallBack() == false|. */ - YarrCodeBlock codeBlock; -- BytecodePattern *byteCode; --#else -- JSRegExp *compiled; - #endif -+ BytecodePattern *byteCode; - - public: - RegExpPrivateCode() - : - #if ENABLE_YARR_JIT - codeBlock(), -- byteCode(NULL) --#else -- compiled(NULL) - #endif -+ byteCode(NULL) - { } - - ~RegExpPrivateCode() { - #if ENABLE_YARR_JIT - codeBlock.release(); -+#endif - if (byteCode) - Foreground::delete_(byteCode); --#else -- if (compiled) -- jsRegExpFree(compiled); --#endif - } - - #if ENABLE_YARR_JIT - static inline bool isJITRuntimeEnabled(JSContext *cx); -- void reportYarrError(JSContext *cx, TokenStream *ts, JSC::Yarr::ErrorCode error); --#else -- void reportPCREError(JSContext *cx, int error); - #endif -+ void reportYarrError(JSContext *cx, TokenStream *ts, JSC::Yarr::ErrorCode error); - - inline bool compile(JSContext *cx, JSLinearString &pattern, TokenStream *ts, uintN *parenCount, - RegExpFlag flags); -@@ -205,11 +194,7 @@ class RegExpPrivateCode - int *output, size_t outputCount); - - static size_t getOutputSize(size_t pairCount) { --#if ENABLE_YARR_JIT - return pairCount * 2; --#else -- return pairCount * 3; /* Should be x2, but PCRE has... needs. */ --#endif - } - }; - -diff --git a/js/src/yarr/wtfbridge.h b/js/src/yarr/wtfbridge.h -index ac41d08..fb8eb86 100644 ---- a/js/src/yarr/wtfbridge.h -+++ b/js/src/yarr/wtfbridge.h -@@ -49,9 +49,7 @@ - #include "jsprvtd.h" - #include "vm/String.h" - #include "assembler/wtf/Platform.h" --#if ENABLE_YARR_JIT - #include "assembler/jit/ExecutableAllocator.h" --#endif - - namespace JSC { namespace Yarr { - diff --git a/mozilla.sh.in b/mozilla.sh.in index 11b4761..3b786da 100644 --- a/mozilla.sh.in +++ b/mozilla.sh.in @@ -20,7 +20,7 @@ # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # -# Contributor(s): +# Contributor(s): # Wolfgang Rosenauer # # @@ -38,7 +38,7 @@ # # ***** END LICENSE BLOCK ***** -## +## ## Usage: ## ## $ mozilla [args] @@ -62,7 +62,7 @@ MOZ_PROGRAM="$MOZ_DIST_LIB/$MOZ_APPNAME-bin" MOZ_APP_LAUNCHER="$MOZ_DIST_LIB/$MOZ_APPNAME.sh" if [ "$0" = "$MOZ_APP_LAUNCHER" ]; then [ -h "/usr/bin/$MOZ_APPNAME" ] && \ - _link=$(readlink -f "/usr/bin/$MOZ_APPNAME") + _link=$(readlink -f "/usr/bin/$MOZ_APPNAME") if [ "$_link" = "$MOZ_APP_LAUNCHER" ]; then export MOZ_APP_LAUNCHER="/usr/bin/$MOZ_APPNAME" fi @@ -72,7 +72,7 @@ fi mozilla_lib=`file $MOZ_PROGRAM` LIB=lib -echo $mozilla_lib | grep -q -E 'x86-64|s390x|64-bit.PowerPC' && LIB=lib64 +echo $mozilla_lib | grep -q -E 'ELF.64-bit.*(x86-64|S/390|PowerPC)' && LIB=lib64 BROWSER_PLUGIN_DIR=/usr/$LIB/browser-plugins if [ ! -d $BROWSER_PLUGIN_DIR ]; then @@ -84,9 +84,6 @@ export MOZILLA_FIVE_HOME LD_LIBRARY_PATH=$MOZ_DIST_LIB${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} export LD_LIBRARY_PATH -# ignore composite extension (needed for Flash) -export XLIB_SKIP_ARGB_VISUALS=1 - # needed for SUN Java under Xorg >= 7.2 export LIBXCB_ALLOW_SLOPPY_LOCK=1 @@ -102,6 +99,9 @@ else fi fi +# disable Gnome crash dialog (doesn't make sense anyway) +export GNOME_DISABLE_CRASH_DIALOG=1 + moz_debug=0 script_args="" pass_arg_count=0 diff --git a/tb-no-update-channel.patch b/tb-no-update-channel.patch deleted file mode 100644 index 02f051c..0000000 --- a/tb-no-update-channel.patch +++ /dev/null @@ -1,56 +0,0 @@ -# HG changeset patch -# User Wolfgang Rosenauer -# Parent b4176bad9f5de3ac410a170c287bed24c54ab13e -Don't show the update channel if the updater is disabled - -diff --git a/mail/base/content/aboutDialog.js b/mail/base/content/aboutDialog.js ---- a/mail/base/content/aboutDialog.js -+++ b/mail/base/content/aboutDialog.js -@@ -72,21 +72,21 @@ function init(aEvent) - if (/a\d+(pre)?$/.test(version)) { - let buildID = Services.appinfo.appBuildID; - let buildDate = buildID.slice(0,4) + "-" + buildID.slice(4,6) + "-" + buildID.slice(6,8); - document.getElementById("version").value += " (" + buildDate + ")"; - } - - #ifdef MOZ_UPDATER - gAppUpdater = new appUpdater(); --#endif - - let defaults = Services.prefs.getDefaultBranch(""); - let channelLabel = document.getElementById("currentChannel"); - channelLabel.value = defaults.getCharPref("app.update.channel"); -+#endif - - #ifdef XP_MACOSX - // it may not be sized at this point, and we need its width to calculate its position - window.sizeToContent(); - window.moveTo((screen.availWidth / 2) - (window.outerWidth / 2), screen.availHeight / 5); - #endif - } - -diff --git a/mail/base/content/aboutDialog.xul b/mail/base/content/aboutDialog.xul ---- a/mail/base/content/aboutDialog.xul -+++ b/mail/base/content/aboutDialog.xul -@@ -107,19 +107,21 @@ - - - - - - - #endif - -+#ifdef MOZ_UPDATER - - &channel.description.start; -+#endif - - &community.start2;&community.middle2;&community.end2; - - - &contribute.start;&contribute.end; - - - diff --git a/thunderbird-10.0.2-source.tar.bz2 b/thunderbird-10.0.2-source.tar.bz2 deleted file mode 100644 index 7fb858a..0000000 --- a/thunderbird-10.0.2-source.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a48c1ab194527e4db27c3f3891c1be78ba6acac40306ad51ca02196326726173 -size 97498871 diff --git a/thunderbird-11.0-source.tar.bz2 b/thunderbird-11.0-source.tar.bz2 new file mode 100644 index 0000000..77369e4 --- /dev/null +++ b/thunderbird-11.0-source.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e303dc8860273759f4f5719ce3771e251322e220276a344d598cf1db43678de +size 101418826 diff --git a/MozillaThunderbird-rpmlintrc b/thunderbird-rpmlintrc similarity index 100% rename from MozillaThunderbird-rpmlintrc rename to thunderbird-rpmlintrc diff --git a/MozillaThunderbird.desktop b/thunderbird.desktop similarity index 100% rename from MozillaThunderbird.desktop rename to thunderbird.desktop