diff -r d51f3999a1c2 -r 3c0dff7ca9c4 mozilla-gio.patch --- a/mozilla-gio.patch Thu Jul 07 08:00:10 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,284 +0,0 @@ -# HG changeset patch -# User Chris Coulson -# Parent 0ebe30f9eacfe67fa0b699457e524d5a9c96359e -Bug 611953 - GNOME 3.0 readiness (patch 2 + 3) - -diff --git a/toolkit/system/gnome/nsGIOService.cpp b/toolkit/system/gnome/nsGIOService.cpp ---- a/toolkit/system/gnome/nsGIOService.cpp -+++ b/toolkit/system/gnome/nsGIOService.cpp -@@ -101,25 +101,25 @@ nsGIOMimeApp::GetName(nsACString& aName) - return NS_OK; - } - - NS_IMETHODIMP - nsGIOMimeApp::GetCommand(nsACString& aCommand) - { - get_commandline_t g_app_info_get_commandline_ptr; - -- void *libHandle = dlopen("libgio-2.0.so", RTLD_LAZY); -+ void *libHandle = dlopen("libgio-2.0.so.0", RTLD_LAZY); - if (!libHandle) { - return NS_ERROR_FAILURE; - } - dlerror(); /* clear any existing error */ - g_app_info_get_commandline_ptr = - (get_commandline_t) dlsym(libHandle, "g_app_info_get_commandline"); -- if (dlerror() != NULL) { -- const char cmd = *g_app_info_get_commandline_ptr(mApp); -+ if (dlerror() == NULL) { -+ const char *cmd = g_app_info_get_commandline_ptr(mApp); - if (!cmd) { - dlclose(libHandle); - return NS_ERROR_FAILURE; - } - aCommand.Assign(cmd); - } - dlclose(libHandle); - return NS_OK; -@@ -277,16 +277,43 @@ nsGIOMimeApp::SetAsDefaultForFileExtensi - } else { - *ext_pos = '\0'; - } - } - g_free(extensions); - return NS_OK; - } - -+/** -+ * Set default application for URI's of a particular scheme -+ * @param aURIScheme string containing the URI scheme -+ * @return NS_OK when application was set as default for URI scheme, -+ * NS_ERROR_FAILURE otherwise -+ */ -+NS_IMETHODIMP -+nsGIOMimeApp::SetAsDefaultForURIScheme(nsACString const& aURIScheme) -+{ -+ GError *error = NULL; -+ nsCAutoString contentType("x-scheme-handler/"); -+ contentType.Append(aURIScheme); -+ -+ g_app_info_set_as_default_for_type(mApp, -+ contentType.get(), -+ &error); -+ if (error) { -+ g_warning("Cannot set application as default for URI scheme (%s): %s", -+ PromiseFlatCString(aURIScheme).get(), -+ error->message); -+ g_error_free(error); -+ return NS_ERROR_FAILURE; -+ } -+ -+ return NS_OK; -+} -+ - nsresult - nsGIOService::Init() - { - // do nothing, gvfs/gio does not init. - return NS_OK; - } - - NS_IMPL_ISUPPORTS1(nsGIOService, nsIGIOService) -@@ -317,29 +344,45 @@ nsGIOService::GetMimeTypeFromExtension(c - g_free(mime_type); - g_free(content_type); - - return NS_OK; - } - // used in nsGNOMERegistry - // ----------------------------------------------------------------------------- - NS_IMETHODIMP -+nsGIOService::GetAppForURIScheme(const nsACString& aURIScheme, -+ nsIGIOMimeApp** aApp) -+{ -+ *aApp = nsnull; -+ -+ GAppInfo *app_info = g_app_info_get_default_for_uri_scheme( -+ PromiseFlatCString(aURIScheme).get()); -+ if (app_info) { -+ nsGIOMimeApp *mozApp = new nsGIOMimeApp(app_info); -+ NS_ADDREF(*aApp = mozApp); -+ } else { -+ return NS_ERROR_FAILURE; -+ } -+ return NS_OK; -+} -+ -+NS_IMETHODIMP - nsGIOService::GetAppForMimeType(const nsACString& aMimeType, - nsIGIOMimeApp** aApp) - { - *aApp = nsnull; - char *content_type = - get_content_type_from_mime_type(PromiseFlatCString(aMimeType).get()); - if (!content_type) - return NS_ERROR_FAILURE; - - GAppInfo *app_info = g_app_info_get_default_for_type(content_type, false); - if (app_info) { - nsGIOMimeApp *mozApp = new nsGIOMimeApp(app_info); -- NS_ENSURE_TRUE(mozApp, NS_ERROR_OUT_OF_MEMORY); - NS_ADDREF(*aApp = mozApp); - } else { - g_free(content_type); - return NS_ERROR_FAILURE; - } - g_free(content_type); - return NS_OK; - } -@@ -414,75 +457,46 @@ nsGIOService::CreateAppFromCommand(nsACS - nsIGIOMimeApp** appInfo) - { - GError *error = NULL; - *appInfo = nsnull; - - GAppInfo *app_info = NULL, *app_info_from_list = NULL; - GList *apps = g_app_info_get_all(); - GList *apps_p = apps; -- get_commandline_t g_app_info_get_commandline_ptr; -- -- void *libHandle = dlopen("libgio-2.0.so", RTLD_LAZY); -- if (!libHandle) { -- return NS_ERROR_FAILURE; -- } -- dlerror(); /* clear any existing error */ -- g_app_info_get_commandline_ptr = -- (get_commandline_t) dlsym(libHandle, "g_app_info_get_commandline"); -- if (dlerror() != NULL) { -- g_app_info_get_commandline_ptr = NULL; -- } - - // Try to find relevant and existing GAppInfo in all installed application -+ // We do this by comparing each GAppInfo's executable with out own - while (apps_p) { - app_info_from_list = (GAppInfo*) apps_p->data; -- /* This is a silly test. It just compares app names but not -- * commands. This is due to old version of Glib/Gio. The required -- * function which allows to do a regular check of existence of desktop file -- * is possible by using function g_app_info_get_commandline. This function -- * has been introduced in Glib 2.20. */ -- if (app_info_from_list && strcmp(g_app_info_get_name(app_info_from_list), -- PromiseFlatCString(appName).get()) == 0 ) -- { -- if (g_app_info_get_commandline_ptr) -- { -- /* Following test is only possible with Glib >= 2.20. -- * Compare path only by using strncmp */ -- if (strncmp(g_app_info_get_commandline_ptr(app_info_from_list), -- PromiseFlatCString(cmd).get(), -- strlen(PromiseFlatCString(cmd).get())) == 0) -- { -- app_info = app_info_from_list; -- break; -- } else { -- g_object_unref(app_info_from_list); -- } -- } else { -+ if (!app_info) { -+ // If the executable is not absolute, get it's full path -+ char *executable = g_find_program_in_path(g_app_info_get_executable(app_info_from_list)); -+ -+ if (executable && strcmp(executable, PromiseFlatCString(cmd).get()) == 0) { -+ g_object_ref (app_info_from_list); - app_info = app_info_from_list; -- break; - } -- } else { -- g_object_unref(app_info_from_list); -+ g_free(executable); - } -+ -+ g_object_unref(app_info_from_list); - apps_p = apps_p->next; - } - g_list_free(apps); - - if (!app_info) { - app_info = g_app_info_create_from_commandline(PromiseFlatCString(cmd).get(), - PromiseFlatCString(appName).get(), - G_APP_INFO_CREATE_SUPPORTS_URIS, - &error); - } - - if (!app_info) { - g_warning("Cannot create application info from command: %s", error->message); - g_error_free(error); -- dlclose(libHandle); - return NS_ERROR_FAILURE; - } - nsGIOMimeApp *mozApp = new nsGIOMimeApp(app_info); - NS_ENSURE_TRUE(mozApp, NS_ERROR_OUT_OF_MEMORY); - NS_ADDREF(*appInfo = mozApp); -- dlclose(libHandle); - return NS_OK; - } -diff --git a/xpcom/system/nsIGIOService.idl b/xpcom/system/nsIGIOService.idl ---- a/xpcom/system/nsIGIOService.idl -+++ b/xpcom/system/nsIGIOService.idl -@@ -39,17 +39,17 @@ - - #include "nsISupports.idl" - - interface nsIUTF8StringEnumerator; - interface nsIURI; - - /* nsIGIOMimeApp holds information about an application that is looked up - with nsIGIOService::GetAppForMimeType. */ --// 66009894-9877-405b-9321-bf30420e34e6 prev uuid -+// e77021b4-4012-407d-b686-7a1f18050109 prev uuid - - [scriptable, uuid(e77021b4-4012-407d-b686-7a1f18050109)] - interface nsIGIOMimeApp : nsISupports - { - const long EXPECTS_URIS = 0; - const long EXPECTS_PATHS = 1; - const long EXPECTS_URIS_FOR_NON_FILES = 2; - -@@ -57,41 +57,45 @@ interface nsIGIOMimeApp : nsISupports - readonly attribute AUTF8String name; - readonly attribute AUTF8String command; - readonly attribute long expectsURIs; // see constants above - readonly attribute nsIUTF8StringEnumerator supportedURISchemes; - - void launch(in AUTF8String uri); - void setAsDefaultForMimeType(in AUTF8String mimeType); - void setAsDefaultForFileExtensions(in AUTF8String extensions); -+ void setAsDefaultForURIScheme(in AUTF8String uriScheme); - }; - - /* - * The VFS service makes use of two distinct registries. - * - * The application registry holds information about applications (uniquely - * identified by id), such as which MIME types and URI schemes they are - * capable of handling, whether they run in a terminal, etc. - * - * The MIME registry holds information about MIME types, such as which - * extensions map to a given MIME type. The MIME registry also stores the - * id of the application selected to handle each MIME type. - */ - --// prev id dea20bf0-4e4d-48c5-b932-dc3e116dc64b --[scriptable, uuid(47e372c2-78bb-4899-8114-56aa7d9cdac5)] -+// prev id 47e372c2-78bb-4899-8114-56aa7d9cdac5 -+[scriptable, uuid(74ca8791-330d-4786-9569-2a2a19f0b486)] - interface nsIGIOService : nsISupports - { - - /*** MIME registry methods ***/ - - /* Obtain the MIME type registered for an extension. The extension - should not include a leading dot. */ - AUTF8String getMimeTypeFromExtension(in AUTF8String extension); - -+ /* Obtain the preferred application for opening a given URI scheme */ -+ nsIGIOMimeApp getAppForURIScheme(in AUTF8String aURIScheme); -+ - /* Obtain the preferred application for opening a given MIME type */ - nsIGIOMimeApp getAppForMimeType(in AUTF8String mimeType); - - /* Obtain the preferred application for opening a given MIME type */ - nsIGIOMimeApp createAppFromCommand(in AUTF8String cmd, - in AUTF8String appName); - - /* Obtain a description for the given MIME type */