]> www.fi.muni.cz Git - evince.git/commitdiff
Do not fail to open external uri links that are relative paths
authorCarlos Garcia Campos <carlosgc@gnome.org>
Sun, 20 Dec 2009 17:26:27 +0000 (18:26 +0100)
committerCarlos Garcia Campos <carlosgc@gnome.org>
Sun, 20 Dec 2009 17:32:08 +0000 (18:32 +0100)
If an external uri is not a valid uri (it doesn't contain :// nor
mailto:) we assume it's http if it starts with www, otherwise we build a
new uri for the relative path with the document uri as base.
Fixes bgo#604716.

shell/ev-window.c

index 11e3c12aa0a0fab7ca3d5f103f6fc70fa01293f6..95c21910d409255a3190be8225447c2abfec8226 100644 (file)
@@ -5594,18 +5594,35 @@ launch_external_uri (EvWindow *window, EvLinkAction *action)
 
        if (!g_strstr_len (uri, strlen (uri), "://") &&
            !g_str_has_prefix (uri, "mailto:")) {
-               gchar *http;
-               
-               /* Not a valid uri, assuming it's http */
-               http = g_strdup_printf ("http://%s", uri);
-               ret = g_app_info_launch_default_for_uri (http, context, &error);
-               g_free (http);
+               gchar *new_uri;
+
+               /* Not a valid uri, assume http if it starts with www */
+               if (g_str_has_prefix (uri, "www.")) {
+                       new_uri = g_strdup_printf ("http://%s", uri);
+               } else {
+                       GFile *file, *parent;
+
+                       file = g_file_new_for_uri (window->priv->uri);
+                       parent = g_file_get_parent (file);
+                       g_object_unref (file);
+                       if (parent) {
+                               gchar *parent_uri = g_file_get_uri (parent);
+
+                               new_uri = g_build_filename (parent_uri, uri, NULL);
+                               g_free (parent_uri);
+                               g_object_unref (parent);
+                       } else {
+                               new_uri = g_strdup_printf ("file:///%s", uri);
+                       }
+               }
+               ret = g_app_info_launch_default_for_uri (new_uri, context, &error);
+               g_free (new_uri);
        } else {
                ret = g_app_info_launch_default_for_uri (uri, context, &error);
        }
-       
+
        if (ret == FALSE) {
-               ev_window_error_message (window, error, 
+               ev_window_error_message (window, error,
                                         "%s", _("Unable to open external link"));
                g_error_free (error);
        }