ALT Linux Bugzilla
– Attachment 3870 Details for
Bug 21511
Firefox KDE4 integration
New bug
|
Search
|
[?]
|
Help
Register
|
Log In
[x]
|
Forgot Password
Login:
[x]
|
EN
|
RU
[patch]
kde-integration.patch
kde-integration.patch (text/plain), 80.76 KB, created by
Zerg
on 2009-09-11 01:00:25 MSD
(
hide
)
Description:
kde-integration.patch
Filename:
MIME Type:
Creator:
Zerg
Created:
2009-09-11 01:00:25 MSD
Size:
80.76 KB
patch
obsolete
>--- mozilla/browser/app/Makefile.in.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/browser/app/Makefile.in 2009-09-05 00:10:42.000000000 +0200 >@@ -49,6 +49,7 @@ DIRS = profile/extensions > > PREF_JS_EXPORTS = $(srcdir)/profile/firefox.js \ > $(srcdir)/profile/channel-prefs.js \ >+ $(srcdir)/profile/kde.js \ > $(NULL) > > ifndef MOZ_BRANDING_DIRECTORY >--- mozilla/browser/app/profile/kde.js.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/browser/app/profile/kde.js 2009-09-05 00:10:42.000000000 +0200 >@@ -0,0 +1 @@ >+pref("browser.preferences.instantApply", false); >--- mozilla/browser/components/build/nsModule.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/browser/components/build/nsModule.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -46,7 +46,7 @@ > #elif defined(XP_MACOSX) > #include "nsMacShellService.h" > #elif defined(MOZ_WIDGET_GTK2) >-#include "nsGNOMEShellService.h" >+#include "nsUnixShellService.h" > #endif > > #ifndef WINCE >@@ -88,7 +88,8 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindows > #elif defined(XP_MACOSX) > NS_GENERIC_FACTORY_CONSTRUCTOR(nsMacShellService) > #elif defined(MOZ_WIDGET_GTK2) >-NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGNOMEShellService, Init) >+// in nsUnixShellService >+//NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsUnixShellService, Init) > #endif > > #ifndef WINCE >@@ -132,7 +133,7 @@ static const nsModuleComponentInfo compo > { "Browser Shell Service", > NS_SHELLSERVICE_CID, > NS_SHELLSERVICE_CONTRACTID, >- nsGNOMEShellServiceConstructor }, >+ nsUnixShellServiceConstructor }, > > #endif > >--- mozilla/browser/components/shell/src/Makefile.in.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/browser/components/shell/src/Makefile.in 2009-09-05 00:10:42.000000000 +0200 >@@ -75,11 +75,12 @@ ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_ > CPPSRCS = nsMacShellService.cpp > else > ifeq ($(MOZ_WIDGET_TOOLKIT), gtk2) >-CPPSRCS = nsGNOMEShellService.cpp >+CPPSRCS = nsUnixShellService.cpp nsGNOMEShellService.cpp nsKDEShellService.cpp > REQUIRES += \ > mozgnome \ > thebes \ > $(NULL) >+LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre > endif > endif > endif >--- mozilla/browser/components/shell/src/nsKDEShellService.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/browser/components/shell/src/nsKDEShellService.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -0,0 +1,193 @@ >+/* -*- 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 Shell Service. >+ * >+ * The Initial Developer of the Original Code is mozilla.org. >+ * Portions created by the Initial Developer are Copyright (C) 2004 >+ * 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 "nsKDEShellService.h" >+#include "nsShellService.h" >+#include "nsKDEUtils.h" >+#include "nsCOMPtr.h" >+#include "nsIPrefService.h" >+#include "nsIProcess.h" >+#include "nsILocalFile.h" >+#include "nsServiceManagerUtils.h" >+#include "nsComponentManagerUtils.h" >+ >+nsresult >+nsKDEShellService::Init() >+ { >+ if( !nsKDEUtils::kdeSupport()) >+ return NS_ERROR_NOT_AVAILABLE; >+ return NS_OK; >+ } >+ >+NS_IMPL_ISUPPORTS1(nsKDEShellService, nsIShellService) >+ >+NS_IMETHODIMP >+nsKDEShellService::IsDefaultBrowser(PRBool aStartupCheck, >+ PRBool* aIsDefaultBrowser) >+ { >+ *aIsDefaultBrowser = PR_FALSE; >+ if (aStartupCheck) >+ mCheckedThisSession = PR_TRUE; >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "ISDEFAULTBROWSER" )); >+ if( nsKDEUtils::command( command )) >+ *aIsDefaultBrowser = PR_TRUE; >+ return NS_OK; >+ } >+ >+NS_IMETHODIMP >+nsKDEShellService::SetDefaultBrowser(PRBool aClaimAllTypes, >+ PRBool aForAllUsers) >+ { >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "SETDEFAULTBROWSER" )); >+ command.AppendCString( aClaimAllTypes ? NS_LITERAL_CSTRING( "ALLTYPES" ) : NS_LITERAL_CSTRING( "NORMAL" )); >+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; >+ } >+ >+NS_IMETHODIMP >+nsKDEShellService::GetShouldCheckDefaultBrowser(PRBool* aResult) >+{ >+ // If we've already checked, the browser has been started and this is a >+ // new window open, and we don't want to check again. >+ if (mCheckedThisSession) { >+ *aResult = PR_FALSE; >+ return NS_OK; >+ } >+ >+ nsCOMPtr<nsIPrefBranch> prefs; >+ nsCOMPtr<nsIPrefService> pserve(do_GetService(NS_PREFSERVICE_CONTRACTID)); >+ if (pserve) >+ pserve->GetBranch("", getter_AddRefs(prefs)); >+ >+ if (prefs) >+ prefs->GetBoolPref(PREF_CHECKDEFAULTBROWSER, aResult); >+ >+ return NS_OK; >+} >+ >+NS_IMETHODIMP >+nsKDEShellService::SetShouldCheckDefaultBrowser(PRBool aShouldCheck) >+{ >+ nsCOMPtr<nsIPrefBranch> prefs; >+ nsCOMPtr<nsIPrefService> pserve(do_GetService(NS_PREFSERVICE_CONTRACTID)); >+ if (pserve) >+ pserve->GetBranch("", getter_AddRefs(prefs)); >+ >+ if (prefs) >+ prefs->SetBoolPref(PREF_CHECKDEFAULTBROWSER, aShouldCheck); >+ >+ return NS_OK; >+} >+ >+NS_IMETHODIMP >+nsKDEShellService::SetDesktopBackground(nsIDOMElement* aElement, >+ PRInt32 aPosition) >+ { >+ return NS_ERROR_NOT_IMPLEMENTED; >+ } >+ >+NS_IMETHODIMP >+nsKDEShellService::GetDesktopBackgroundColor(PRUint32 *aColor) >+ { >+ return NS_ERROR_NOT_IMPLEMENTED; >+ } >+ >+NS_IMETHODIMP >+nsKDEShellService::SetDesktopBackgroundColor(PRUint32 aColor) >+ { >+ return NS_ERROR_NOT_IMPLEMENTED; >+ } >+ >+NS_IMETHODIMP >+nsKDEShellService::OpenApplication(PRInt32 aApplication) >+ { >+ nsCStringArray command; >+ if( aApplication == APPLICATION_MAIL ) >+ command.AppendCString( NS_LITERAL_CSTRING( "OPENMAIL" )); >+ else if( aApplication == APPLICATION_NEWS ) >+ command.AppendCString( NS_LITERAL_CSTRING( "OPENNEWS" )); >+ else >+ return NS_ERROR_NOT_IMPLEMENTED; >+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; >+ } >+ >+NS_IMETHODIMP >+nsKDEShellService::OpenApplicationWithURI(nsILocalFile* aApplication, const nsACString& aURI) >+ { >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "RUN" )); >+ nsCString app; >+ nsresult rv = aApplication->GetNativePath( app ); >+ NS_ENSURE_SUCCESS( rv, rv ); >+ command.AppendCString( app ); >+ command.AppendCString( aURI ); >+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; >+ } >+ >+NS_IMETHODIMP >+nsKDEShellService::GetDefaultFeedReader(nsILocalFile** _retval) >+ { >+ *_retval = nsnull; >+ >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "GETDEFAULTFEEDREADER" )); >+ nsCStringArray output; >+ if( !nsKDEUtils::command( command, &output ) || output.Count() != 1 ) >+ return NS_ERROR_FAILURE; >+ >+ nsCString path; >+ path = *output[ 0 ]; >+ if (path.IsEmpty()) >+ return NS_ERROR_FAILURE; >+ >+ nsresult rv; >+ nsCOMPtr<nsILocalFile> defaultReader = >+ do_CreateInstance("@mozilla.org/file/local;1", &rv); >+ NS_ENSURE_SUCCESS(rv, rv); >+ >+ rv = defaultReader->InitWithNativePath(path); >+ NS_ENSURE_SUCCESS(rv, rv); >+ >+ PRBool exists; >+ rv = defaultReader->Exists(&exists); >+ NS_ENSURE_SUCCESS(rv, rv); >+ if (!exists) >+ return NS_ERROR_FAILURE; >+ >+ NS_ADDREF(*_retval = defaultReader); >+ return NS_OK; >+ } >--- mozilla/browser/components/shell/src/nsKDEShellService.h.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/browser/components/shell/src/nsKDEShellService.h 2009-09-05 00:10:42.000000000 +0200 >@@ -0,0 +1,59 @@ >+/* -*- 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 Shell Service. >+ * >+ * The Initial Developer of the Original Code is mozilla.org. >+ * Portions created by the Initial Developer are Copyright (C) 2004 >+ * 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 ***** */ >+ >+#ifndef nskdeshellservice_h____ >+#define nskdeshellservice_h____ >+ >+#include "nsIShellService.h" >+#include "nsStringAPI.h" >+ >+class nsKDEShellService : public nsIShellService >+{ >+public: >+ nsKDEShellService() : mCheckedThisSession(PR_FALSE) { } >+ >+ NS_DECL_ISUPPORTS >+ NS_DECL_NSISHELLSERVICE >+ >+ nsresult Init() NS_HIDDEN; >+ >+private: >+ ~nsKDEShellService() {} >+ >+ PRPackedBool mCheckedThisSession; >+}; >+ >+#endif // nskdeshellservice_h____ >--- mozilla/browser/components/shell/src/nsUnixShellService.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/browser/components/shell/src/nsUnixShellService.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -0,0 +1,52 @@ >+/* -*- 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 Shell Service. >+ * >+ * The Initial Developer of the Original Code is mozilla.org. >+ * Portions created by the Initial Developer are Copyright (C) 2004 >+ * 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 "nsUnixShellService.h" >+#include "nsGNOMEShellService.h" >+#include "nsKDEShellService.h" >+#include "nsKDEUtils.h" >+#include "nsIGenericFactory.h" >+ >+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGNOMEShellService, Init) >+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsKDEShellService, Init) >+ >+NS_METHOD >+nsUnixShellServiceConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult) >+{ >+ if( nsKDEUtils::kdeSupport()) >+ return nsKDEShellServiceConstructor( aOuter, aIID, aResult ); >+ return nsGNOMEShellServiceConstructor( aOuter, aIID, aResult ); >+} >--- mozilla/browser/components/shell/src/nsUnixShellService.h.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/browser/components/shell/src/nsUnixShellService.h 2009-09-05 00:10:42.000000000 +0200 >@@ -0,0 +1,45 @@ >+/* -*- 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 Shell Service. >+ * >+ * The Initial Developer of the Original Code is mozilla.org. >+ * Portions created by the Initial Developer are Copyright (C) 2004 >+ * 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 ***** */ >+ >+#ifndef nsunixshellservice_h____ >+#define nsunixshellservice_h____ >+ >+#include "nsIShellService.h" >+ >+NS_METHOD >+nsUnixShellServiceConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult); >+ >+#endif // nsunixshellservice_h____ >--- mozilla/browser/installer/unix/packages-static.sav 2009-08-25 21:23:45.000000000 +0200 >+++ mozilla/browser/installer/unix/packages-static 2009-09-05 00:10:42.000000000 +0200 >@@ -291,6 +291,7 @@ bin/icons/*.png > bin/@PREF_DIR@/firefox.js > bin/@PREF_DIR@/firefox-branding.js > bin/@PREF_DIR@/channel-prefs.js >+bin/@PREF_DIR@/kde.js > bin/greprefs/all.js > bin/greprefs/security-prefs.js > bin/greprefs/xpinstall.js > >--- mozilla/chrome/src/Makefile.in.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/chrome/src/Makefile.in 2009-09-05 00:10:42.000000000 +0200 >@@ -86,6 +86,7 @@ EXTRA_DSO_LDOPTS = \ > > ifneq (,$(filter gtk2,$(MOZ_WIDGET_TOOLKIT))) > EXTRA_DSO_LDOPTS += $(MOZ_GTK2_LIBS) >+LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre > endif > > ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT))) >--- mozilla/chrome/src/nsChromeRegistry.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/chrome/src/nsChromeRegistry.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -114,6 +114,7 @@ > #include "nsIXULAppInfo.h" > #include "nsIXULRuntime.h" > #include "nsPresShellIterator.h" >+#include "nsKDEUtils.h" > > #ifdef MOZ_XUL > // keep all the RDF stuff together, in case we can remove it in the far future >@@ -2208,6 +2209,7 @@ nsChromeRegistry::ProcessManifestBuffer( > NS_NAMED_LITERAL_STRING(kAppVersion, "appversion"); > NS_NAMED_LITERAL_STRING(kOs, "os"); > NS_NAMED_LITERAL_STRING(kOsVersion, "osversion"); >+ NS_NAMED_LITERAL_STRING(kDesktop, "desktop"); > > nsCOMPtr<nsIIOService> io (do_GetIOService()); > if (!io) return NS_ERROR_FAILURE; >@@ -2251,6 +2253,7 @@ nsChromeRegistry::ProcessManifestBuffer( > } > > nsAutoString osVersion; >+ nsAutoString desktop; > #if defined(XP_WIN) > OSVERSIONINFO info = { sizeof(OSVERSIONINFO) }; > if (GetVersionEx(&info)) { >@@ -2258,6 +2261,7 @@ nsChromeRegistry::ProcessManifestBuffer( > info.dwMajorVersion, > info.dwMinorVersion); > } >+ desktop = NS_LITERAL_STRING("win"); > #elif defined(XP_MACOSX) > long majorVersion, minorVersion; > if ((Gestalt(gestaltSystemVersionMajor, &majorVersion) == noErr) && >@@ -2266,10 +2270,12 @@ nsChromeRegistry::ProcessManifestBuffer( > 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"); // TODO others? > #endif > > char *token; >@@ -2313,6 +2319,7 @@ nsChromeRegistry::ProcessManifestBuffer( > TriState stApp = eUnspecified; > TriState stOsVersion = eUnspecified; > TriState stOs = eUnspecified; >+ TriState stDesktop = eUnspecified; > > PRBool badFlag = PR_FALSE; > >@@ -2326,6 +2333,7 @@ nsChromeRegistry::ProcessManifestBuffer( > CheckFlag(kContentAccessible, wtoken, contentAccessible) || > CheckStringFlag(kApplication, wtoken, appID, stApp) || > CheckStringFlag(kOs, wtoken, osTarget, stOs) || >+ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || > CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || > CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) > continue; >@@ -2337,7 +2345,7 @@ nsChromeRegistry::ProcessManifestBuffer( > } > > if (badFlag || stApp == eBad || stAppVersion == eBad || >- stOs == eBad || stOsVersion == eBad) >+ stOs == eBad || stOsVersion == eBad || stDesktop == eBad) > continue; > > nsCOMPtr<nsIURI> resolved; >@@ -2398,6 +2406,7 @@ nsChromeRegistry::ProcessManifestBuffer( > TriState stApp = eUnspecified; > TriState stOs = eUnspecified; > TriState stOsVersion = eUnspecified; >+ TriState stDesktop = eUnspecified; > > PRBool badFlag = PR_FALSE; > >@@ -2408,6 +2417,7 @@ nsChromeRegistry::ProcessManifestBuffer( > > if (CheckStringFlag(kApplication, wtoken, appID, stApp) || > CheckStringFlag(kOs, wtoken, osTarget, stOs) || >+ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || > CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || > CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) > continue; >@@ -2419,7 +2429,7 @@ nsChromeRegistry::ProcessManifestBuffer( > } > > if (badFlag || stApp == eBad || stAppVersion == eBad || >- stOs == eBad || stOsVersion == eBad) >+ stOs == eBad || stOsVersion == eBad || stDesktop == eBad) > continue; > > nsCOMPtr<nsIURI> resolved; >@@ -2460,6 +2470,7 @@ nsChromeRegistry::ProcessManifestBuffer( > TriState stApp = eUnspecified; > TriState stOs = eUnspecified; > TriState stOsVersion = eUnspecified; >+ TriState stDesktop = eUnspecified; > > PRBool badFlag = PR_FALSE; > >@@ -2470,6 +2481,7 @@ nsChromeRegistry::ProcessManifestBuffer( > > if (CheckStringFlag(kApplication, wtoken, appID, stApp) || > CheckStringFlag(kOs, wtoken, osTarget, stOs) || >+ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || > CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || > CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) > continue; >@@ -2481,7 +2493,7 @@ nsChromeRegistry::ProcessManifestBuffer( > } > > if (badFlag || stApp == eBad || stAppVersion == eBad || >- stOs == eBad || stOsVersion == eBad) >+ stOs == eBad || stOsVersion == eBad || stDesktop == eBad) > continue; > > nsCOMPtr<nsIURI> resolved; >@@ -2524,6 +2536,7 @@ nsChromeRegistry::ProcessManifestBuffer( > TriState stApp = eUnspecified; > TriState stOs = eUnspecified; > TriState stOsVersion = eUnspecified; >+ TriState stDesktop = eUnspecified; > > PRBool badFlag = PR_FALSE; > >@@ -2534,6 +2547,7 @@ nsChromeRegistry::ProcessManifestBuffer( > > if (CheckStringFlag(kApplication, wtoken, appID, stApp) || > CheckStringFlag(kOs, wtoken, osTarget, stOs) || >+ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || > CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || > CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) > continue; >@@ -2545,7 +2559,7 @@ nsChromeRegistry::ProcessManifestBuffer( > } > > if (badFlag || stApp == eBad || stAppVersion == eBad || >- stOs == eBad || stOsVersion == eBad) >+ stOs == eBad || stOsVersion == eBad || stDesktop == eBad) > continue; > > nsCOMPtr<nsIURI> baseuri, overlayuri; >@@ -2580,6 +2594,7 @@ nsChromeRegistry::ProcessManifestBuffer( > TriState stApp = eUnspecified; > TriState stOs = eUnspecified; > TriState stOsVersion = eUnspecified; >+ TriState stDesktop = eUnspecified; > > PRBool badFlag = PR_FALSE; > >@@ -2590,6 +2605,7 @@ nsChromeRegistry::ProcessManifestBuffer( > > if (CheckStringFlag(kApplication, wtoken, appID, stApp) || > CheckStringFlag(kOs, wtoken, osTarget, stOs) || >+ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || > CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || > CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) > continue; >@@ -2601,7 +2617,7 @@ nsChromeRegistry::ProcessManifestBuffer( > } > > if (badFlag || stApp == eBad || stAppVersion == eBad || >- stOs == eBad || stOsVersion == eBad) >+ stOs == eBad || stOsVersion == eBad || stDesktop == eBad) > continue; > > nsCOMPtr<nsIURI> baseuri, overlayuri; >@@ -2640,6 +2656,7 @@ nsChromeRegistry::ProcessManifestBuffer( > TriState stApp = eUnspecified; > TriState stOs = eUnspecified; > TriState stOsVersion = eUnspecified; >+ TriState stDesktop = eUnspecified; > > PRBool badFlag = PR_FALSE; > >@@ -2650,6 +2667,7 @@ nsChromeRegistry::ProcessManifestBuffer( > > if (CheckStringFlag(kApplication, wtoken, appID, stApp) || > CheckStringFlag(kOs, wtoken, osTarget, stOs) || >+ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || > CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || > CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) > continue; >@@ -2661,7 +2679,7 @@ nsChromeRegistry::ProcessManifestBuffer( > } > > if (badFlag || stApp == eBad || stAppVersion == eBad || >- stOs == eBad || stOsVersion == eBad) >+ stOs == eBad || stOsVersion == eBad || stDesktop == eBad) > continue; > > nsCOMPtr<nsIURI> chromeuri, resolveduri; >@@ -2702,6 +2720,7 @@ nsChromeRegistry::ProcessManifestBuffer( > TriState stApp = eUnspecified; > TriState stOsVersion = eUnspecified; > TriState stOs = eUnspecified; >+ TriState stDesktop = eUnspecified; > > PRBool badFlag = PR_FALSE; > >@@ -2712,6 +2731,7 @@ nsChromeRegistry::ProcessManifestBuffer( > > if (CheckStringFlag(kApplication, wtoken, appID, stApp) || > CheckStringFlag(kOs, wtoken, osTarget, stOs) || >+ CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || > CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || > CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) > continue; >@@ -2723,7 +2743,7 @@ nsChromeRegistry::ProcessManifestBuffer( > } > > if (badFlag || stApp == eBad || stAppVersion == eBad || >- stOs == eBad || stOsVersion == eBad) >+ stOs == eBad || stOsVersion == eBad || stDesktop == eBad) > continue; > > nsDependentCString host(package); >--- mozilla/modules/libpref/src/Makefile.in.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/modules/libpref/src/Makefile.in 2009-09-05 00:10:42.000000000 +0200 >@@ -97,3 +97,5 @@ nsPrefService.$(OBJ_SUFFIX): nsPrefServi > @$(MAKE_DEPS_AUTO_CXX) > $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:-O2=-O1) $(_VPATH_SRCS) > endif >+ >+LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre >--- mozilla/modules/libpref/src/nsPrefService.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/modules/libpref/src/nsPrefService.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -51,6 +51,7 @@ > #include "nsCOMArray.h" > #include "nsXPCOMCID.h" > #include "nsAutoPtr.h" >+#include "nsKDEUtils.h" > > #include "nsQuickSort.h" > #include "prmem.h" >@@ -606,7 +607,8 @@ pref_LoadPrefsInDir(nsIFile* aDir, char > return rv; > } > >-static nsresult pref_LoadPrefsInDirList(const char *listId) >+static nsresult pref_LoadPrefsInDirList(const char *listId, >+ char const *const *aSpecialFiles = NULL, PRUint32 aSpecialFilesCount = 0) > { > nsresult rv; > nsCOMPtr<nsIProperties> dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv)); >@@ -625,7 +627,7 @@ static nsresult pref_LoadPrefsInDirList( > nsCOMPtr<nsIFile> 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, aSpecialFiles, aSpecialFilesCount); > } > } > } >@@ -676,6 +678,7 @@ static nsresult pref_InitInitialObjects( > #if defined(MOZ_WIDGET_PHOTON) > , "photon.js" > #endif >+ , "" // placeholder for KDE (empty is otherwise harmless) > #elif defined(XP_OS2) > "os2pref.js" > #elif defined(XP_BEOS) >@@ -683,12 +686,23 @@ static nsresult pref_InitInitialObjects( > #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, NS_ARRAY_LENGTH(specialFiles)); > if (NS_FAILED(rv)) { > NS_WARNING("Error parsing application default preferences."); > } > >- rv = pref_LoadPrefsInDirList(NS_APP_PREFS_DEFAULTS_DIR_LIST); >+ rv = pref_LoadPrefsInDirList(NS_APP_PREFS_DEFAULTS_DIR_LIST, specialFiles, NS_ARRAY_LENGTH(specialFiles)); > NS_ENSURE_SUCCESS(rv, rv); > > NS_CreateServicesFromCategory(NS_PREFSERVICE_APPDEFAULTS_TOPIC_ID, >--- mozilla/toolkit/content/jar.mn.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/toolkit/content/jar.mn 2009-09-05 00:10:42.000000000 +0200 >@@ -43,6 +43,8 @@ toolkit.jar: > *+ 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) >@@ -56,6 +58,8 @@ toolkit.jar: > *+ 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) >--- mozilla/toolkit/content/widgets/dialog-kde.xml.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/toolkit/content/widgets/dialog-kde.xml 2009-09-05 00:10:42.000000000 +0200 >@@ -19,7 +19,7 @@ > > <xul:hbox class="dialog-button-box" anonid="buttons" > xbl:inherits="pack=buttonpack,align=buttonalign,dir=buttondir,orient=buttonorient" >-#ifdef XP_UNIX >+#ifdef XP_UNIX_GNOME > > > <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> > <xul:button dlgtype="help" class="dialog-button" hidden="true"/> >@@ -28,6 +28,15 @@ > <xul:spacer anonid="spacer" flex="1"/> > <xul:button dlgtype="cancel" class="dialog-button"/> > <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> >+#elif XP_UNIX >+ pack="end"> >+ <xul:button dlgtype="help" class="dialog-button" hidden="true"/> >+ <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> >+ <xul:spacer anonid="spacer" flex="1" hidden="true"/> >+ <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> >+ <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> >+ <xul:button dlgtype="cancel" class="dialog-button"/> >+ <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> > #else > pack="end"> > <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> >--- mozilla/toolkit/content/widgets/preferences-kde.xml.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/toolkit/content/widgets/preferences-kde.xml 2009-09-05 00:10:42.000000000 +0200 >@@ -573,7 +573,7 @@ > </xul:deck> > </xul:hbox> > <xul:hbox anonid="dlg-buttons" class="prefWindow-dlgbuttons" >-#ifdef XP_UNIX >+#ifdef XP_UNIX_GNOME > > > <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> > <xul:button dlgtype="help" class="dialog-button" hidden="true" icon="help"/> >@@ -582,6 +582,15 @@ > <xul:spacer anonid="spacer" flex="1"/> > <xul:button dlgtype="cancel" class="dialog-button" icon="cancel"/> > <xul:button dlgtype="accept" class="dialog-button" icon="accept"/> >+#elif XP_UNIX >+ pack="end"> >+ <xul:button dlgtype="help" class="dialog-button" hidden="true" icon="help"/> >+ <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> >+ <xul:spacer anonid="spacer" flex="1"/> >+ <xul:button dlgtype="accept" class="dialog-button" icon="accept"/> >+ <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> >+ <xul:button dlgtype="cancel" class="dialog-button" icon="cancel"/> >+ <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> > #else > pack="end"> > <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> >--- mozilla/toolkit/system/unixproxy/Makefile.in.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/toolkit/system/unixproxy/Makefile.in 2009-09-05 00:10:42.000000000 +0200 >@@ -64,4 +64,6 @@ CPPSRCS = \ > nsUnixSystemProxySettings.cpp \ > $(NULL) > >+LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre >+ > include $(topsrcdir)/config/rules.mk >--- mozilla/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -49,6 +49,8 @@ > #include "nsPrintfCString.h" > #include "nsNetUtil.h" > #include "nsISupportsPrimitives.h" >+#include "nsVoidArray.h" >+#include "nsKDEUtils.h" > > class nsUnixSystemProxySettings : public nsISystemProxySettings { > public: >@@ -65,6 +67,7 @@ private: > PRBool 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 GetProxyFromKDE(const nsACString& aScheme, const nsACString& aHost, PRInt32 aPort, nsACString& aResult); > }; > > NS_IMPL_ISUPPORTS1(nsUnixSystemProxySettings, nsISystemProxySettings) >@@ -412,6 +415,9 @@ nsUnixSystemProxySettings::GetProxyForUR > rv = aURI->GetPort(&port); > NS_ENSURE_SUCCESS(rv, rv); > >+ if( nsKDEUtils::kdeSupport()) >+ return GetProxyFromKDE( scheme, host, port, aResult ); >+ > if (!mGConf) > return GetProxyFromEnvironment(scheme, host, port, aResult); > >@@ -432,3 +438,28 @@ static const nsModuleComponentInfo compo > }; > > NS_IMPL_NSGETMODULE(nsUnixProxyModule, components) >+ >+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); >+ } >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "GETPROXY" )); >+ command.AppendCString( url ); >+ nsCStringArray result; >+ if( !nsKDEUtils::command( command, &result ) || result.Count() != 1 ) >+ return NS_ERROR_FAILURE; >+ aResult = *result[ 0 ]; >+ return NS_OK; >+} >--- mozilla/toolkit/xre/Makefile.in.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/toolkit/xre/Makefile.in 2009-09-05 00:10:42.000000000 +0200 >@@ -133,7 +133,7 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),beos) > CPPSRCS += nsNativeAppSupportBeOS.cpp > else > ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) >-CPPSRCS += nsNativeAppSupportUnix.cpp >+CPPSRCS += nsNativeAppSupportUnix.cpp nsKDEUtils.cpp > else > CPPSRCS += nsNativeAppSupportDefault.cpp > endif >--- mozilla/toolkit/xre/nsKDEUtils.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/toolkit/xre/nsKDEUtils.cpp 2009-09-05 10:05:00.000000000 +0200 >@@ -0,0 +1,329 @@ >+/* -*- 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 <gtk/gtkwindow.h> >+#include <gtk/gtkmain.h> >+ >+#include <limits.h> >+#include <stdio.h> >+#include <sys/wait.h> >+#include <unistd.h> >+#include <X11/Xlib.h> >+ >+//#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 4 >+#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() >+ { >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "CHECK" )); >+ command.AppendCString( 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; >+ nsCStringArray* 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->AppendCString( 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 nsCStringArray& command, nsCStringArray* output ) >+ { >+ return self()->internalCommand( command, NULL, false, output ); >+ } >+ >+bool nsKDEUtils::commandBlockUi( const nsCStringArray& command, const GtkWindow* parent, nsCStringArray* output ) >+ { >+ return self()->internalCommand( command, parent, true, output ); >+ } >+ >+bool nsKDEUtils::internalCommand( const nsCStringArray& command, const GtkWindow* parent, bool blockUi, >+ nsCStringArray* 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 nsCStringArray& command ) >+ { >+ for( int i = 0; >+ i < command.Count(); >+ ++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 ); >+ } >--- mozilla/toolkit/xre/nsKDEUtils.h.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/toolkit/xre/nsKDEUtils.h 2009-09-05 00:10:42.000000000 +0200 >@@ -0,0 +1,77 @@ >+/* -*- 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 "nsVoidArray.h" >+#include <stdio.h> >+ >+typedef struct _GtkWindow GtkWindow; >+ >+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 nsCStringArray& command, nsCStringArray* 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 nsCStringArray& command, const GtkWindow* parent, nsCStringArray* output = NULL ); >+ private: >+ nsKDEUtils(); >+ ~nsKDEUtils(); >+ static nsKDEUtils* self(); >+ bool startHelper(); >+ void closeHelper(); >+ void feedCommand( const nsCStringArray& command ); >+ bool internalCommand( const nsCStringArray& command, const GtkWindow* parent, bool isParent, >+ nsCStringArray* output ); >+ FILE* commandFile; >+ FILE* replyFile; >+ }; >+ >+#endif // nsKDEUtils >--- mozilla/uriloader/exthandler/Makefile.in.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/uriloader/exthandler/Makefile.in 2009-09-05 00:10:42.000000000 +0200 >@@ -109,8 +109,9 @@ endif > LOCAL_INCLUDES = -I$(srcdir) > > 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),qt) >--- mozilla/uriloader/exthandler/unix/nsCommonRegistry.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/uriloader/exthandler/unix/nsCommonRegistry.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -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 <bryner@brianryner.com> (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<nsMIMEInfoBase> >+nsCommonRegistry::GetFromExtension(const nsACString& aFileExt) >+{ >+ if( nsKDEUtils::kdeSupport()) >+ return nsKDERegistry::GetFromExtension( aFileExt ); >+ return nsGNOMERegistry::GetFromExtension( aFileExt ); >+} >+ >+/* static */ already_AddRefed<nsMIMEInfoBase> >+nsCommonRegistry::GetFromType(const nsACString& aMIMEType) >+{ >+ if( nsKDEUtils::kdeSupport()) >+ return nsKDERegistry::GetFromType( aMIMEType ); >+ return nsGNOMERegistry::GetFromType( aMIMEType ); >+} >--- mozilla/uriloader/exthandler/unix/nsCommonRegistry.h.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/uriloader/exthandler/unix/nsCommonRegistry.h 2009-09-05 00:10:42.000000000 +0200 >@@ -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 <bryner@brianryner.com> (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<nsMIMEInfoBase> GetFromExtension(const nsACString& aFileExt); >+ >+ static already_AddRefed<nsMIMEInfoBase> GetFromType(const nsACString& aMIMEType); >+}; >--- mozilla/uriloader/exthandler/unix/nsKDERegistry.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/uriloader/exthandler/unix/nsKDERegistry.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -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 <bryner@brianryner.com> (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) >+{ >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "HANDLEREXISTS" )); >+ command.AppendCString( nsCAutoString( aProtocolScheme )); >+ return nsKDEUtils::command( command ); >+} >+ >+/* static */ nsresult >+nsKDERegistry::LoadURL(nsIURI *aURL) >+{ >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "OPEN" )); >+ nsCString url; >+ aURL->GetSpec( url ); >+ command.AppendCString( url ); >+ return nsKDEUtils::command( command ); >+} >+ >+/* static */ void >+nsKDERegistry::GetAppDescForScheme(const nsACString& aScheme, >+ nsAString& aDesc) >+{ >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "GETAPPDESCFORSCHEME" )); >+ command.AppendCString( aScheme ); >+ nsCStringArray output; >+ if( nsKDEUtils::command( command, &output ) && output.Count() == 1 ) >+ CopyUTF8toUTF16( *output[ 0 ], aDesc ); >+} >+ >+ >+/* static */ already_AddRefed<nsMIMEInfoBase> >+nsKDERegistry::GetFromExtension(const nsACString& aFileExt) >+{ >+ NS_ASSERTION(aFileExt[0] != '.', "aFileExt shouldn't start with a dot"); >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "GETFROMEXTENSION" )); >+ command.AppendCString( aFileExt ); >+ return GetFromHelper( command ); >+} >+ >+/* static */ already_AddRefed<nsMIMEInfoBase> >+nsKDERegistry::GetFromType(const nsACString& aMIMEType) >+{ >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "GETFROMTYPE" )); >+ command.AppendCString( aMIMEType ); >+ return GetFromHelper( command ); >+} >+ >+/* static */ already_AddRefed<nsMIMEInfoBase> >+nsKDERegistry::GetFromHelper(const nsCStringArray& command) >+{ >+ nsCStringArray output; >+ if( nsKDEUtils::command( command, &output ) && output.Count() == 3 ) >+ { >+ nsCString mimetype = *output[ 0 ]; >+ nsRefPtr<nsMIMEInfoUnix> 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; >+} >--- mozilla/uriloader/exthandler/unix/nsKDERegistry.h.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/uriloader/exthandler/unix/nsKDERegistry.h 2009-09-05 00:10:42.000000000 +0200 >@@ -0,0 +1,61 @@ >+/* ***** 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 <bryner@brianryner.com> (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 nsCAutoString; >+class nsCStringArray; >+ >+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<nsMIMEInfoBase> GetFromExtension(const nsACString& aFileExt); >+ >+ static already_AddRefed<nsMIMEInfoBase> GetFromType(const nsACString& aMIMEType); >+ private: >+ static already_AddRefed<nsMIMEInfoBase> GetFromHelper(const nsCStringArray& command); >+ >+}; >--- mozilla/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -44,18 +44,19 @@ > > > #include "nsMIMEInfoUnix.h" >-#include "nsGNOMERegistry.h" >+#include "nsCommonRegistry.h" > #include "nsIGnomeVFSService.h" > #ifdef MOZ_ENABLE_DBUS > #include "nsDBusHandlerApp.h" > #endif > #include "nsAutoPtr.h" >+#include "nsKDEUtils.h" > > > nsresult > nsMIMEInfoUnix::LoadUriInternal(nsIURI * aURI) > { >- nsresult rv = nsGNOMERegistry::LoadURL(aURI); >+ nsresult rv = nsCommonRegistry::LoadURL(aURI); > #ifdef MOZ_PLATFORM_HILDON > if (NS_FAILED(rv)){ > HildonURIAction *action = hildon_uri_get_default_action(mType.get(), nsnull); >@@ -75,11 +76,11 @@ NS_IMETHODIMP > nsMIMEInfoUnix::GetHasDefaultHandler(PRBool *_retval) > { > *_retval = PR_FALSE; >- nsRefPtr<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromType(mType); >+ nsRefPtr<nsMIMEInfoBase> mimeInfo = nsCommonRegistry::GetFromType(mType); > if (!mimeInfo) { > nsCAutoString ext; > GetPrimaryExtension(ext); >- mimeInfo = nsGNOMERegistry::GetFromExtension(ext); >+ mimeInfo = nsCommonRegistry::GetFromExtension(ext); > } > > if (mimeInfo) >@@ -106,6 +107,19 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns > { > nsCAutoString nativePath; > aFile->GetNativePath(nativePath); >+ >+ if( nsKDEUtils::kdeSupport()) >+ { >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "OPEN" )); >+ command.AppendCString( nativePath ); >+ if( nsKDEUtils::command( command )) >+ return NS_OK; >+ if (!mDefaultApplication) >+ return NS_ERROR_FILE_NOT_FOUND; >+ >+ return LaunchWithIProcess(mDefaultApplication, nativePath); >+ } > > nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); > >@@ -116,7 +130,7 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns > > // If we haven't got an app we try to get a valid one by searching for the > // extension mapped type >- nsRefPtr<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromExtension(nativePath); >+ nsRefPtr<nsMIMEInfoBase> mimeInfo = nsCommonRegistry::GetFromExtension(nativePath); > if (mimeInfo) { > nsCAutoString type; > mimeInfo->GetType(type); >--- mozilla/uriloader/exthandler/unix/nsOSHelperAppService.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/uriloader/exthandler/unix/nsOSHelperAppService.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -44,7 +44,7 @@ > #include "nsOSHelperAppService.h" > #include "nsMIMEInfoUnix.h" > #ifdef MOZ_WIDGET_GTK2 >-#include "nsGNOMERegistry.h" >+#include "nsCommonRegistry.h" > #endif > #include "nsISupports.h" > #include "nsString.h" >@@ -1210,7 +1210,7 @@ nsresult nsOSHelperAppService::OSProtoco > > #ifdef MOZ_WIDGET_GTK2 > // Check the GConf registry for a protocol handler >- *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme); >+ *aHandlerExists = nsCommonRegistry::HandlerExists(aProtocolScheme); > #endif > > return NS_OK; >@@ -1219,7 +1219,7 @@ nsresult nsOSHelperAppService::OSProtoco > 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; >@@ -1315,7 +1315,7 @@ nsOSHelperAppService::GetFromExtension(c > > #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; >@@ -1441,7 +1441,7 @@ nsOSHelperAppService::GetFromType(const > // 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; >--- mozilla/widget/src/gtk2/Makefile.in.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/widget/src/gtk2/Makefile.in 2009-09-05 00:10:42.000000000 +0200 >@@ -182,6 +182,8 @@ INCLUDES += \ > -I$(topsrcdir)/other-licenses/atk-1.0 \ > $(NULL) > >+LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre >+ > test_container: mozdrawingarea.o mozcontainer.o test_container.c > $(CC) $(MOZ_GTK2_CFLAGS) -o test_container test_container.c \ > mozdrawingarea.o mozcontainer.o \ >--- mozilla/widget/src/gtk2/nsFilePicker.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/widget/src/gtk2/nsFilePicker.cpp 2009-09-05 10:09:26.000000000 +0200 >@@ -40,6 +40,7 @@ > #include <gtk/gtkstock.h> > #include <gtk/gtkmessagedialog.h> > #include <gtk/gtkimage.h> >+#include <gdk/gdkx.h> > > #include "nsIFileURL.h" > #include "nsIURI.h" >@@ -59,6 +60,7 @@ > > #include "nsFilePicker.h" > #include "nsAccessibilityHelper.h" >+#include "nsKDEUtils.h" > > #define DECL_FUNC_PTR(func) static _##func##_fn _##func > #define GTK_FILE_CHOOSER(widget) ((GtkFileChooser*) widget) >@@ -95,6 +97,7 @@ typedef GtkWidget* (*_gtk_file_chooser_d > GtkFileChooserAction action, > const gchar *first_button_text, > ...); >+typedef void (*_gtk_dialog_set_alternative_button_order_fn)(GtkDialog *dialog, gint first_response_id, ...); > typedef void (*_gtk_file_chooser_set_select_multiple_fn)(GtkFileChooser* chooser, gboolean truth); > typedef void (*_gtk_file_chooser_set_do_overwrite_confirmation_fn)(GtkFileChooser* chooser, gboolean do_confirm); > typedef void (*_gtk_file_chooser_set_current_name_fn)(GtkFileChooser* chooser, const gchar* name); >@@ -119,6 +122,7 @@ DECL_FUNC_PTR(gtk_file_chooser_get_filen > DECL_FUNC_PTR(gtk_file_chooser_get_uri); > DECL_FUNC_PTR(gtk_file_chooser_get_uris); > DECL_FUNC_PTR(gtk_file_chooser_dialog_new); >+DECL_FUNC_PTR(gtk_dialog_set_alternative_button_order); > DECL_FUNC_PTR(gtk_file_chooser_set_select_multiple); > DECL_FUNC_PTR(gtk_file_chooser_set_do_overwrite_confirmation); > DECL_FUNC_PTR(gtk_file_chooser_set_current_name); >@@ -214,6 +218,7 @@ nsFilePicker::LoadSymbolsGTK24() > GET_LIBGTK_FUNC(gtk_file_chooser_get_uri); > GET_LIBGTK_FUNC(gtk_file_chooser_get_uris); > GET_LIBGTK_FUNC(gtk_file_chooser_dialog_new); >+ GET_LIBGTK_FUNC(gtk_dialog_set_alternative_button_order); > GET_LIBGTK_FUNC(gtk_file_chooser_set_select_multiple); > GET_LIBGTK_FUNC_OPT(gtk_file_chooser_set_do_overwrite_confirmation); > GET_LIBGTK_FUNC(gtk_file_chooser_set_current_name); >@@ -442,7 +447,8 @@ nsFilePicker::AppendFilter(const nsAStri > { > if (aFilter.EqualsLiteral("..apps")) { > // No platform specific thing we can do here, really.... >- return NS_OK; >+ if( mMode != modeOpen || !nsKDEUtils::kdeSupport()) >+ return NS_OK; > } > > nsCAutoString filter, name; >@@ -590,6 +596,9 @@ confirm_overwrite_file (GtkWidget *paren > NS_IMETHODIMP > nsFilePicker::Show(PRInt16 *aReturn) > { >+ if( nsKDEUtils::kdeSupport()) >+ return kdeFileDialog( aReturn ); >+ > NS_ENSURE_ARG_POINTER(aReturn); > > nsXPIDLCString title; >@@ -605,6 +614,12 @@ nsFilePicker::Show(PRInt16 *aReturn) > GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, > accept_button, GTK_RESPONSE_ACCEPT, > NULL); >+ >+ _gtk_dialog_set_alternative_button_order(GTK_DIALOG(file_chooser), >+ GTK_RESPONSE_ACCEPT, >+ GTK_RESPONSE_CANCEL, >+ -1); >+ > if (mAllowURLs) { > _gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(file_chooser), FALSE); > } >@@ -727,3 +742,221 @@ nsFilePicker::Show(PRInt16 *aReturn) > > 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.Count() == 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.Count(); >+ if( count == 0 ) //just in case >+ filters = "*"; >+ else >+ { >+ filters = kdeMakeFilter( 0 ); >+ for (PRInt32 i = 1; i < count; ++i) >+ { >+ filters += "\n"; >+ filters += kdeMakeFilter( i ); >+ } >+ } >+ >+ nsCStringArray command; >+ command.AppendCString( nsCAutoString( arg )); >+ command.AppendCString( startdir ); >+ if( mMode != nsIFilePicker::modeGetFolder ) >+ { >+ command.AppendCString( filters ); >+ nsCAutoString selected; >+ selected.AppendInt( mSelectedType ); >+ command.AppendCString( selected ); >+ } >+ command.AppendCString( title ); >+ if( mMode == nsIFilePicker::modeOpenMultiple ) >+ command.AppendCString( NS_LITERAL_CSTRING( "MULTIPLE" )); >+ if( PRInt32 xid = windowToXid( mParentWidget )) >+ { >+ command.AppendCString( NS_LITERAL_CSTRING( "PARENT" )); >+ nsCAutoString parent; >+ parent.AppendInt( xid ); >+ command.AppendCString( parent ); >+ } >+ >+ nsCStringArray 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.RemoveCStringAt( 0 ); >+ } >+ if (mMode == nsIFilePicker::modeOpenMultiple) >+ { >+ mFileURL.Truncate(); >+ PRUint32 count = output.Count(); >+ for( PRUint32 i = 0; >+ i < count; >+ ++i ) >+ { >+ nsCOMPtr<nsILocalFile> localfile; >+ nsresult rv = NS_NewNativeLocalFile( *output[ i ], >+ PR_FALSE, >+ getter_AddRefs(localfile)); >+ if (NS_SUCCEEDED(rv)) >+ mFiles.AppendObject(localfile); >+ } >+ } >+ else >+ { >+ mFileURL = output.Count() > 0 ? *output[ 0 ] : nsCString(); >+ } >+ // Remember last used directory. >+ nsCOMPtr<nsILocalFile> file; >+ GetFile(getter_AddRefs(file)); >+ if (file) { >+ nsCOMPtr<nsIFile> dir; >+ file->GetParent(getter_AddRefs(dir)); >+ nsCOMPtr<nsILocalFile> localDir(do_QueryInterface(dir)); >+ if (localDir) { >+ localDir.swap(mPrevDisplayDirectory); >+ } >+ } >+ if (mMode == nsIFilePicker::modeSave) >+ { >+ nsCOMPtr<nsILocalFile> file; >+ GetFile(getter_AddRefs(file)); >+ if (file) >+ { >+ PRBool exists = PR_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)); >+ >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "APPSDIALOG" )); >+ command.AppendCString( title ); >+ if( PRInt32 xid = windowToXid( mParentWidget )) >+ { >+ command.AppendCString( NS_LITERAL_CSTRING( "PARENT" )); >+ nsCAutoString parent; >+ parent.AppendInt( xid ); >+ command.AppendCString( parent ); >+ } >+ >+ nsCStringArray output; >+ if( nsKDEUtils::commandBlockUi( command, get_gtk_window_for_nsiwidget( mParentWidget ), &output )) >+ { >+ *aReturn = nsIFilePicker::returnOK; >+ mFileURL = output.Count() > 0 ? *output[ 0 ] : nsCString(); >+ } >+ else >+ { >+ *aReturn = nsIFilePicker::returnCancel; >+ } >+ return NS_OK; >+ } >--- mozilla/widget/src/gtk2/nsFilePicker.h.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/widget/src/gtk2/nsFilePicker.h 2009-09-05 00:10:42.000000000 +0200 >@@ -98,6 +98,12 @@ protected: > private: > static nsILocalFile *mPrevDisplayDirectory; > static PRLibrary *mGTK24; >+ >+ bool kdeRunning(); >+ bool getKdeRunning(); >+ NS_IMETHODIMP kdeFileDialog(PRInt16 *aReturn); >+ NS_IMETHODIMP kdeAppsDialog(PRInt16 *aReturn); >+ nsCString kdeMakeFilter( int index ); > }; > > #endif >--- mozilla/widget/src/gtk2/nsPrintDialogGTK.cpp.sav 2009-09-05 00:10:36.000000000 +0200 >+++ mozilla/widget/src/gtk2/nsPrintDialogGTK.cpp 2009-09-05 00:10:42.000000000 +0200 >@@ -145,6 +145,10 @@ ShowCustomDialog(GtkComboBox *changed_bo > GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, > NULL); > gtk_dialog_set_default_response(GTK_DIALOG(prompt_dialog), GTK_RESPONSE_ACCEPT); >+ gtk_dialog_set_alternative_button_order(GTK_DIALOG(prompt_dialog), >+ GTK_RESPONSE_ACCEPT, >+ GTK_RESPONSE_REJECT, >+ -1); > > printBundle->GetStringFromName(NS_LITERAL_STRING("customHeaderFooterPrompt").get(), getter_Copies(intlString)); > GtkWidget* custom_label = gtk_label_new(NS_ConvertUTF16toUTF8(intlString).get()); >--- mozilla/xpcom/io/Makefile.in.sav 2009-08-25 21:25:20.000000000 +0200 >+++ mozilla/xpcom/io/Makefile.in 2009-09-05 00:46:20.000000000 +0200 >@@ -199,3 +199,4 @@ endif > endif > > LOCAL_INCLUDES = -I.. >+LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre >--- mozilla/xpcom/io/nsLocalFileUnix.cpp.sav 2009-07-31 08:30:37.000000000 +0200 >+++ mozilla/xpcom/io/nsLocalFileUnix.cpp 2009-09-05 00:51:45.000000000 +0200 >@@ -84,6 +84,7 @@ > > #ifdef MOZ_WIDGET_GTK2 > #include "nsIGnomeVFSService.h" >+#include "nsKDEUtils.h" > #endif > > #include "nsNativeCharsetUtils.h" >@@ -1666,16 +1667,13 @@ NS_IMETHODIMP > nsLocalFile::Reveal() > { > #ifdef MOZ_WIDGET_GTK2 >- nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); >- if (!vfs) >- return NS_ERROR_FAILURE; >- >+ nsCAutoString url; > PRBool isDirectory; > if (NS_FAILED(IsDirectory(&isDirectory))) > return NS_ERROR_FAILURE; > > if (isDirectory) { >- return vfs->ShowURIForInput(mPath); >+ url = mPath; > } else { > nsCOMPtr<nsIFile> parentDir; > nsCAutoString dirPath; >@@ -1684,8 +1682,21 @@ nsLocalFile::Reveal() > if (NS_FAILED(parentDir->GetNativePath(dirPath))) > return NS_ERROR_FAILURE; > >- return vfs->ShowURIForInput(dirPath); >+ url = dirPath; > } >+ >+ if( nsKDEUtils::kdeSupport()) { >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "OPEN" )); >+ command.AppendCString( url ); >+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; >+ } >+ >+ nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); >+ if (!vfs) >+ return NS_ERROR_FAILURE; >+ return vfs->ShowURIForInput(url); >+ > #else > return NS_ERROR_FAILURE; > #endif >@@ -1695,6 +1706,13 @@ NS_IMETHODIMP > nsLocalFile::Launch() > { > #ifdef MOZ_WIDGET_GTK2 >+ if( nsKDEUtils::kdeSupport()) { >+ nsCStringArray command; >+ command.AppendCString( NS_LITERAL_CSTRING( "OPEN" )); >+ command.AppendCString( mPath ); >+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; >+ } >+ > nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); > if (!vfs) > return NS_ERROR_FAILURE;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 21511
: 3870 |
3889
|
3890
|
3891