[evince] Do not fail to open external uri links that are relative paths



commit 4703212e1b44d4d385dc894cfbdc037db6e2112b
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sun Dec 20 18:26:27 2009 +0100

    Do not fail to open external uri links that are relative paths
    
    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 |   33 +++++++++++++++++++++++++--------
 1 files changed, 25 insertions(+), 8 deletions(-)
---
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 11e3c12..95c2191 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -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);
 	}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]