diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2012-06-22 17:03:36 +0800 |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@gnome.org> | 2012-06-27 20:16:00 +0800 |
commit | 7e1964acdacd4bdf4e23e85ec733fe9e92688ca6 (patch) | |
tree | 6acf7bf26c7b8ddf0e4a5161122fccc3c2cd46c2 /embed | |
parent | 39931fc51a3a668d04f938fa555bdf9a4abf3056 (diff) | |
download | gsoc2013-epiphany-7e1964acdacd4bdf4e23e85ec733fe9e92688ca6.tar.gz gsoc2013-epiphany-7e1964acdacd4bdf4e23e85ec733fe9e92688ca6.tar.zst gsoc2013-epiphany-7e1964acdacd4bdf4e23e85ec733fe9e92688ca6.zip |
Port downloads to WebKit2
https://bugzilla.gnome.org/show_bug.cgi?id=678612
Diffstat (limited to 'embed')
-rw-r--r-- | embed/ephy-download.c | 186 | ||||
-rw-r--r-- | embed/ephy-embed.c | 4 | ||||
-rw-r--r-- | embed/ephy-web-view.c | 34 |
3 files changed, 161 insertions, 63 deletions
diff --git a/embed/ephy-download.c b/embed/ephy-download.c index dcea8edda..158702bc3 100644 --- a/embed/ephy-download.c +++ b/embed/ephy-download.c @@ -153,49 +153,55 @@ char * ephy_download_get_content_type (EphyDownload *download) { #ifdef HAVE_WEBKIT2 - /* TODO: Downloads */ - return NULL; + WebKitURIResponse *response; #else WebKitNetworkResponse *response; SoupMessage *message; +#endif char *content_type = NULL; - - GFile *destination; - GFileInfo *info; GError *error = NULL; - destination = g_file_new_for_uri (download->priv->destination); - info = g_file_query_info (destination, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, - G_FILE_QUERY_INFO_NONE, NULL, &error); - - if (error) { - LOG ("ephy_download_get_content_type: error getting file " - "content-type: %s", error->message); - g_error_free (error); + if (download->priv->destination) { + GFile *destination; + GFileInfo *info; + + destination = g_file_new_for_uri (download->priv->destination); + info = g_file_query_info (destination, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + G_FILE_QUERY_INFO_NONE, NULL, &error); + if (info) { + content_type = g_strdup (g_file_info_get_content_type (info)); + LOG ("ephy_download_get_content_type: GIO: %s", content_type); + g_object_unref (info); + } else { + LOG ("ephy_download_get_content_type: error getting file " + "content-type: %s", error->message); + g_error_free (error); + } - /* Fallback to Soup */ - response = webkit_download_get_network_response (download->priv->download); - message = webkit_network_response_get_message (response); + g_object_unref (destination); + } - if (message != NULL) - content_type = g_strdup (soup_message_headers_get_content_type (message->response_headers, NULL)); + if (content_type) + return content_type; - LOG ("ephy_download_get_content_type: Soup: %s", content_type); - } else { - content_type = g_strdup (g_file_info_get_content_type (info)); - LOG ("ephy_download_get_content_type: GIO: %s", content_type); - } + /* Fallback to Soup */ +#ifdef HAVE_WEBKIT2 + response = webkit_download_get_response (download->priv->download); + if (response) + content_type = g_strdup (webkit_uri_response_get_mime_type (response)); +#else + response = webkit_download_get_network_response (download->priv->download); + message = webkit_network_response_get_message (response); - if (info) - g_object_unref (info); + if (message != NULL) + content_type = g_strdup (soup_message_headers_get_content_type (message->response_headers, NULL)); +#endif - if (destination) - g_object_unref (destination); + LOG ("ephy_download_get_content_type: Soup: %s", content_type); LOG ("ephy_download_get_content_type: %s", content_type); return content_type; -#endif } @@ -371,9 +377,7 @@ ephy_download_set_destination_uri (EphyDownload *download, priv->destination = g_strdup (destination); -#ifdef HAVE_WEBKIT2 - /* TODO: Downloads */ -#else +#ifndef HAVE_WEBKIT2 webkit_download_set_destination_uri (priv->download, priv->destination); #endif g_object_notify (G_OBJECT (download), "destination"); @@ -606,9 +610,7 @@ ephy_download_start (EphyDownload *download) if (priv->destination == NULL) ephy_download_set_auto_destination (download); -#ifdef HAVE_WEBKIT2 - /* TODO: Downloads */ -#else +#ifndef HAVE_WEBKIT2 webkit_download_start (priv->download); #endif } @@ -647,12 +649,14 @@ ephy_download_do_download_action (EphyDownload *download, const char *destination_uri; EphyDownloadPrivate *priv; gboolean ret = FALSE; -#ifdef HAVE_WEBKIT2 - /* TODO: Downloads */ -#else + priv = download->priv; +#ifdef HAVE_WEBKIT2 + destination_uri = webkit_download_get_destination (priv->download); +#else destination_uri = webkit_download_get_destination_uri (priv->download); +#endif destination = g_file_new_for_uri (destination_uri); switch ((action ? action : priv->action)) { @@ -682,7 +686,7 @@ ephy_download_do_download_action (EphyDownload *download, break; } g_object_unref (destination); -#endif + return ret; } @@ -901,7 +905,58 @@ ephy_download_init (EphyDownload *download) } #ifdef HAVE_WEBKIT2 -/* TODO: Downloads */ +static gboolean +download_decide_destination_cb (WebKitDownload *wk_download, + const gchar *suggested_filename, + EphyDownload *download) +{ + char *dest; + + if (download->priv->destination) { + webkit_download_set_destination (wk_download, download->priv->destination); + return TRUE; + } + + dest = define_destination_uri (download, suggested_filename); + if (!dest) + return FALSE; + + ephy_download_set_destination_uri (download, dest); + webkit_download_set_destination (wk_download, dest); + g_free (dest); + + return TRUE; +} + +static void +download_created_destination_cb (WebKitDownload *wk_download, + const gchar *destination, + EphyDownload *download) +{ + if (download->priv->destination) + return; + + ephy_download_set_destination_uri (download, destination); +} + +static void +download_finished_cb (WebKitDownload *wk_download, + EphyDownload *download) +{ + EphyDownloadPrivate *priv; + + priv = download->priv; + + g_signal_emit_by_name (download, "completed"); + + if (g_settings_get_boolean (EPHY_SETTINGS_MAIN, EPHY_PREFS_AUTO_DOWNLOADS) && + priv->action == EPHY_DOWNLOAD_ACTION_NONE) + ephy_download_do_download_action (download, EPHY_DOWNLOAD_ACTION_AUTO); + else + ephy_download_do_download_action (download, priv->action); + + ephy_embed_shell_remove_download (embed_shell, download); +} #else static void download_status_changed_cb (GObject *object, @@ -932,7 +987,22 @@ download_status_changed_cb (GObject *object, ephy_embed_shell_add_download (embed_shell, download); } } +#endif + +#ifdef HAVE_WEBKIT2 +static void +download_failed_cb (WebKitDownload *wk_download, + GError *error, + EphyDownload *download) +{ + gboolean ret = FALSE; + + g_signal_handlers_disconnect_by_func (wk_download, download_finished_cb, download); + LOG ("error (%d - %d)! %s", error->code, 0, error->message); + g_signal_emit_by_name (download, "error", 0, error->code, error->message, &ret); +} +#else static gboolean download_error_cb (WebKitDownload *download, gint error_code, @@ -980,10 +1050,27 @@ EphyDownload * ephy_download_new_for_download (WebKitDownload *download) { EphyDownload *ephy_download; +#ifdef HAVE_WEBKIT2 + WebKitURIRequest *request; +#endif + + g_return_val_if_fail (WEBKIT_IS_DOWNLOAD (download), NULL); + ephy_download = ephy_download_new (); #ifdef HAVE_WEBKIT2 - /* TODO: Downloads */ + g_signal_connect (download, "decide-destination", + G_CALLBACK (download_decide_destination_cb), + ephy_download); + g_signal_connect (download, "created-destination", + G_CALLBACK (download_created_destination_cb), + ephy_download); + g_signal_connect (download, "finished", + G_CALLBACK (download_finished_cb), + ephy_download); + g_signal_connect (download, "failed", + G_CALLBACK (download_failed_cb), + ephy_download); #else g_signal_connect (download, "notify::status", G_CALLBACK (download_status_changed_cb), @@ -991,11 +1078,21 @@ ephy_download_new_for_download (WebKitDownload *download) g_signal_connect (download, "error", G_CALLBACK (download_error_cb), ephy_download); +#endif ephy_download->priv->download = g_object_ref (download); +#ifdef HAVE_WEBKIT2 + request = webkit_download_get_request (download); + ephy_download->priv->source = g_strdup (webkit_uri_request_get_uri (request)); +#else ephy_download->priv->source = g_strdup (webkit_download_get_uri (download)); #endif +#ifdef HAVE_WEBKIT2 + /* In WebKit2 the download has already started */ + ephy_embed_shell_add_download (embed_shell, ephy_download); +#endif + return ephy_download; } @@ -1012,14 +1109,15 @@ ephy_download_new_for_uri (const char *uri) { EphyDownload *ephy_download; WebKitDownload *download; -#ifdef HAVE_WEBKIT2 - /* TODO: Downloads */ - download = NULL; -#else +#ifndef HAVE_WEBKIT2 WebKitNetworkRequest *request; +#endif g_return_val_if_fail (uri != NULL, NULL); +#ifdef HAVE_WEBKIT2 + download = webkit_web_context_download_uri (webkit_web_context_get_default (), uri); +#else request = webkit_network_request_new (uri); download = webkit_download_new (request); diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c index 8c0fa5363..9a820decf 100644 --- a/embed/ephy-embed.c +++ b/embed/ephy-embed.c @@ -551,9 +551,7 @@ ephy_embed_auto_download_url (EphyEmbed *embed, const char *url) ephy_download_set_action (download, EPHY_DOWNLOAD_ACTION_OPEN); } -#ifdef HAVE_WEBKIT2 -/* TODO: Downloads */ -#else +#ifndef HAVE_WEBKIT2 static gboolean download_requested_cb (WebKitWebView *web_view, WebKitDownload *download, diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c index 83a89bf94..2a21b0b70 100644 --- a/embed/ephy-web-view.c +++ b/embed/ephy-web-view.c @@ -1689,8 +1689,12 @@ decide_policy_cb (WebKitWebView *web_view, { WebKitResponsePolicyDecision *response_decision; WebKitURIResponse *response; + WebKitURIRequest *request; EphyWebViewDocumentType type; + GObject *single; const char *mime_type; + const char *uri; + gboolean handled = FALSE; if (decision_type != WEBKIT_POLICY_DECISION_TYPE_RESPONSE) return FALSE; @@ -1716,27 +1720,25 @@ decide_policy_cb (WebKitWebView *web_view, g_object_notify (G_OBJECT (web_view), "document-type"); } + /* If WebKit can't handle the mime type start the download + process */ + if (webkit_web_view_can_show_mime_type (web_view, mime_type)) + return FALSE; + /* TODO: Check also Content-Disposition header before emitting * handle-content signal. We need API for that in WebKit2. */ - if (!webkit_web_view_can_show_mime_type (web_view, mime_type)) { - GObject *single; - WebKitURIRequest *request; - const char *uri; - gboolean handled = FALSE; + single = ephy_embed_shell_get_embed_single (embed_shell); + request = webkit_response_policy_decision_get_request (response_decision); + uri = webkit_uri_request_get_uri (request); + g_signal_emit_by_name (single, "handle-content", mime_type, uri, &handled); - single = ephy_embed_shell_get_embed_single (embed_shell); - request = webkit_response_policy_decision_get_request (response_decision); - g_signal_emit_by_name (single, "handle-content", mime_type, uri, &handled); - - if (handled) { - webkit_policy_decision_ignore (decision); - - return TRUE; - } - } + if (handled) + webkit_policy_decision_ignore (decision); + else + webkit_policy_decision_download (decision); - return FALSE; + return TRUE; } #else static gboolean |