Blob Blame History Raw
diff -up thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsGNOMERegistry.cpp.moz-694870-backout thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsGNOMERegistry.cpp
--- thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsGNOMERegistry.cpp.moz-694870-backout	2016-04-07 23:33:34.000000000 +0200
+++ thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsGNOMERegistry.cpp	2016-05-10 15:17:28.973860591 +0200
@@ -6,50 +6,95 @@
 #include "nsGNOMERegistry.h"
 #include "nsString.h"
 #include "nsIComponentManager.h"
+#include "nsIFile.h"
 #include "nsMIMEInfoUnix.h"
 #include "nsAutoPtr.h"
+#include "nsIGConfService.h"
+#include "nsIGnomeVFSService.h"
 #include "nsIGIOService.h"
 
+#ifdef MOZ_WIDGET_GTK
+#include <glib.h>
+#include <glib-object.h>
+#endif
+
 /* static */ bool
 nsGNOMERegistry::HandlerExists(const char *aProtocolScheme)
 {
   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-  if (!giovfs) {
-    return false;
-  }
+  nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
+  if (giovfs) {
+    nsCOMPtr<nsIGIOMimeApp> app;
+    if (NS_FAILED(giovfs->GetAppForURIScheme(nsDependentCString(aProtocolScheme),
+                                             getter_AddRefs(app))))
+      return false;
+    else
+      return true;
+  } else if (gconf) {
+    bool isEnabled;
+    nsAutoCString handler;
+    if (NS_FAILED(gconf->GetAppForProtocol(nsDependentCString(aProtocolScheme), &isEnabled, handler)))
+      return false;
 
-  nsCOMPtr<nsIGIOMimeApp> app;
-  return NS_SUCCEEDED(giovfs->GetAppForURIScheme(nsDependentCString(aProtocolScheme),
-                                                 getter_AddRefs(app)));
+    return isEnabled;
+  }
+  return false;
 }
 
 // XXX Check HandlerExists() before calling LoadURL.
+//
+// If there is not a registered handler for the protocol, gnome_url_show()
+// falls back to using gnomevfs modules.  See bug 389632.  We don't want
+// this fallback to happen as we are not sure of the safety of all gnomevfs
+// modules and MIME-default applications.  (gnomevfs should be handled in
+// nsGnomeVFSProtocolHandler.)
 
 /* static */ nsresult
 nsGNOMERegistry::LoadURL(nsIURI *aURL)
 {
   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-  if (!giovfs) {
-    return NS_ERROR_FAILURE;
-  }
+  if (giovfs)
+    return giovfs->ShowURI(aURL);
+  nsCOMPtr<nsIGnomeVFSService> gnomevfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID);
+  if (gnomevfs)
+    return gnomevfs->ShowURI(aURL);
 
-  return giovfs->ShowURI(aURL);
+  return NS_ERROR_FAILURE;
 }
 
 /* static */ void
 nsGNOMERegistry::GetAppDescForScheme(const nsACString& aScheme,
                                      nsAString& aDesc)
 {
+  nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-  if (!giovfs)
+  if (!gconf && !giovfs)
     return;
 
   nsAutoCString name;
-  nsCOMPtr<nsIGIOMimeApp> app;
-  if (NS_FAILED(giovfs->GetAppForURIScheme(aScheme, getter_AddRefs(app))))
-    return;
-
-  app->GetName(name);
+  if (giovfs) {
+    nsCOMPtr<nsIGIOMimeApp> app;
+    if (NS_FAILED(giovfs->GetAppForURIScheme(aScheme, getter_AddRefs(app))))
+      return;
+
+    app->GetName(name);
+  } else {
+    bool isEnabled;
+    if (NS_FAILED(gconf->GetAppForProtocol(aScheme, &isEnabled, name)))
+      return;
+
+    if (!name.IsEmpty()) {
+      // Try to only provide the executable name, as it is much simpler than with the path and arguments
+      int32_t firstSpace = name.FindChar(' ');
+      if (firstSpace != kNotFound) {
+        name.Truncate(firstSpace);
+        int32_t lastSlash = name.RFindChar('/');
+        if (lastSlash != kNotFound) {
+          name.Cut(0, lastSlash + 1);
+        }
+      }
+    }
+  }
 
   CopyUTF8toUTF16(name, aDesc);
 }
@@ -60,15 +105,22 @@ nsGNOMERegistry::GetFromExtension(const
 {
   nsAutoCString mimeType;
   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-  if (!giovfs) {
-    return nullptr;
-  }
-
-  // Get the MIME type from the extension, then call GetFromType to
-  // fill in the MIMEInfo.
-  if (NS_FAILED(giovfs->GetMimeTypeFromExtension(aFileExt, mimeType)) ||
-      mimeType.EqualsLiteral("application/octet-stream")) {
-    return nullptr;
+  if (giovfs) {
+    // Get the MIME type from the extension, then call GetFromType to
+    // fill in the MIMEInfo.
+    if (NS_FAILED(giovfs->GetMimeTypeFromExtension(aFileExt, mimeType)) ||
+        mimeType.EqualsLiteral("application/octet-stream")) {
+      return nullptr;
+    }
+  } else {
+    /* Fallback to GnomeVFS */
+    nsCOMPtr<nsIGnomeVFSService> gnomevfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID);
+    if (!gnomevfs)
+      return nullptr;
+
+    if (NS_FAILED(gnomevfs->GetMimeTypeFromExtension(aFileExt, mimeType)) ||
+        mimeType.EqualsLiteral("application/octet-stream"))
+      return nullptr;
   }
 
   RefPtr<nsMIMEInfoBase> mi = GetFromType(mimeType);
@@ -89,17 +141,28 @@ nsGNOMERegistry::GetFromType(const nsACS
   nsAutoCString description;
 
   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-  if (!giovfs) {
-    return nullptr;
-  }
-
-  nsCOMPtr<nsIGIOMimeApp> gioHandlerApp;
-  if (NS_FAILED(giovfs->GetAppForMimeType(aMIMEType, getter_AddRefs(gioHandlerApp))) ||
-      !gioHandlerApp) {
-    return nullptr;
+  if (giovfs) {
+    nsCOMPtr<nsIGIOMimeApp> gioHandlerApp;
+    if (NS_FAILED(giovfs->GetAppForMimeType(aMIMEType, getter_AddRefs(gioHandlerApp))) ||
+        !gioHandlerApp) {
+      return nullptr;
+    }
+    gioHandlerApp->GetName(name);
+    giovfs->GetDescriptionForMimeType(aMIMEType, description);
+  } else {
+    /* Fallback to GnomeVFS*/
+    nsCOMPtr<nsIGnomeVFSService> gnomevfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID);
+    if (!gnomevfs)
+      return nullptr;
+
+    nsCOMPtr<nsIGnomeVFSMimeApp> gnomeHandlerApp;
+    if (NS_FAILED(gnomevfs->GetAppForMimeType(aMIMEType, getter_AddRefs(gnomeHandlerApp))) ||
+        !gnomeHandlerApp) {
+      return nullptr;
+    }
+    gnomeHandlerApp->GetName(name);
+    gnomevfs->GetDescriptionForMimeType(aMIMEType, description);
   }
-  gioHandlerApp->GetName(name);
-  giovfs->GetDescriptionForMimeType(aMIMEType, description);
 
   mimeInfo->SetDefaultDescription(NS_ConvertUTF8toUTF16(name));
   mimeInfo->SetPreferredAction(nsIMIMEInfo::useSystemDefault);
diff -up thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp.moz-694870-backout thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp
--- thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp.moz-694870-backout	2016-04-07 23:33:34.000000000 +0200
+++ thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp	2016-05-11 08:24:13.869018683 +0200
@@ -16,6 +16,7 @@
 #include "nsIGIOService.h"
 #include "nsNetCID.h"
 #include "nsIIOService.h"
+#include "nsIGnomeVFSService.h"
 #include "nsAutoPtr.h"
 #ifdef MOZ_ENABLE_DBUS
 #include "nsDBusHandlerApp.h"
@@ -103,26 +104,51 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns
 #endif
 
   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-  if (!giovfs) {
-    return NS_ERROR_FAILURE;
-  }
-
-  // nsGIOMimeApp->Launch wants a URI string instead of local file
-  nsresult rv;
-  nsCOMPtr<nsIIOService> ioservice = do_GetService(NS_IOSERVICE_CONTRACTID, &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-  nsCOMPtr<nsIURI> uri;
-  rv = ioservice->NewFileURI(aFile, getter_AddRefs(uri));
-  NS_ENSURE_SUCCESS(rv, rv);
   nsAutoCString uriSpec;
-  uri->GetSpec(uriSpec);
+  if (giovfs) {
+    // nsGIOMimeApp->Launch wants a URI string instead of local file
+    nsresult rv;
+    nsCOMPtr<nsIIOService> ioservice = do_GetService(NS_IOSERVICE_CONTRACTID, &rv);
+    NS_ENSURE_SUCCESS(rv, rv);
+    nsCOMPtr<nsIURI> uri;
+    rv = ioservice->NewFileURI(aFile, getter_AddRefs(uri));
+    NS_ENSURE_SUCCESS(rv, rv);
+    uri->GetSpec(uriSpec);
+  }
+
+  nsCOMPtr<nsIGnomeVFSService> gnomevfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID);
+  if (giovfs) {
+    nsCOMPtr<nsIGIOMimeApp> app;
+    if (NS_SUCCEEDED(giovfs->GetAppForMimeType(mSchemeOrType, getter_AddRefs(app))) && app)
+      return app->Launch(uriSpec);
+  } else if (gnomevfs) {
+    /* Fallback to GnomeVFS */
+    nsCOMPtr<nsIGnomeVFSMimeApp> 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
+  RefPtr<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromExtension(nativePath);
+  if (mimeInfo) {
+    nsAutoCString type;
+    mimeInfo->GetType(type);
+    if (giovfs) {
+      nsCOMPtr<nsIGIOMimeApp> app;
+      if (NS_SUCCEEDED(giovfs->GetAppForMimeType(type, getter_AddRefs(app))) && app)
+        return app->Launch(uriSpec);
+    } else if (gnomevfs) {
+      nsCOMPtr<nsIGnomeVFSMimeApp> app;
+      if (NS_SUCCEEDED(gnomevfs->GetAppForMimeType(type, getter_AddRefs(app))) && app)
+        return app->Launch(nativePath);
+    }
+  }
 
-  nsCOMPtr<nsIGIOMimeApp> app;
-  if (NS_FAILED(giovfs->GetAppForMimeType(mSchemeOrType, getter_AddRefs(app))) || !app) {
+  if (!mDefaultApplication)
     return NS_ERROR_FILE_NOT_FOUND;
-  }
 
-  return app->Launch(uriSpec);
+  return LaunchWithIProcess(mDefaultApplication, nativePath);
 }
 
 #if defined(MOZ_ENABLE_CONTENTACTION)
diff -up thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsOSHelperAppService.cpp.moz-694870-backout thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsOSHelperAppService.cpp
--- thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsOSHelperAppService.cpp.moz-694870-backout	2016-04-07 23:33:34.000000000 +0200
+++ thunderbird-45.0/mozilla/uriloader/exthandler/unix/nsOSHelperAppService.cpp	2016-05-10 15:17:28.974860591 +0200
@@ -1150,7 +1150,7 @@ nsresult nsOSHelperAppService::OSProtoco
 #endif
 
 #ifdef MOZ_WIDGET_GTK
-  // Check the GNOME registry for a protocol handler
+  // Check the GConf registry for a protocol handler
   *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme);
 #endif
 
@@ -1369,6 +1369,22 @@ nsOSHelperAppService::GetFromType(const
           NS_LossyConvertUTF16toASCII(handler).get(),
           NS_LossyConvertUTF16toASCII(mailcap_description).get()));
 
+#ifdef MOZ_WIDGET_GTK
+  RefPtr<nsMIMEInfoBase> gnomeInfo;
+  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);
+    if (gnomeInfo && gnomeInfo->HasExtensions()) {
+      LOG(("Got MIMEInfo from GNOME registry, and it has extensions set\n"));
+      return gnomeInfo.forget();
+    }
+  }
+#endif
+
   // Now look up our extensions
   nsAutoString extensions, mime_types_description;
   LookUpExtensionsAndDescription(majorType,
@@ -1377,16 +1393,13 @@ nsOSHelperAppService::GetFromType(const
                                  mime_types_description);
 
 #ifdef MOZ_WIDGET_GTK
-  if (handler.IsEmpty()) {
-    RefPtr<nsMIMEInfoBase> gnomeInfo = nsGNOMERegistry::GetFromType(aMIMEType);
-    if (gnomeInfo) {
-      LOG(("Got MIMEInfo from GNOME registry without extensions; setting them "
-           "to %s\n", NS_LossyConvertUTF16toASCII(extensions).get()));
-
-      NS_ASSERTION(!gnomeInfo->HasExtensions(), "How'd that happen?");
-      gnomeInfo->SetFileExtensions(NS_ConvertUTF16toUTF8(extensions));
-      return gnomeInfo.forget();
-    }
+  if (gnomeInfo) {
+    LOG(("Got MIMEInfo from GNOME registry without extensions; setting them "
+         "to %s\n", NS_LossyConvertUTF16toASCII(extensions).get()));
+
+    NS_ASSERTION(!gnomeInfo->HasExtensions(), "How'd that happen?");
+    gnomeInfo->SetFileExtensions(NS_ConvertUTF16toUTF8(extensions));
+    return gnomeInfo.forget();
   }
 #endif
 
@@ -1513,6 +1526,9 @@ nsOSHelperAppService::GetProtocolHandler
 {
   NS_ASSERTION(!aScheme.IsEmpty(), "No scheme was specified!");
 
+  // We must check that a registered handler exists so that gnome_url_show
+  // doesn't fallback to gnomevfs.
+  // See nsGNOMERegistry::LoadURL and bug 389632.
   nsresult rv = OSProtocolHandlerExists(nsPromiseFlatCString(aScheme).get(),
                                         found);
   if (NS_FAILED(rv))