]> spindle.queued.net Git - midori/commitdiff
Implement and use sokoke_recursive_fork_protection
authorAndré Stösel <Midori-Plugin@PyIT.de>
Fri, 12 Mar 2010 22:25:09 +0000 (23:25 +0100)
committerChristian Dywan <christian@twotoasts.de>
Fri, 12 Mar 2010 22:31:14 +0000 (23:31 +0100)
As Midori may call external tools to open URIs it cannot handle,
and at the same time Midori is commonly the default browser,
this can end in recursion when the external tool also calls Midori.

See the description of sokoke_recursive_fork_protection().

midori/midori-app.c
midori/sokoke.c
midori/sokoke.h

index d8cb2d9f4f605c73251ebc906c618ab8facfeccc..52716ee71833f5f35ac53abf57f2e6219e3e4a11 100644 (file)
@@ -470,14 +470,17 @@ midori_app_command_received (MidoriApp*   app,
                 gchar* fixed_uri = sokoke_magic_uri (*uris);
                 if (!fixed_uri)
                     fixed_uri = g_strdup (*uris);
-                if (first)
+                if (sokoke_recursive_fork_protection (fixed_uri, FALSE))
                 {
-                    midori_browser_set_current_uri (browser, fixed_uri);
-                    first = FALSE;
+                    if (first)
+                    {
+                        midori_browser_set_current_uri (browser, fixed_uri);
+                        first = FALSE;
+                    }
+                    else
+                        midori_browser_set_current_page (browser,
+                            midori_browser_add_uri (browser, fixed_uri));
                 }
-                else
-                    midori_browser_set_current_page (browser,
-                        midori_browser_add_uri (browser, fixed_uri));
                 g_free (fixed_uri);
                 uris++;
             }
index 657ba9a3a26554de47d5cf7d9977dc001e941fd8..a26078a644374e75c8527c0a375044fdb66d1914 100644 (file)
@@ -273,6 +273,7 @@ sokoke_show_uri (GdkScreen*   screen,
                  guint32      timestamp,
                  GError**     error)
 {
+
     #if HAVE_HILDON
     HildonURIAction* action = hildon_uri_get_default_action_by_uri (uri, NULL);
     return hildon_uri_open (uri, action, error);
@@ -352,6 +353,8 @@ sokoke_show_uri (GdkScreen*   screen,
     g_return_val_if_fail (uri != NULL, FALSE);
     g_return_val_if_fail (!error || !*error, FALSE);
 
+    sokoke_recursive_fork_protection (uri, TRUE);
+
     #if GTK_CHECK_VERSION (2, 14, 0)
     if (gtk_show_uri (screen, uri, timestamp, error))
         return TRUE;
@@ -1740,6 +1743,36 @@ sokoke_prefetch_uri (const char* uri)
     return TRUE;
 }
 
+/**
+ * sokoke_recursive_fork_protection
+ * @uri: the URI to check
+ * @set_uri: if TRUE the URI will be saved
+ *
+ * Protects against recursive invokations of the Midori executable
+ * with the same URI.
+ *
+ * As an example, consider having an URI starting with 'tel://'. You
+ * could attempt to open it with sokoke_show_uri. In turn, 'exo-open'
+ * might be called. Now quite possibly 'exo-open' is unable to handle
+ * 'tel://' and might well fall back to 'midori' as default browser.
+ *
+ * To protect against this scenario, call this function with the
+ * URI and %TRUE before calling any external tool.
+ * #MidoriApp calls sokoke_recursive_fork_protection() with %FALSE
+ * and bails out if %FALSE is returned.
+ *
+ * Return value: %TRUE if @uri is new, %FALSE on recursion
+ **/
+gboolean
+sokoke_recursive_fork_protection (const gchar* uri,
+                                  gboolean     set_uri)
+{
+    static gchar* fork_uri = NULL;
+    if (set_uri)
+        katze_assign (fork_uri, g_strdup (uri));
+    return g_strcmp0 (fork_uri, uri) == 0 ? FALSE : TRUE;
+}
+
 /* Provide a new way for SoupSession to assume an 'Accept-Language'
    string automatically from the return value of g_get_language_names(),
    properly formatted according to RFC2616.
index 7d46de24679a7a56ca0bdf90f24f8758a746176b..927cfee9d9575ee6be510489e90291fd6ed2e8ca 100644 (file)
@@ -226,4 +226,8 @@ sokoke_prefetch_uri                     (const char* uri);
 gchar *
 sokoke_accept_languages                 (const gchar* const * lang_names);
 
+gboolean
+sokoke_recursive_fork_protection        (const gchar*         uri,
+                                         gboolean             set_uri);
+
 #endif /* !__SOKOKE_H__ */