Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
1 files changed, 60 insertions, 0 deletions
-rw-r--r--badwolf.c60
diff --git a/badwolf.c b/badwolf.c
index c29e797..88aace4 100644
--- a/badwolf.c
+++ b/badwolf.c
@@ -74,6 +74,12 @@ static gboolean WebViewCb_decide_policy(WebKitWebView *web_view,
WebKitPolicyDecision *decision,
WebKitPolicyDecisionType decision_type,
gpointer user_data);
+static void web_contentCb_download_started(WebKitWebContext *context,
+ WebKitDownload *download,
+ gpointer user_data);
+static gboolean downloadCb_decide_destination(WebKitDownload *download,
+ gchar *suggested_filename,
+ gpointer user_data);
static gboolean locationCb_activate(GtkEntry *location, gpointer user_data);
static gboolean javascriptCb_toggled(GtkButton *javascript, gpointer user_data);
static gboolean SearchEntryCb_next__match(GtkSearchEntry *search, gpointer user_data);
@@ -497,6 +503,54 @@ WebViewCb_decide_policy(WebKitWebView *web_view,
return TRUE;
}
+static void
+web_contentCb_download_started(WebKitWebContext *context,
+ WebKitDownload *download,
+ gpointer user_data)
+{
+ (void)context;
+
+ g_signal_connect(G_OBJECT(download),
+ "decide-destination",
+ G_CALLBACK(downloadCb_decide_destination),
+ user_data);
+}
+
+static gboolean
+downloadCb_decide_destination(WebKitDownload *download,
+ gchar *suggested_filename,
+ gpointer user_data)
+{
+ struct Client *browser = (struct Client *)user_data;
+ gint chooser_response;
+ GtkWindow *parent_window = GTK_WINDOW(browser->window->main_window);
+
+ GtkWidget *file_dialog = gtk_file_chooser_dialog_new(NULL,
+ parent_window,
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ _("_Cancel"),
+ GTK_RESPONSE_CANCEL,
+ _("_Open"),
+ GTK_RESPONSE_ACCEPT,
+ NULL);
+ GtkFileChooser *file_chooser = GTK_FILE_CHOOSER(file_dialog);
+
+ gtk_file_chooser_set_current_name(file_chooser, suggested_filename);
+ gtk_file_chooser_set_do_overwrite_confirmation(file_chooser, TRUE);
+ webkit_download_set_allow_overwrite(download, TRUE);
+
+ chooser_response = gtk_dialog_run(GTK_DIALOG(file_dialog));
+
+ if(chooser_response == GTK_RESPONSE_ACCEPT)
+ webkit_download_set_destination(download, gtk_file_chooser_get_uri(file_chooser));
+ else
+ webkit_download_cancel(download);
+
+ gtk_widget_destroy(file_dialog);
+
+ return TRUE; /* Stop other handlers */
+}
+
static gboolean
locationCb_activate(GtkEntry *location, gpointer user_data)
{
@@ -681,6 +735,12 @@ new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web
browser->webView, "permission-request", G_CALLBACK(WebViewCb_permission_request), NULL);
g_signal_connect(browser->webView, "decide-policy", G_CALLBACK(WebViewCb_decide_policy), NULL);
+ /* signals for WebView's WebContext */
+ g_signal_connect(G_OBJECT(web_context),
+ "download-started",
+ G_CALLBACK(web_contentCb_download_started),
+ browser);
+
/* signals for search widget */
g_signal_connect(browser->search, "next-match", G_CALLBACK(SearchEntryCb_next__match), browser);
g_signal_connect(