forwarded 488971 https://bugzilla.mozilla.org/show_bug.cgi?id=444440
thanks

On Wed, Jul 09, 2008 at 01:47:11PM +0200, Mike Hommey wrote:
> Can you try the attached patch against xulrunner ? (not tested ; I /think/
> it should work and not break anything else, but I will have to do some
> real testing)

This patch was lacking a definition for one virtual member of
nsMIMEInfoImpl. The newly attached patch does this, and some other stuff
that should fix your issue, and some others that I saw at the same time.

Mike
diff --git a/uriloader/exthandler/nsMIMEInfoImpl.h 
b/uriloader/exthandler/nsMIMEInfoImpl.h
index 77813b5..a600ed1 100644
--- a/uriloader/exthandler/nsMIMEInfoImpl.h
+++ b/uriloader/exthandler/nsMIMEInfoImpl.h
@@ -219,7 +219,7 @@ class nsMIMEInfoImpl : public nsMIMEInfoBase {
      * Loads the URI with the OS default app.  This should be overridden by 
each
      * OS's implementation.
      */
-    virtual NS_HIDDEN_(nsresult) LoadUriInternal(nsIURI *aURI) = 0;
+    virtual NS_HIDDEN_(nsresult) LoadUriInternal(nsIURI *aURI) { return 
NS_ERROR_NOT_IMPLEMENTED; }
 
     nsCOMPtr<nsIFile>      mDefaultApplication; ///< default application 
associated with this type.
 };
diff --git a/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp 
b/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp
index 2b14306..ae98211 100644
--- a/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp
+++ b/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp
@@ -51,18 +51,19 @@ 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)
+  if (mClass == eMIMEInfo) {
+    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;
+    }
+  } else {
+    if (nsGNOMERegistry::HandlerExists(mType.get()))
       *_retval = PR_TRUE;
   }
 
-  if (*_retval)
-    return NS_OK;
-
-  // If we didn't find a VFS handler, fallback.
-  return nsMIMEInfoImpl::GetHasDefaultHandler(_retval);
+  return NS_OK;
 }
 
 nsresult
@@ -79,8 +80,5 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(nsIFile *aFile)
       return app->Launch(nativePath);
   }
 
-  if (!mDefaultApplication)
-    return NS_ERROR_FILE_NOT_FOUND;
-
-  return LaunchWithIProcess(mDefaultApplication, nativePath);
+  return NS_ERROR_FILE_NOT_FOUND;
 }
diff --git a/uriloader/exthandler/unix/nsOSHelperAppService.cpp 
b/uriloader/exthandler/unix/nsOSHelperAppService.cpp
index 38bbf1f..002090d 100644
--- a/uriloader/exthandler/unix/nsOSHelperAppService.cpp
+++ b/uriloader/exthandler/unix/nsOSHelperAppService.cpp
@@ -1252,28 +1252,34 @@ nsOSHelperAppService::GetHandlerAppFromPrefs(const 
char* aScheme, /*out*/ nsIFil
   return GetFileTokenForPath(utf16AppPath.get(), aApp);
 }
 
-nsresult nsOSHelperAppService::OSProtocolHandlerExists(const char * 
aProtocolScheme, PRBool * aHandlerExists)
+/* Returns 0 for no handler, 1 for prefs handler and 2 for GNOME handler */
+int nsOSHelperAppService::GetProtocolHandlerType(const char * aProtocolScheme)
 {
-  LOG(("-- nsOSHelperAppService::OSProtocolHandlerExists for '%s'\n",
-       aProtocolScheme));
-  *aHandlerExists = PR_FALSE;
-
   nsCOMPtr<nsIFile> app;
   nsresult rv = GetHandlerAppFromPrefs(aProtocolScheme, getter_AddRefs(app));
   if (NS_SUCCEEDED(rv)) {
     PRBool isExecutable = PR_FALSE, exists = PR_FALSE;
     nsresult rv1 = app->Exists(&exists);
     nsresult rv2 = app->IsExecutable(&isExecutable);
-    *aHandlerExists = (NS_SUCCEEDED(rv1) && exists && NS_SUCCEEDED(rv2) && 
isExecutable);
-    LOG(("   handler exists: %s\n", *aHandlerExists ? "yes" : "no"));
+    if (NS_SUCCEEDED(rv1) && exists && NS_SUCCEEDED(rv2) && isExecutable)
+      return 1;
   }
 
 #ifdef MOZ_WIDGET_GTK2
   // Check the GConf registry for a protocol handler
-  if (!*aHandlerExists)
-    *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme);
+  if (nsGNOMERegistry::HandlerExists(aProtocolScheme))
+    return 2;
 #endif
 
+  return 0;
+}
+
+nsresult nsOSHelperAppService::OSProtocolHandlerExists(const char * 
aProtocolScheme, PRBool * aHandlerExists)
+{
+  LOG(("-- nsOSHelperAppService::OSProtocolHandlerExists for '%s'\n",
+       aProtocolScheme));
+  *aHandlerExists = GetProtocolHandlerType(aProtocolScheme) ? PR_TRUE : 
PR_FALSE;
+  LOG(("   handler exists: %s\n", *aHandlerExists ? "yes" : "no"));
   return NS_OK;
 }
 
@@ -1413,7 +1419,7 @@ nsOSHelperAppService::GetFromExtension(const nsCString& 
aFileExt) {
   }
 
   nsCAutoString mimeType(asciiMajorType + NS_LITERAL_CSTRING("/") + 
asciiMinorType);
-  nsMIMEInfoUnix* mimeInfo = new nsMIMEInfoUnix(mimeType);
+  nsMIMEInfoImpl* mimeInfo = new nsMIMEInfoImpl(mimeType);
   if (!mimeInfo)
     return nsnull;
   NS_ADDREF(mimeInfo);
@@ -1578,7 +1584,7 @@ nsOSHelperAppService::GetFromType(const nsCString& 
aMIMEType) {
     return nsnull;
   }
   
-  nsMIMEInfoUnix* mimeInfo = new nsMIMEInfoUnix(aMIMEType);
+  nsMIMEInfoImpl* mimeInfo = new nsMIMEInfoImpl(aMIMEType);
   if (!mimeInfo)
     return nsnull;
   NS_ADDREF(mimeInfo);
@@ -1634,7 +1640,7 @@ nsOSHelperAppService::GetMIMEInfoFromOS(const nsACString& 
aType,
     // If we got nothing, make a new mimeinfo
     if (!retval) {
       *aFound = PR_FALSE;
-      retval = new nsMIMEInfoUnix(aType);
+      retval = new nsMIMEInfoImpl(aType);
       if (retval) {
         NS_ADDREF(retval);
         if (!aFileExt.IsEmpty())
@@ -1662,19 +1668,21 @@ 
nsOSHelperAppService::GetProtocolHandlerInfoFromOS(const nsACString &aScheme,
   // 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))
-    return rv;
-
-  nsMIMEInfoUnix *handlerInfo =
-    new nsMIMEInfoUnix(aScheme, nsMIMEInfoBase::eProtocolInfo);
+  nsMIMEInfoBase *handlerInfo;
+  int handlerType = 
GetProtocolHandlerType(nsPromiseFlatCString(aScheme).get());
+  if (handlerType == 2) {
+    handlerInfo = new nsMIMEInfoUnix(aScheme, nsMIMEInfoBase::eProtocolInfo);
+  } else {
+    handlerInfo = new nsMIMEInfoImpl(aScheme, nsMIMEInfoBase::eProtocolInfo);
+  }
   NS_ENSURE_TRUE(handlerInfo, NS_ERROR_OUT_OF_MEMORY);
   NS_ADDREF(*_retval = handlerInfo);
+  *found = handlerType ? PR_TRUE : PR_FALSE;
 
-  if (!*found) {
+  if (handlerType != 1) {
     // Code that calls this requires an object regardless if the OS has
     // something for us, so we return the empty object.
+    // We also don't need to SetDefaultDescription for nsMIMEInfoUnix
     return NS_OK;
   }
 
diff --git a/uriloader/exthandler/unix/nsOSHelperAppService.h 
b/uriloader/exthandler/unix/nsOSHelperAppService.h
index e7dbbea..f8b43c7 100644
--- a/uriloader/exthandler/unix/nsOSHelperAppService.h
+++ b/uriloader/exthandler/unix/nsOSHelperAppService.h
@@ -164,6 +164,8 @@ private:
                                                           nsAString& 
aMozillaFlags);
 
   nsresult GetHandlerAppFromPrefs(const char* aScheme, nsIFile** aApp);
+
+  int GetProtocolHandlerType(const char * aProtocolScheme);
 };
 
 #endif // nsOSHelperAppService_h__

Reply via email to