[Xfce4-commits] <midori:master> Make download dialog work and allow files to load
Christian Dywan
noreply at xfce.org
Sat Apr 6 23:14:05 CEST 2013
Updating branch refs/heads/master
to e97a57fbbbd7705e9e54bd1ed1cdf019b5034b13 (commit)
from 1f430e6eaa48832f384d6076b2c00f94e528cce9 (commit)
commit e97a57fbbbd7705e9e54bd1ed1cdf019b5034b13
Author: Christian Dywan <christian at 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)
More information about the Xfce4-commits
mailing list