119 lines
3.6 KiB
Diff
119 lines
3.6 KiB
Diff
|
From: Wolfgang Rosenauer <wr@rosenauer.org>
|
||
|
Subject: no helper app for application/octet-stream but recognized extensions
|
||
|
References:
|
||
|
https://bugzilla.novell.com/show_bug.cgi?id=406979
|
||
|
https://bugzilla.mozilla.org/show_bug.cgi?id=327323
|
||
|
|
||
|
|
||
|
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
|
||
|
@@ -41,16 +41,17 @@
|
||
|
#include <glib.h>
|
||
|
#include <hildon-uri.h>
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#include "nsMIMEInfoUnix.h"
|
||
|
#include "nsGNOMERegistry.h"
|
||
|
#include "nsIGnomeVFSService.h"
|
||
|
+#include "nsAutoPtr.h"
|
||
|
#ifdef MOZ_ENABLE_DBUS
|
||
|
#include "nsDBusHandlerApp.h"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
nsresult
|
||
|
nsMIMEInfoUnix::LoadUriInternal(nsIURI * aURI)
|
||
|
{
|
||
|
@@ -69,23 +70,26 @@ nsMIMEInfoUnix::LoadUriInternal(nsIURI *
|
||
|
#endif
|
||
|
return rv;
|
||
|
}
|
||
|
|
||
|
NS_IMETHODIMP
|
||
|
nsMIMEInfoUnix::GetHasDefaultHandler(PRBool *_retval)
|
||
|
{
|
||
|
*_retval = PR_FALSE;
|
||
|
- nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID);
|
||
|
- if (vfs) {
|
||
|
- nsCOMPtr<nsIGnomeVFSMimeApp> app;
|
||
|
- if (NS_SUCCEEDED(vfs->GetAppForMimeType(mType, getter_AddRefs(app))) && app)
|
||
|
- *_retval = PR_TRUE;
|
||
|
+ nsRefPtr<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromType(mType);
|
||
|
+ if (!mimeInfo) {
|
||
|
+ nsCAutoString ext;
|
||
|
+ GetPrimaryExtension(ext);
|
||
|
+ mimeInfo = nsGNOMERegistry::GetFromExtension(ext);
|
||
|
}
|
||
|
|
||
|
+ if (mimeInfo)
|
||
|
+ *_retval = PR_TRUE;
|
||
|
+
|
||
|
if (*_retval)
|
||
|
return NS_OK;
|
||
|
|
||
|
#ifdef MOZ_PLATFORM_HILDON
|
||
|
HildonURIAction *action = hildon_uri_get_default_action(mType.get(), nsnull);
|
||
|
if (action) {
|
||
|
*_retval = PR_TRUE;
|
||
|
hildon_uri_action_unref(action);
|
||
|
@@ -104,16 +108,26 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns
|
||
|
aFile->GetNativePath(nativePath);
|
||
|
|
||
|
nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID);
|
||
|
|
||
|
if (vfs) {
|
||
|
nsCOMPtr<nsIGnomeVFSMimeApp> app;
|
||
|
if (NS_SUCCEEDED(vfs->GetAppForMimeType(mType, 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<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromExtension(nativePath);
|
||
|
+ if (mimeInfo) {
|
||
|
+ nsCAutoString type;
|
||
|
+ mimeInfo->GetType(type);
|
||
|
+ if (NS_SUCCEEDED(vfs->GetAppForMimeType(type, getter_AddRefs(app))) && app)
|
||
|
+ return app->Launch(nativePath);
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
if (!mDefaultApplication)
|
||
|
return NS_ERROR_FILE_NOT_FOUND;
|
||
|
|
||
|
return LaunchWithIProcess(mDefaultApplication, nativePath);
|
||
|
}
|
||
|
|
||
|
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
|
||
|
@@ -1641,18 +1641,26 @@ nsOSHelperAppService::GetMIMEInfoFromOS(
|
||
|
NS_ADDREF(retval);
|
||
|
if (!aFileExt.IsEmpty())
|
||
|
retval->AppendExtension(aFileExt);
|
||
|
}
|
||
|
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
- // Copy the attributes of retval onto miByExt, to return it
|
||
|
+ // Copy the attributes of retval onto miByExt, to return it but keep
|
||
|
+ // just collected mDefaultAppDescription
|
||
|
+ nsAutoString byExtDefault;
|
||
|
+ miByExt->GetDefaultDescription(byExtDefault);
|
||
|
+ retval->SetDefaultDescription(byExtDefault);
|
||
|
retval->CopyBasicDataTo(miByExt);
|
||
|
+ // But set the extensions primary since CopyBasicDataTo overwrites the
|
||
|
+ // list
|
||
|
+ if (!aFileExt.IsEmpty())
|
||
|
+ miByExt->SetPrimaryExtension(aFileExt);
|
||
|
|
||
|
miByExt.swap(retval);
|
||
|
}
|
||
|
return retval;
|
||
|
}
|
||
|
|
||
|
NS_IMETHODIMP
|
||
|
nsOSHelperAppService::GetProtocolHandlerInfoFromOS(const nsACString &aScheme,
|