]> spindle.queued.net Git - midori/commitdiff
Fix display formatting of URIs and unit test it properly
authorChristian Dywan <christian@twotoasts.de>
Tue, 6 Oct 2009 21:43:33 +0000 (23:43 +0200)
committerChristian Dywan <christian@twotoasts.de>
Tue, 6 Oct 2009 23:50:10 +0000 (01:50 +0200)
midori/midori-locationaction.c
midori/sokoke.c
tests/magic-uri.c

index 1c7c9a15fe38acb71ecee7491c94e49e54571c0f..568479fd448a27c702c3572d1aafd4e338874564 100644 (file)
@@ -635,7 +635,6 @@ midori_location_entry_render_text_cb (GtkCellLayout*   layout,
                                       GtkTreeIter*     iter,
                                       gpointer         data)
 {
-    gchar* uri_raw;
     gchar* uri;
     gchar* title;
     gchar* desc;
@@ -649,14 +648,7 @@ midori_location_entry_render_text_cb (GtkCellLayout*   layout,
     gchar** parts;
     size_t len;
 
-    gtk_tree_model_get (model, iter, URI_COL, &uri_raw, TITLE_COL, &title, -1);
-
-    #if GLIB_CHECK_VERSION (2, 22, 0)
-    uri = g_hostname_to_unicode (uri_raw);
-    g_free (uri_raw);
-    #else
-    uri = uri_raw;
-    #endif
+    gtk_tree_model_get (model, iter, URI_COL, &uri, TITLE_COL, &title, -1);
 
     desc = desc_uri = desc_title = key = NULL;
     if (G_LIKELY (data))
index a1fa336fe4c26f2c7102fd4808b85d52e638886a..2a9d966b86cf7dfe1d99360df990bb468ae90592 100644 (file)
@@ -185,6 +185,59 @@ sokoke_spawn_program (const gchar* command,
     return TRUE;
 }
 
+#if defined (HAVE_LIBSOUP_2_27_90) || HAVE_LIBIDN
+/**
+ * sokoke_hostname_from_uri:
+ * @uri: an URI string
+ * @path: location of a string pointer
+ *
+ * Returns the hostname of the specified URI,
+ * and stores the path in @path.
+ * @path is at least set to ""
+ *
+ * Return value: a newly allocated hostname
+ **/
+static gchar*
+sokoke_hostname_from_uri (const gchar* uri,
+                          gchar**      path)
+{
+    gchar* hostname;
+
+    *path = "";
+    if ((hostname = g_utf8_strchr (uri, -1, '/')))
+    {
+        if (hostname[1] == '/')
+            hostname += 2;
+        if ((*path = g_utf8_strchr (hostname, -1, '/')))
+        {
+            gulong offset = g_utf8_pointer_to_offset (hostname, *path);
+            gchar* buffer = g_malloc0 (offset + 1);
+            g_utf8_strncpy (buffer, hostname, offset);
+            hostname = buffer;
+        }
+        else
+            hostname = g_strdup (hostname);
+    }
+    else
+        hostname = g_strdup (uri);
+    return hostname;
+}
+#endif
+
+/**
+ * sokoke_idn_to_punycode:
+ * @uri: an URI string
+ *
+ * The specified URI is parsed and the hostname
+ * part of it is encoded if it is not ASCII.
+ *
+ * If libIDN is not available at compile time,
+ * this code will pass the string unaltered.
+ *
+ * The called function owns the passed string.
+ *
+ * Return value: a newly allocated ASCII URI
+ **/
 gchar*
 sokoke_idn_to_punycode (gchar* uri)
 {
@@ -212,23 +265,7 @@ sokoke_idn_to_punycode (gchar* uri)
         proto = buffer;
     }
 
-    path = NULL;
-    if ((hostname = g_utf8_strchr (uri, -1, '/')))
-    {
-        if (hostname[1] == '/')
-            hostname += 2;
-        if ((path = g_utf8_strchr (hostname, -1, '/')))
-        {
-            gulong offset = g_utf8_pointer_to_offset (hostname, path);
-            gchar* buffer = g_malloc0 (offset + 1);
-            g_utf8_strncpy (buffer, hostname, offset);
-            hostname = buffer;
-        }
-        else
-            hostname = g_strdup (hostname);
-    }
-    else
-        hostname = g_strdup (uri);
+    hostname = sokoke_hostname_from_uri (uri, &path);
 
     if (!(q = stringprep_utf8_to_ucs4 (hostname, -1, NULL)))
     {
@@ -294,6 +331,16 @@ gchar* sokoke_search_uri (const gchar* uri,
     return search;
 }
 
+/**
+ * sokoke_magic_uri:
+ * @uri: a string typed by a user
+ * @search_engines: search engines
+ *
+ * Takes a string that was typed by a user,
+ * guesses what it is, and returns an URI.
+ *
+ * Return value: a newly allocated URI
+ **/
 gchar*
 sokoke_magic_uri (const gchar* uri,
                   KatzeArray*  search_engines)
@@ -358,6 +405,7 @@ sokoke_magic_uri (const gchar* uri,
     return search;
 }
 
+
 /**
  * sokoke_format_uri_for_display:
  * @uri: an URI string
@@ -374,12 +422,19 @@ sokoke_format_uri_for_display (const gchar* uri)
     {
         gchar* unescaped = g_uri_unescape_string (uri, NULL);
         #ifdef HAVE_LIBSOUP_2_27_90
-        gchar* decoded = g_hostname_to_unicode (unescaped);
+        gchar* path;
+        gchar* hostname = sokoke_hostname_from_uri (unescaped, &path);
+        gchar* decoded = g_hostname_to_unicode (hostname);
+
         if (decoded)
         {
+            gchar* result = g_strconcat ("http://", decoded, path, NULL);
             g_free (unescaped);
-            return decoded;
+            g_free (decoded);
+            g_free (hostname);
+            return result;
         }
+        g_free (hostname);
         return unescaped;
         #elif HAVE_LIBIDN
         gchar* decoded;
index 38295f8b27c7d9427f1a37db71277eac669b55b7..bf5bcb7eb9e6dd583112d7f1a59a85fa5fc5513e 100644 (file)
 
 #define SM "http://www.searchmash.com/search/"
 
+static void
+sokoke_assert_str_equal (const gchar* input,
+                         const gchar* result,
+                         const gchar* expected)
+{
+    if (g_strcmp0 (result, expected))
+    {
+        g_error ("Input: %s\nExpected: %s\nResult: %s",
+                 input ? input : "NULL",
+                 expected ? expected : "NULL",
+                 result ? result : "NULL");
+    }
+}
+
 static void
 test_input (const gchar* input,
             const gchar* expected)
@@ -41,13 +55,7 @@ test_input (const gchar* input,
     }
 
     gchar* uri = sokoke_magic_uri (input, search_engines);
-    if (g_strcmp0 (uri, expected))
-    {
-        g_error ("Input: %s\nExpected: %s\nResult: %s",
-                 input ? input : "NULL",
-                 expected ? expected : "NULL",
-                 uri ? uri : "NULL");
-    }
+    sokoke_assert_str_equal (input, uri, expected);
     g_free (uri);
 }
 
@@ -167,6 +175,35 @@ magic_uri_performance (void)
     g_print ("\nTime needed for URI tests: %f ", g_test_timer_elapsed ());
 }
 
+static void
+magic_uri_format (void)
+{
+    typedef struct
+    {
+        const gchar* before;
+        const gchar* after;
+    } URIItem;
+
+    static const URIItem items[] = {
+     { "http://www.csszengarden.com", NULL },
+     { "http://live.gnome.org/GTK+/3.0/Tasks", NULL },
+     { "http://www.johannkönig.com/index.php?ausw=home", NULL },
+     { "http://digilife.bz/wiki/index.php?Python%E3%81%AE%E9%96%8B%E7%99%BA%E6%89%8B%E9%A0%86",
+       "http://digilife.bz/wiki/index.php?Pythonの開発手順" },
+     { "http://die-welt.net/~evgeni/LenovoBatteryLinux/", NULL },
+     { "http://wiki.c3sl.ufpr.br/multiseat/index.php/Xephyr_Solution", NULL },
+     };
+    guint i;
+
+    for (i = 0; i < G_N_ELEMENTS (items); i++)
+    {
+        gchar* result = sokoke_format_uri_for_display (items[i].before);
+        const gchar* after = items[i].after ? items[i].after : items[i].before;
+        sokoke_assert_str_equal (items[i].before, result, after);
+        g_free (result);
+    }
+}
+
 int
 main (int    argc,
       char** argv)
@@ -179,6 +216,7 @@ main (int    argc,
     g_test_add_func ("/magic-uri/search", magic_uri_search);
     g_test_add_func ("/magic-uri/pseudo", magic_uri_pseudo);
     g_test_add_func ("/magic-uri/performance", magic_uri_performance);
+    g_test_add_func ("/magic-uri/format", magic_uri_format);
 
     return g_test_run ();
 }