summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2012-08-16 10:46:42 +0200
committerCarlos Garcia Campos <carlosgc@gnome.org>2012-08-17 13:58:51 +0200
commitcf9c1a366b1424ee55e621302c5cba02803832a8 (patch)
treeb9ea2e48243f6e18728e43501f1027f24b522f5e
parent12b8cab14f3cb4c09e5ee8afb9b438113b5bd72e (diff)
downloadepiphany-cf9c1a366b1424ee55e621302c5cba02803832a8.tar.gz
Port save as to WebKit2
Use webkit_web_view_save() API for HTML pages that saves the web page into a MHTML file. For any other MIME types supported by the web view, save the main resource data to a file. https://bugzilla.gnome.org/show_bug.cgi?id=679368
-rw-r--r--embed/ephy-web-view.c73
-rw-r--r--lib/ephy-file-chooser.c2
-rw-r--r--src/window-commands.c6
3 files changed, 75 insertions, 6 deletions
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index 5caa27a58..ae99cf137 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -3749,7 +3749,56 @@ ephy_web_view_get_title_composite (EphyWebView *view)
}
#ifdef HAVE_WEBKIT2
-/* TODO: webkit_web_view_save() */
+static void
+web_resource_get_data_cb (WebKitWebResource *resource,
+ GAsyncResult *result,
+ GOutputStream *output_stream)
+{
+ guchar *data;
+ gsize data_length;
+ GInputStream *input_stream;
+ GError *error = NULL;
+
+ data = webkit_web_resource_get_data_finish (resource, result, &data_length, &error);
+ if (!data) {
+ g_printerr ("Failed to save page: %s", error->message);
+ g_error_free (error);
+ g_object_unref (output_stream);
+
+ return;
+ }
+
+ input_stream = g_memory_input_stream_new_from_data (data, data_length, g_free);
+ g_output_stream_splice_async (output_stream, input_stream,
+ G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
+ G_PRIORITY_DEFAULT,
+ NULL, NULL, NULL);
+ g_object_unref (input_stream);
+ g_object_unref (output_stream);
+}
+
+static void
+ephy_web_view_save_main_resource_cb (GFile *file,
+ GAsyncResult *result,
+ WebKitWebView *view)
+{
+ GFileOutputStream *output_stream;
+ WebKitWebResource *resource;
+ GError *error = NULL;
+
+ output_stream = g_file_replace_finish (file, result, &error);
+ if (!output_stream) {
+ g_printerr ("Failed to save page: %s", error->message);
+ g_error_free (error);
+
+ return;
+ }
+
+ resource = webkit_web_view_get_main_resource (view);
+ webkit_web_resource_get_data (resource, NULL,
+ (GAsyncReadyCallback)web_resource_get_data_cb,
+ output_stream);
+}
#else
static void
ephy_web_view_save_sub_resource_start (GList *subresources, char *destination_uri);
@@ -3972,6 +4021,7 @@ ephy_web_view_save_sub_resources (EphyWebView *view, const char *uri, GList *sub
ephy_web_view_save_sub_resource_start (subresources, destination_uri);
}
#endif
+
/**
* ephy_web_view_save:
* @view: an #EphyWebView
@@ -3982,15 +4032,28 @@ ephy_web_view_save_sub_resources (EphyWebView *view, const char *uri, GList *sub
void
ephy_web_view_save (EphyWebView *view, const char *uri)
{
-#ifdef HAVE_WEBKIT2
- /* TODO: webkit_web_view_save() */
-#else
+ GFile *file;
+#ifndef HAVE_WEBKIT2
WebKitWebFrame *frame;
WebKitWebDataSource *data_source;
GList *subresources;
const GString *data;
- GFile *file;
+#endif
+
+ file = g_file_new_for_uri (uri);
+#ifdef HAVE_WEBKIT2
+ if (g_str_has_suffix (uri, ".mhtml"))
+ webkit_web_view_save_to_file (WEBKIT_WEB_VIEW (view), file, WEBKIT_SAVE_MODE_MHTML,
+ NULL, NULL, NULL);
+ else
+ g_file_replace_async (file, NULL, FALSE,
+ G_FILE_CREATE_REPLACE_DESTINATION | G_FILE_CREATE_PRIVATE,
+ G_PRIORITY_DEFAULT, NULL,
+ (GAsyncReadyCallback)ephy_web_view_save_main_resource_cb,
+ view);
+ g_object_unref (file);
+#else
/* Save main resource */
frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW(view));
data_source = webkit_web_frame_get_data_source (frame);
diff --git a/lib/ephy-file-chooser.c b/lib/ephy-file-chooser.c
index a5702460e..2e228103d 100644
--- a/lib/ephy-file-chooser.c
+++ b/lib/ephy-file-chooser.c
@@ -211,6 +211,7 @@ ephy_file_chooser_new (const char *title,
"text/html",
"application/xhtml+xml",
"text/xml",
+ "message/rfc822", /* MHTML */
"image/png",
"image/jpeg",
"image/gif",
@@ -222,6 +223,7 @@ ephy_file_chooser_new (const char *title,
"text/html",
"application/xhtml+xml",
"text/xml",
+ "message/rfc822", /* MHTML */
NULL);
filter[EPHY_FILE_FILTER_IMAGES] =
diff --git a/src/window-commands.c b/src/window-commands.c
index c1e1d78c6..0a6c464cf 100644
--- a/src/window-commands.c
+++ b/src/window-commands.c
@@ -302,8 +302,12 @@ get_suggested_filename (EphyWebView *view)
if ((g_ascii_strncasecmp (mimetype, "text/html", 9)) == 0)
{
- /* Web Title will be used as suggested filename*/
+ /* Web Title will be used as suggested filename */
+#ifdef HAVE_WEBKIT2
+ suggested_filename = g_strconcat (ephy_web_view_get_title (view), ".mhtml", NULL);
+#else
suggested_filename = g_strconcat (ephy_web_view_get_title (view), ".html", NULL);
+#endif
}
else
{