]> spindle.queued.net Git - midori/commitdiff
Work-around GLib/ libSoup source issue with downloads
authorChristian Dywan <christian@twotoasts.de>
Sun, 13 May 2012 00:19:18 +0000 (02:19 +0200)
committerChristian Dywan <christian@twotoasts.de>
Sun, 13 May 2012 00:22:39 +0000 (02:22 +0200)
Fixes: https://bugs.launchpad.net/midori/+bug/780133
midori/midori-view.c
wscript

index 8057316fc30af141118fd7dba74391b39cd3a608..d7d02332360a8f991ff7d8a82683e1cedfe68664 100644 (file)
@@ -2895,6 +2895,43 @@ webkit_web_view_mime_type_decision_cb (GtkWidget*               web_view,
     return TRUE;
 }
 
+#if HAVE_LIBSOUP_2_33_4 && !GLIB_CHECK_VERSION (2, 33, 1)
+#define WORKAROUND_GLIB_MAINLOOP_HANG
+#endif
+
+#ifdef WORKAROUND_GLIB_MAINLOOP_HANG
+
+#define GSOURCE_PREV(s) (s->prev)
+#define GSOURCE_NEXT(s) (s->next)
+
+static GSource*
+midori_workaround_g_source_unlink (GSource* source)
+{
+    GSource* prev = GSOURCE_PREV (source);
+    GSource* next = GSOURCE_NEXT (source);
+    if (next)
+        GSOURCE_NEXT (prev) = next;
+    if (prev)
+        GSOURCE_PREV (next) = prev;
+
+    return prev ? prev : next;
+}
+
+static GSource*
+midori_workaround_g_source_relink (GSource* source,
+                                   GSource* prev)
+{
+    GSource* next = GSOURCE_NEXT (prev);
+
+    GSOURCE_NEXT (source) = next;
+    GSOURCE_PREV (source) = prev;
+    GSOURCE_NEXT (prev) = source;
+    GSOURCE_PREV (next) = source;
+
+    return prev;
+}
+#endif
+
 static gboolean
 webkit_web_view_download_requested_cb (GtkWidget*      web_view,
                                        WebKitDownload* download,
@@ -2923,6 +2960,13 @@ webkit_web_view_download_requested_cb (GtkWidget*      web_view,
     GtkIconTheme* icon_theme;
     gint response;
     gboolean handled;
+    #ifdef WORKAROUND_GLIB_MAINLOOP_HANG
+    GSource* last;
+    GSource* source;
+    GSource* prev = NULL;
+    GSource** sources = NULL;
+    guint n_sources = 0, i;
+    #endif
 
     dialog = gtk_message_dialog_new (
         NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE,
@@ -2998,7 +3042,45 @@ webkit_web_view_download_requested_cb (GtkWidget*      web_view,
         GTK_STOCK_CANCEL, DOWNLOAD_CANCEL,
         GTK_STOCK_OPEN, DOWNLOAD_OPEN,
         NULL);
+
+    #ifdef WORKAROUND_GLIB_MAINLOOP_HANG
+    {
+        GSource* new_source = g_idle_source_new ();
+        g_source_attach (new_source, NULL);
+        last = GSOURCE_PREV (new_source);
+        g_source_destroy (new_source);
+    }
+
+    for (source = last; source; source = GSOURCE_PREV (source))
+    {
+        const char* name;
+        if (source && (name = g_source_get_name (source)))
+        {
+            if(!strcmp (name, "GPollableSource") || !strcmp (name, "GSocket"))
+            {
+                sources = realloc (sources, (++n_sources) * sizeof (GSource*));
+                sources[n_sources - 1] = source;
+            }
+        }
+    }
+    i = n_sources;
+    while (i > 0)
+    {
+        prev = midori_workaround_g_source_unlink (sources[--i]);
+    }
+    #endif
+
     response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+    #ifdef WORKAROUND_GLIB_MAINLOOP_HANG
+    i = n_sources;
+    while (i > 0)
+    {
+        prev = midori_workaround_g_source_relink (sources[--i], prev);
+    }
+    g_free (sources);
+    #endif
+
     gtk_widget_destroy (dialog);
     switch (response)
     {
diff --git a/wscript b/wscript
index c7a0c8732d6cdee39924f202dd8de49c7921453c..61a9bddec54898ca86ec580ae4e2f91b2a2fdaa0 100644 (file)
--- a/wscript
+++ b/wscript
@@ -263,6 +263,8 @@ def configure (conf):
         conf.define ('HAVE_LIBSOUP_2_29_3', 1)
     if check_version (conf.env['LIBSOUP_VERSION'], 2, 29, 91):
         conf.define ('HAVE_LIBSOUP_2_29_91', 1)
+    if check_version (conf.env['LIBSOUP_VERSION'], 2, 33, 4):
+        conf.define ('HAVE_LIBSOUP_2_33_4', 1)
     if check_version (conf.env['LIBSOUP_VERSION'], 2, 37, 1):
         conf.define ('HAVE_LIBSOUP_2_37_1', 1)
     check_pkg ('libxml-2.0', '2.6')