Updating branch refs/heads/master
         to e97a57fbbbd7705e9e54bd1ed1cdf019b5034b13 (commit)
       from 1f430e6eaa48832f384d6076b2c00f94e528cce9 (commit)

commit e97a57fbbbd7705e9e54bd1ed1cdf019b5034b13
Author: Christian Dywan <christ...@twotoasts.de>
Date:   Sat Apr 6 23:09:53 2013 +0200

    Make download dialog work and allow files to load

 midori/midori-browser.c |   63 ++++++++++++++++++++++++++-----------
 midori/midori-view.c    |   78 ++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 107 insertions(+), 34 deletions(-)

diff --git a/midori/midori-browser.c b/midori/midori-browser.c
index 33a147b..367a25f 100644
--- a/midori/midori-browser.c
+++ b/midori/midori-browser.c
@@ -1437,15 +1437,26 @@ midori_browser_download_status_cb (WebKitDownload*  
download,
 #endif
 }
 
+#ifdef HAVE_WEBKIT2
+static void
+midori_browser_close_tab_idle (GObject*      resource,
+                               GAsyncResult* result,
+                               gpointer      view)
+{
+    guchar* data = webkit_web_resource_get_data_finish (WEBKIT_WEB_RESOURCE 
(resource),
+        result, NULL, NULL);
+    if (data != NULL)
+        return;
+#else
 static gboolean
 midori_browser_close_tab_idle (gpointer view)
 {
-    MidoriBrowser* browser;
-
-    g_return_val_if_fail (GTK_IS_WIDGET (view), FALSE);
-    browser = midori_browser_get_for_widget (GTK_WIDGET (view));
+#endif
+    MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view));
     midori_browser_close_tab (browser, GTK_WIDGET (view));
+#ifndef HAVE_WEBKIT2
     return G_SOURCE_REMOVE;
+#endif
 }
 
 static gboolean
@@ -1453,15 +1464,10 @@ midori_view_download_requested_cb (GtkWidget*      view,
                                    WebKitDownload* download,
                                    MidoriBrowser*  browser)
 {
-#ifndef HAVE_WEBKIT2
     MidoriDownloadType type = midori_download_get_type (download);
-    GtkWidget* web_view;
-    WebKitWebFrame* web_frame;
-    WebKitWebDataSource* datasource;
-    gboolean handled;
+    gboolean handled = TRUE;
 
     g_return_val_if_fail (MIDORI_IS_VIEW (view), FALSE);
-    handled = TRUE;
     if (type == MIDORI_DOWNLOAD_CANCEL)
     {
         handled = FALSE;
@@ -1474,9 +1480,15 @@ midori_view_download_requested_cb (GtkWidget*      view,
         g_signal_connect (download, "notify::status",
             G_CALLBACK (midori_browser_download_status_cb), GTK_WIDGET 
(browser));
         g_free (destination_uri);
+        #ifndef HAVE_WEBKIT2
         webkit_download_start (download);
+        #endif
     }
+    #ifdef HAVE_WEBKIT2
+    else if (!webkit_download_get_destination (download))
+    #else
     else if (!webkit_download_get_destination_uri (download))
+    #endif
     {
         if (type == MIDORI_DOWNLOAD_SAVE_AS)
         {
@@ -1485,13 +1497,19 @@ midori_view_download_requested_cb (GtkWidget*      view,
 
             if (!dialog)
             {
+                #ifdef HAVE_WEBKIT2
+                const gchar* download_uri = webkit_uri_response_get_uri (
+                    webkit_download_get_response (download));
+                #else
+                const gchar* download_uri = webkit_download_get_uri (download);
+                #endif
                 gchar* folder;
                 dialog = (GtkWidget*)midori_file_chooser_dialog_new (_("Save 
file"),
                     GTK_WINDOW (browser), GTK_FILE_CHOOSER_ACTION_SAVE);
                 gtk_file_chooser_set_do_overwrite_confirmation (
                     GTK_FILE_CHOOSER (dialog), TRUE);
                 gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
-                folder = midori_uri_get_folder (webkit_download_get_uri 
(download));
+                folder = midori_uri_get_folder (download_uri);
                 if (folder == NULL)
                     folder = katze_object_get_string (browser->settings, 
"download-folder");
                 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER 
(dialog), folder);
@@ -1530,19 +1548,26 @@ midori_view_download_requested_cb (GtkWidget*      view,
             midori_browser_prepare_download (browser, download, 
destination_uri);
             g_free (destination_uri);
         }
+        #ifndef HAVE_WEBKIT2
         webkit_download_start (download);
+        #endif
     }
 
     /* Close empty tabs due to download links with a target */
-    web_view = midori_view_get_web_view (MIDORI_VIEW (view));
-    web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (web_view));
-    datasource = webkit_web_frame_get_data_source (web_frame);
-    if (midori_view_is_blank (MIDORI_VIEW (view)) && 
webkit_web_data_source_get_data (datasource) == NULL)
-        g_idle_add (midori_browser_close_tab_idle, view);
+    if (midori_view_is_blank (MIDORI_VIEW (view)))
+    {
+        GtkWidget* web_view = midori_view_get_web_view (MIDORI_VIEW (view));
+        #ifdef HAVE_WEBKIT2
+        WebKitWebResource* resource = webkit_web_view_get_main_resource 
(WEBKIT_WEB_VIEW (web_view));
+        webkit_web_resource_get_data (resource, NULL, 
midori_browser_close_tab_idle, view);
+        #else
+        WebKitWebFrame* web_frame = webkit_web_view_get_main_frame 
(WEBKIT_WEB_VIEW (web_view));
+        WebKitWebDataSource* datasource = webkit_web_frame_get_data_source 
(web_frame);
+        if (webkit_web_data_source_get_data (datasource) == NULL)
+            g_idle_add (midori_browser_close_tab_idle, view);
+        #endif
+    }
     return handled;
-#else
-    return FALSE;
-#endif
 }
 
 static void
diff --git a/midori/midori-view.c b/midori/midori-view.c
index 2ebffc4..56e5e58 100644
--- a/midori/midori-view.c
+++ b/midori/midori-view.c
@@ -75,6 +75,11 @@ _midori_view_set_settings (MidoriView*        view,
 static void
 midori_view_uri_scheme_res (WebKitURISchemeRequest* request,
                             gpointer                user_data);
+
+static void
+midori_view_download_requested_cb (WebKitWebContext* context,
+                                   WebKitDownload*   download,
+                                   gpointer          user_data);
 #endif
 
 static gboolean
@@ -393,6 +398,8 @@ midori_view_class_init (MidoriViewClass* class)
         "res", midori_view_uri_scheme_res, NULL, NULL);
     webkit_web_context_register_uri_scheme (context,
         "stock", midori_view_uri_scheme_res, NULL, NULL);
+    g_signal_connect (context, "download-started",
+        (GCallback)midori_view_download_requested_cb, NULL);
     #endif
 }
 
@@ -760,6 +767,20 @@ midori_view_web_view_navigation_decision_cb 
(WebKitWebView*             web_view
                                              MidoriView*                view)
 {
     #ifdef HAVE_WEBKIT2
+    if (decision_type == WEBKIT_POLICY_DECISION_TYPE_RESPONSE)
+    {
+        WebKitURIResponse* response = 
webkit_response_policy_decision_get_response (
+            WEBKIT_RESPONSE_POLICY_DECISION (decision));
+        const gchar* mime_type = webkit_uri_response_get_mime_type (response);
+        midori_tab_set_mime_type (MIDORI_TAB (view), mime_type);
+        katze_item_set_meta_string (view->item, "mime-type", mime_type);
+        if (!webkit_web_view_can_show_mime_type (web_view, mime_type))
+        {
+            webkit_policy_decision_download (decision);
+            return TRUE;
+        }
+    }
+
     void* request = NULL;
     const gchar* uri = webkit_web_view_get_uri (web_view);
     #else
@@ -2235,14 +2256,16 @@ midori_view_download_uri (MidoriView*        view,
                           MidoriDownloadType type,
                           const gchar*       uri)
 {
-#ifndef HAVE_WEBKIT2
+#ifdef HAVE_WEBKIT2
+    WebKitDownload* download = webkit_web_view_download_uri (WEBKIT_WEB_VIEW 
(view->web_view), uri);
+#else
     WebKitNetworkRequest* request = webkit_network_request_new (uri);
     WebKitDownload* download = webkit_download_new (request);
-    gboolean handled;
     g_object_unref (request);
+#endif
+    gboolean handled;
     midori_download_set_type (download, type);
     g_signal_emit (view, signals[DOWNLOAD_REQUESTED], 0, download, &handled);
-#endif
 }
 
 static void
@@ -3078,19 +3101,26 @@ webkit_web_view_mime_type_decision_cb (GtkWidget*       
        web_view,
 }
 #endif
 
+#ifdef HAVE_WEBKIT2
+static void
+midori_view_download_requested_cb (WebKitWebContext* context,
+                                   WebKitDownload*   download,
+                                   gpointer          user_data)
+{
+    WebKitWebView* web_view = webkit_download_get_web_view (download);
+    MidoriView* view = midori_view_get_for_widget (GTK_WIDGET (web_view));
+#else
 static gboolean
-webkit_web_view_download_requested_cb (GtkWidget*      web_view,
-                                       WebKitDownload* download,
-                                       MidoriView*     view)
+midori_view_download_requested_cb (GtkWidget*      web_view,
+                                   WebKitDownload* download,
+                                   MidoriView*     view)
 {
-#ifndef HAVE_WEBKIT2
+#endif
     gchar* opener_uri;
     gchar* hostname;
     GtkWidget* dialog;
     gchar* content_type;
     gchar* description;
-    WebKitWebFrame* web_frame;
-    WebKitWebDataSource* datasource;
     GString* details;
     GIcon* icon;
     GtkWidget* image;
@@ -3119,8 +3149,13 @@ webkit_web_view_download_requested_cb (GtkWidget*      
web_view,
     gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), image);
 
     details = g_string_sized_new (20 * 4);
+    #ifdef HAVE_WEBKIT2
+    g_string_append_printf (details, _("File Name: %s"),
+        webkit_uri_response_get_suggested_filename 
(webkit_download_get_response (download)));
+    #else
     g_string_append_printf (details, _("File Name: %s"),
         webkit_download_get_suggested_filename (download));
+    #endif
     g_string_append_c (details, '\n');
 
     if (g_strrstr (description, content_type))
@@ -3131,10 +3166,11 @@ webkit_web_view_download_requested_cb (GtkWidget*      
web_view,
     g_free (description);
     g_free (content_type);
 
+    #ifndef HAVE_WEBKIT2
     /* Link Fingerprint */
     /* We look at the original URI because redirection would lose the fragment 
*/
-    web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (web_view));
-    datasource = webkit_web_frame_get_provisional_data_source (web_frame);
+    WebKitWebFrame* web_frame = webkit_web_view_get_main_frame 
(WEBKIT_WEB_VIEW (web_view));
+    WebKitWebDataSource* datasource = 
webkit_web_frame_get_provisional_data_source (web_frame);
     if (datasource)
     {
         gchar* fingerprint;
@@ -3167,14 +3203,19 @@ webkit_web_view_download_requested_cb (GtkWidget*      
web_view,
         g_string_append_c (details, '\n');
         g_free (total);
     }
+    #endif
 
     gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
         "%s", details->str);
     g_string_free (details, TRUE);
 
     gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE);
+    #ifdef HAVE_WEBKIT2
     /* i18n: A file open dialog title, ie. "Open http://fila.com/manual.tgz"; */
+    title = g_strdup_printf (_("Open %s"), webkit_uri_request_get_uri 
(webkit_download_get_request (download)));
+    #else
     title = g_strdup_printf (_("Open %s"), webkit_download_get_uri (download));
+    #endif
     gtk_window_set_title (GTK_WINDOW (dialog), title);
     g_free (title);
     screen = gtk_widget_get_screen (dialog);
@@ -3199,10 +3240,17 @@ webkit_web_view_download_requested_cb (GtkWidget*      
web_view,
         response = MIDORI_DOWNLOAD_CANCEL;
     midori_download_set_type (download, response);
 
+    /* TODO
+    g_object_connect (download,
+        "signal::decide-destination", download_decide_destination_cb, view,
+        "signal::created-destination", download_created_destination_cb, view,
+        "signal::finished", download_finished_cb, view,
+        "signal::failed", download_failed_cb, view,
+        NULL);
+    */
     g_signal_emit (view, signals[DOWNLOAD_REQUESTED], 0, download, &handled);
+#ifndef HAVE_WEBKIT2
     return handled;
-#else
-    return FALSE;
 #endif
 }
 
@@ -3891,6 +3939,8 @@ midori_view_constructor (GType                  type,
                       #endif
                       "signal::hovering-over-link",
                       webkit_web_view_hovering_over_link_cb, view,
+                      "signal::download-requested",
+                      midori_view_download_requested_cb, view,
                       #endif
 
                       "signal::notify::uri",
@@ -3913,8 +3963,6 @@ midori_view_constructor (GType                  type,
                       webkit_web_view_populate_popup_cb, view,
                       "signal::console-message",
                       webkit_web_view_console_message_cb, view,
-                      "signal::download-requested",
-                      webkit_web_view_download_requested_cb, view,
                       NULL);
 
     if (view->settings)
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to