firefox-shellservice.patch
changeset 289 3c0dff7ca9c4
parent 288 d51f3999a1c2
child 290 8e4307c73cbd
--- a/firefox-shellservice.patch	Thu Jul 07 08:00:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,326 +0,0 @@
-# HG changeset patch
-# Parent 948830682920db68e4b039f5babc34dea0040415
-Bug 611953 - GNOME 3.0 readiness (based on patch 3)
-
-diff --git a/browser/components/shell/src/nsGNOMEShellService.cpp b/browser/components/shell/src/nsGNOMEShellService.cpp
---- a/browser/components/shell/src/nsGNOMEShellService.cpp
-+++ b/browser/components/shell/src/nsGNOMEShellService.cpp
-@@ -101,30 +101,33 @@ static const char kDesktopOptionsKey[] =
- static const char kDesktopDrawBGKey[] = DG_BACKGROUND "/draw_background";
- static const char kDesktopColorKey[] = DG_BACKGROUND "/primary_color";
- 
- nsresult
- nsGNOMEShellService::Init()
- {
-   nsresult rv;
- 
--  // GConf _must_ be available, or we do not allow
-+  // GConf or GIO _must_ be available, or we do not allow
-   // CreateInstance to succeed.
- 
-   nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
-   nsCOMPtr<nsIGIOService> giovfs =
-     do_GetService(NS_GIOSERVICE_CONTRACTID);
- 
--  if (!gconf)
-+  if (!gconf && !giovfs)
-     return NS_ERROR_NOT_AVAILABLE;
- 
-   // Check G_BROKEN_FILENAMES.  If it's set, then filenames in glib use
-   // the locale encoding.  If it's not set, they use UTF-8.
-   mUseLocaleFilenames = PR_GetEnv("G_BROKEN_FILENAMES") != nsnull;
- 
-+  if (GetAppPathFromLauncher())
-+    return NS_OK;
-+
-   nsCOMPtr<nsIProperties> dirSvc
-     (do_GetService("@mozilla.org/file/directory_service;1"));
-   NS_ENSURE_TRUE(dirSvc, NS_ERROR_NOT_AVAILABLE);
- 
-   nsCOMPtr<nsILocalFile> appPath;
-   rv = dirSvc->Get(NS_XPCOM_CURRENT_PROCESS_DIR, NS_GET_IID(nsILocalFile),
-                    getter_AddRefs(appPath));
-   NS_ENSURE_SUCCESS(rv, rv);
-@@ -133,16 +136,44 @@ nsGNOMEShellService::Init()
-   NS_ENSURE_SUCCESS(rv, rv);
- 
-   return appPath->GetNativePath(mAppPath);
- }
- 
- NS_IMPL_ISUPPORTS1(nsGNOMEShellService, nsIShellService)
- 
- PRBool
-+nsGNOMEShellService::GetAppPathFromLauncher()
-+{
-+  gchar *tmp;
-+
-+  const char *launcher = PR_GetEnv("MOZ_APP_LAUNCHER");
-+  if (!launcher)
-+    return PR_FALSE;
-+
-+  if (g_path_is_absolute(launcher)) {
-+    mAppPath = launcher;
-+    tmp = g_path_get_basename(launcher);
-+    gchar *fullpath = g_find_program_in_path(tmp);
-+    if (fullpath && mAppPath.Equals(fullpath))
-+      mAppIsInPath = PR_TRUE;
-+    g_free(fullpath);
-+  } else {
-+    tmp = g_find_program_in_path(launcher);
-+    if (!tmp)
-+      return PR_FALSE;
-+    mAppPath = tmp;
-+    mAppIsInPath = PR_TRUE;
-+  }
-+
-+  g_free(tmp);
-+  return PR_TRUE;
-+}
-+
-+PRBool
- nsGNOMEShellService::KeyMatchesAppName(const char *aKeyValue) const
- {
- 
-   gchar *commandPath;
-   if (mUseLocaleFilenames) {
-     gchar *nativePath = g_filename_from_utf8(aKeyValue, -1, NULL, NULL, NULL);
-     if (!nativePath) {
-       NS_ERROR("Error converting path to filesystem encoding");
-@@ -158,84 +189,119 @@ nsGNOMEShellService::KeyMatchesAppName(c
-   if (!commandPath)
-     return PR_FALSE;
- 
-   PRBool matches = mAppPath.Equals(commandPath);
-   g_free(commandPath);
-   return matches;
- }
- 
-+PRBool
-+nsGNOMEShellService::CheckHandlerMatchesAppName(const nsACString &handler) const
-+{
-+  gint argc;
-+  gchar **argv;
-+  nsCAutoString command(handler);
-+
-+  // The string will be something of the form: [/path/to/]browser "%s"
-+  // We want to remove all of the parameters and get just the binary name.
-+  if (g_shell_parse_argv(command.get(), &argc, &argv, NULL) && argc > 0) {
-+    command.Assign(argv[0]);
-+    g_strfreev(argv);
-+  }
-+
-+  if (!KeyMatchesAppName(command.get()))
-+    return PR_FALSE; // the handler is disabled or set to another app
-+
-+  return PR_TRUE;
-+}
-+
- NS_IMETHODIMP
- nsGNOMEShellService::IsDefaultBrowser(PRBool aStartupCheck,
-                                       PRBool* aIsDefaultBrowser)
- {
-   *aIsDefaultBrowser = PR_FALSE;
-   if (aStartupCheck)
-     mCheckedThisSession = PR_TRUE;
- 
-   nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
-+  nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
- 
-   PRBool enabled;
-   nsCAutoString handler;
-+  nsCOMPtr<nsIGIOMimeApp> gioApp;
- 
-   for (unsigned int i = 0; i < NS_ARRAY_LENGTH(appProtocols); ++i) {
-     if (!appProtocols[i].essential)
-       continue;
- 
--    handler.Truncate();
--    gconf->GetAppForProtocol(nsDependentCString(appProtocols[i].name),
--                             &enabled, handler);
-+    if (gconf) {
-+      handler.Truncate();
-+      gconf->GetAppForProtocol(nsDependentCString(appProtocols[i].name),
-+                               &enabled, handler);
- 
--    // The string will be something of the form: [/path/to/]browser "%s"
--    // We want to remove all of the parameters and get just the binary name.
--
--    gint argc;
--    gchar **argv;
--
--    if (g_shell_parse_argv(handler.get(), &argc, &argv, NULL) && argc > 0) {
--      handler.Assign(argv[0]);
--      g_strfreev(argv);
-+      if (!CheckHandlerMatchesAppName(handler) || !enabled)
-+        return NS_OK; // the handler is disabled or set to another app
-     }
- 
--    if (!KeyMatchesAppName(handler.get()) || !enabled)
--      return NS_OK; // the handler is disabled or set to another app
-+    if (giovfs) {
-+      handler.Truncate();
-+      giovfs->GetAppForURIScheme(nsDependentCString(appProtocols[i].name),
-+                                 getter_AddRefs(gioApp));
-+      if (!gioApp)
-+        return NS_OK;
-+
-+      gioApp->GetCommand(handler);
-+
-+      if (!CheckHandlerMatchesAppName(handler))
-+        return NS_OK; // the handler is set to another app
-+    }
-   }
- 
-   *aIsDefaultBrowser = PR_TRUE;
- 
-   return NS_OK;
- }
- 
- NS_IMETHODIMP
- nsGNOMEShellService::SetDefaultBrowser(PRBool aClaimAllTypes,
-                                        PRBool aForAllUsers)
- {
- #ifdef DEBUG
-   if (aForAllUsers)
-     NS_WARNING("Setting the default browser for all users is not yet supported");
- #endif
- 
-+  nsCAutoString appKeyValue;
-   nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
-+  nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-+
-+  if (mAppIsInPath) {
-+    // mAppPath is in the users path, so use only the basename as the
-+    // launcher
-+    gchar *tmp = g_path_get_basename(mAppPath.get());
-+    appKeyValue = tmp;
-+    g_free(tmp);
-+  } else {
-+    appKeyValue = mAppPath;
-+  }
-+  appKeyValue.AppendLiteral(" %s");
-+
-   if (gconf) {
--    nsCAutoString appKeyValue(mAppPath);
--    appKeyValue.Append(" \"%s\"");
-     for (unsigned int i = 0; i < NS_ARRAY_LENGTH(appProtocols); ++i) {
-       if (appProtocols[i].essential || aClaimAllTypes) {
-         gconf->SetAppForProtocol(nsDependentCString(appProtocols[i].name),
-                                  appKeyValue);
-       }
-     }
-   }
- 
--  // set handler for .html and xhtml files and MIME types:
--  if (aClaimAllTypes) {
-+  if (giovfs) {
-     nsresult rv;
--    nsCOMPtr<nsIGIOService> giovfs =
--      do_GetService(NS_GIOSERVICE_CONTRACTID, &rv);
--    NS_ENSURE_SUCCESS(rv, NS_OK);
-+    unsigned int i;
- 
-     nsCOMPtr<nsIStringBundleService> bundleService =
-       do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv);
-     NS_ENSURE_SUCCESS(rv, rv);
- 
-     nsCOMPtr<nsIStringBundle> brandBundle;
-     rv = bundleService->CreateBundle(BRAND_PROPERTIES, getter_AddRefs(brandBundle));
-     NS_ENSURE_SUCCESS(rv, rv);
-@@ -249,20 +315,30 @@ nsGNOMEShellService::SetDefaultBrowser(P
-     // use brandShortName as the application id.
-     NS_ConvertUTF16toUTF8 id(brandShortName);
-     nsCOMPtr<nsIGIOMimeApp> appInfo;
-     rv = giovfs->CreateAppFromCommand(mAppPath,
-                                       id,
-                                       getter_AddRefs(appInfo));
-     NS_ENSURE_SUCCESS(rv, rv);
- 
--    // Add mime types for html, xhtml extension and set app to just created appinfo.
--    for (unsigned int i = 0; i < NS_ARRAY_LENGTH(appTypes); ++i) {
--      appInfo->SetAsDefaultForMimeType(nsDependentCString(appTypes[i].mimeType));
--      appInfo->SetAsDefaultForFileExtensions(nsDependentCString(appTypes[i].extensions));
-+    // set handler for the protocols
-+    for (i = 0; i < NS_ARRAY_LENGTH(appProtocols); ++i) {
-+      if (appProtocols[i].essential || aClaimAllTypes) {
-+        appInfo->SetAsDefaultForURIScheme(nsDependentCString(appProtocols[i].name));
-+      }
-+    }
-+
-+    // set handler for .html and xhtml files and MIME types:
-+    if (aClaimAllTypes) {
-+      // Add mime types for html, xhtml extension and set app to just created appinfo.
-+      for (i = 0; i < NS_ARRAY_LENGTH(appTypes); ++i) {
-+        appInfo->SetAsDefaultForMimeType(nsDependentCString(appTypes[i].mimeType));
-+        appInfo->SetAsDefaultForFileExtensions(nsDependentCString(appTypes[i].extensions));
-+      }
-     }
-   }
- 
-   return NS_OK;
- }
- 
- NS_IMETHODIMP
- nsGNOMEShellService::GetShouldCheckDefaultBrowser(PRBool* aResult)
-@@ -451,17 +527,27 @@ nsGNOMEShellService::OpenApplication(PRI
-   nsCAutoString scheme;
-   if (aApplication == APPLICATION_MAIL)
-     scheme.Assign("mailto");
-   else if (aApplication == APPLICATION_NEWS)
-     scheme.Assign("news");
-   else
-     return NS_ERROR_NOT_AVAILABLE;
- 
-+  nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
-+  if (giovfs) {
-+    nsCOMPtr<nsIGIOMimeApp> gioApp;
-+    giovfs->GetAppForURIScheme(scheme, getter_AddRefs(gioApp));
-+    if (gioApp)
-+      return gioApp->Launch(EmptyCString());
-+  }
-+
-   nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID);
-+  if (!gconf)
-+    return NS_ERROR_FAILURE;
- 
-   PRBool enabled;
-   nsCAutoString appCommand;
-   gconf->GetAppForProtocol(scheme, &enabled, appCommand);
- 
-   if (!enabled)
-     return NS_ERROR_FAILURE;
- 
-diff --git a/browser/components/shell/src/nsGNOMEShellService.h b/browser/components/shell/src/nsGNOMEShellService.h
---- a/browser/components/shell/src/nsGNOMEShellService.h
-+++ b/browser/components/shell/src/nsGNOMEShellService.h
-@@ -38,26 +38,29 @@
- #define nsgnomeshellservice_h____
- 
- #include "nsIShellService.h"
- #include "nsStringAPI.h"
- 
- class nsGNOMEShellService : public nsIShellService
- {
- public:
--  nsGNOMEShellService() : mCheckedThisSession(PR_FALSE) { }
-+  nsGNOMEShellService() : mCheckedThisSession(PR_FALSE), mAppIsInPath(PR_FALSE) { }
- 
-   NS_DECL_ISUPPORTS
-   NS_DECL_NSISHELLSERVICE
- 
-   nsresult Init() NS_HIDDEN;
- 
- private:
-   ~nsGNOMEShellService() {}
- 
-   NS_HIDDEN_(PRBool) KeyMatchesAppName(const char *aKeyValue) const;
-+  NS_HIDDEN_(PRBool) CheckHandlerMatchesAppName(const nsACString& handler) const;
- 
-+  NS_HIDDEN_(PRBool) GetAppPathFromLauncher();
-   PRPackedBool mCheckedThisSession;
-   PRPackedBool mUseLocaleFilenames;
-   nsCString    mAppPath;
-+  PRPackedBool mAppIsInPath;
- };
- 
- #endif // nsgnomeshellservice_h____