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