[epiphany/webkit2: 13/17] Port about handler to WebKit2



commit d01c74d3679792853b2f71c1f94c48c52a444735
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Thu Jun 7 18:49:36 2012 +0200

    Port about handler to WebKit2

 embed/Makefile.am                 |    2 +
 embed/ephy-about-handler.c        |  206 +++++++++++++++++++++++++++++++++++++
 embed/ephy-about-handler.h        |   16 +++
 embed/ephy-embed-single.c         |   22 ++++
 embed/ephy-embed-utils.c          |    2 +-
 embed/ephy-request-about.c        |  160 +----------------------------
 embed/ephy-request-about.h        |    3 -
 embed/ephy-web-view.c             |    2 +-
 lib/widgets/ephy-location-entry.c |    2 +-
 src/ephy-session.c                |    2 +-
 10 files changed, 253 insertions(+), 164 deletions(-)
---
diff --git a/embed/Makefile.am b/embed/Makefile.am
index ea7f3c2..db2123e 100644
--- a/embed/Makefile.am
+++ b/embed/Makefile.am
@@ -8,6 +8,7 @@ header_DATA = \
 	$(INST_H_FILES)
 
 NOINST_H_FILES = \
+	ephy-about-handler.h		\
 	ephy-embed-dialog.h		\
 	ephy-embed-private.h		\
 	ephy-encodings.h		\
@@ -33,6 +34,7 @@ BUILT_SOURCES = \
 	ephy-embed-type-builtins.h
 
 libephyembed_la_SOURCES = \
+	ephy-about-handler.c		\
 	ephy-adblock.c			\
 	ephy-adblock-manager.c		\
 	ephy-download.c			\
diff --git a/embed/ephy-about-handler.c b/embed/ephy-about-handler.c
new file mode 100644
index 0000000..8294192
--- /dev/null
+++ b/embed/ephy-about-handler.c
@@ -0,0 +1,206 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ *  Copyright  2012 Igalia S.L.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "ephy-about-handler.h"
+
+#include "ephy-file-helpers.h"
+#include "ephy-smaps.h"
+#include "ephy-web-app-utils.h"
+
+#include <gio/gio.h>
+#include <glib/gi18n.h>
+#ifdef HAVE_WEBKIT2
+#include <webkit2/webkit2.h>
+#else
+#include <webkit/webkit.h>
+#endif
+
+static gchar *css_style = NULL;
+
+static void
+read_css_style ()
+{
+  GError *error = NULL;
+  const gchar *file;
+
+  if (css_style)
+    return;
+
+  file = ephy_file ("about.css");
+  if (file && !g_file_get_contents (file, &css_style, NULL, &error)) {
+    g_debug ("%s", error->message);
+    g_error_free (error);
+  }
+}
+
+static void
+ephy_about_handler_handle_plugins (GString *data_str)
+{
+#ifdef HAVE_WEBKIT2
+    /* TODO: Plugins */
+#else
+  WebKitWebPluginDatabase* database = webkit_get_web_plugin_database ();
+  GSList *plugin_list, *p;
+
+  g_string_append_printf (data_str, "<head><title>%s</title>"           \
+                          "<style type=\"text/css\">%s</style></head><body>",
+                          _("Installed plugins"),
+                          css_style);
+
+  g_string_append_printf (data_str, "<h1>%s</h1>", _("Installed plugins"));
+  plugin_list = webkit_web_plugin_database_get_plugins (database);
+
+  for (p = plugin_list; p; p = p->next) {
+    WebKitWebPlugin *plugin = WEBKIT_WEB_PLUGIN (p->data);
+    GSList *m, *mime_types;
+
+    g_string_append_printf (data_str, "<h2>%s</h2>%s<br>%s: <b>%s</b>"  \
+                            "<table id=\"plugin-table\">"               \
+                            "  <thead><tr><th>%s</th><th>%s</th><th>%s</th></tr></thead><tbody>",
+                            webkit_web_plugin_get_name (plugin),
+                            webkit_web_plugin_get_description (plugin),
+                            _("Enabled"), webkit_web_plugin_get_enabled (plugin) ? _("Yes") : _("No"),
+                            _("MIME type"), _("Description"), _("Suffixes"));
+
+    mime_types = webkit_web_plugin_get_mimetypes (plugin);
+
+    for (m = mime_types; m; m = m->next) {
+      WebKitWebPluginMIMEType *mime_type = (WebKitWebPluginMIMEType*) m->data;
+      guint i;
+
+      g_string_append_printf (data_str, "<tr><td>%s</td><td>%s</td><td>",
+                              mime_type->name, mime_type->description);
+
+      for (i = 0; mime_type->extensions[i] != NULL; i++)
+        g_string_append_printf (data_str, "%s%c", mime_type->extensions[i],
+                                mime_type->extensions[i + 1] ? ',' : ' ');
+
+      g_string_append (data_str, "</td></tr>");
+    }
+
+    g_string_append (data_str, "</tbody></table>");
+  }
+
+  webkit_web_plugin_database_plugins_list_free (plugin_list);
+#endif
+  g_string_append (data_str, "</body>");
+}
+
+static void
+ephy_about_handler_handle_memory (GString *data_str)
+{
+  char *memory;
+  static EphySMaps *smaps = NULL;
+  if (!smaps)
+    smaps = ephy_smaps_new ();
+
+  memory = ephy_smaps_to_html (smaps);
+
+  if (memory) {
+    g_string_append_printf (data_str, "<head><title>%s</title>"         \
+                            "<style type=\"text/css\">%s</style></head><body>",
+                            _("Memory usage"),
+                            css_style);
+
+    g_string_append_printf (data_str, "<h1>%s</h1>", _("Memory usage"));
+    g_string_append (data_str, memory);
+    g_free (memory);
+  }
+}
+
+static void
+ephy_about_handler_handle_epiphany (GString *data_str)
+{
+  g_string_append_printf (data_str, "<head><title>Epiphany</title>"     \
+                          "<style type=\"text/css\">%s</style></head>"  \
+                          "<body style=\"background: #3369FF; color: white; font-style: italic;\">",
+                          css_style);
+
+  g_string_append (data_str, "<div id=\"ephytext\">"                    \
+                   "Il semble que la perfection soit atteinte non quand il n'y a plus rien Ã" \
+                   " ajouter, mais quand il n'y a plus rien à retrancher." \
+                   "</div>"                                             \
+                   "<div id=\"from\">"                                  \
+                   "<!-- Terre des Hommes, III: L'Avion, p. 60 -->"     \
+                   "Antoine de Saint-ExupÃry"                           \
+                   "</div></body>");
+}
+
+static void
+ephy_about_handler_handle_applications (GString *data_str)
+{
+  GList *applications, *p;
+
+  g_string_append_printf (data_str, "<head><title>%s</title>"           \
+                          "<style type=\"text/css\">%s</style></head>"  \
+                          "<body class=\"applications-body\"><h1>%s</h1>" \
+                          "<p>%s</p>",
+                          _("Applications"),
+                          css_style,
+                          _("Applications"),
+                          _("List of installed web applications"));
+
+  g_string_append (data_str, "<form><table>");
+
+  applications = ephy_web_application_get_application_list ();
+  for (p = applications; p; p = p->next) {
+    char *img_data = NULL, *img_data_base64 = NULL;
+    gsize data_length;
+    EphyWebApplication *app = (EphyWebApplication*)p->data;
+
+    if (g_file_get_contents (app->icon_url, &img_data, &data_length, NULL))
+      img_data_base64 = g_base64_encode ((guchar*)img_data, data_length);
+    g_string_append_printf (data_str, "<tbody><tr><td class=\"icon\"><img width=64 height=64 src=\"data:image/png;base64,%s\">" \
+                            " </img></td><td class=\"data\"><div class=\"appname\">%s</div><div class=\"appurl\">%s</div></td><td class=\"input\"><input type=\"submit\" value=\"Delete\" id=\"%s\"></td><td class=\"date\">%s <br /> %s</td></tr>",
+                            img_data_base64, app->name, app->url, app->name,
+                            /* Note for translators: this refers to the installation date. */
+                            _("Installed on:"), app->install_date);
+    g_free (img_data_base64);
+    g_free (img_data);
+  }
+
+  g_string_append (data_str, "</form></table></body>");
+
+  ephy_web_application_free_application_list (applications);
+}
+
+GString *
+ephy_about_handler_handle (const gchar *about)
+{
+  GString *data_str = g_string_new("<html>");
+
+  read_css_style ();
+
+  if (!g_strcmp0 (about, "plugins"))
+    ephy_about_handler_handle_plugins (data_str);
+  else if (!g_strcmp0 (about, "memory"))
+    ephy_about_handler_handle_memory (data_str);
+  else if (!g_strcmp0 (about, "epiphany"))
+    ephy_about_handler_handle_epiphany (data_str);
+  else if (!g_strcmp0 (about, "applications"))
+    ephy_about_handler_handle_applications (data_str);
+
+  g_string_append (data_str, "</html>");
+
+  return data_str;
+}
diff --git a/embed/ephy-about-handler.h b/embed/ephy-about-handler.h
new file mode 100644
index 0000000..cc08f62
--- /dev/null
+++ b/embed/ephy-about-handler.h
@@ -0,0 +1,16 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * Copyright (C) 2012, Igalia S.L.
+ */
+
+#ifndef EPHY_ABOUT_HANDLER_H
+#define EPHY_ABOUT_HANDLER_H 1
+
+#include <glib.h>
+
+#define EPHY_ABOUT_SCHEME "ephy-about"
+#define EPHY_ABOUT_SCHEME_LEN 10
+
+GString *ephy_about_handler_handle (const gchar *about);
+
+#endif /* EPHY_ABOUT_HANDLER_H */
diff --git a/embed/ephy-embed-single.c b/embed/ephy-embed-single.c
index e2280be..926b362 100644
--- a/embed/ephy-embed-single.c
+++ b/embed/ephy-embed-single.c
@@ -36,6 +36,7 @@
 #include "ephy-prefs.h"
 #include "ephy-settings.h"
 #include "ephy-request-about.h"
+#include "ephy-about-handler.h"
 
 #ifdef HAVE_WEBKIT2
 #include <webkit2/webkit2.h>
@@ -337,6 +338,23 @@ cache_size_cb (GSettings *settings,
   soup_cache_set_max_size (single->priv->cache, new_cache_size * 1024 * 1024 /* in bytes */);
 }
 
+#ifdef HAVE_WEBKIT2
+static void
+about_request_cb (WebKitURISchemeRequest *request,
+                  gpointer user_data)
+{
+  GString *contents;
+  GInputStream *stream;
+  gint stream_length;
+
+  contents = ephy_about_handler_handle (webkit_uri_scheme_request_get_path (request));
+  stream_length = contents->len;
+  stream = g_memory_input_stream_new_from_data (g_string_free (contents, FALSE), stream_length, g_free);
+  webkit_uri_scheme_request_finish (request, stream, stream_length, "text/html");
+  g_object_unref (stream);
+}
+#endif
+
 /**
  * ephy_embed_single_initialize:
  * @single: the #EphyEmbedSingle
@@ -349,6 +367,10 @@ ephy_embed_single_initialize (EphyEmbedSingle *single)
 {
 #ifdef HAVE_WEBKIT2
   /* TODO: Network features */
+  webkit_web_context_register_uri_scheme (webkit_web_context_get_default (),
+                                          EPHY_ABOUT_SCHEME,
+                                          about_request_cb,
+                                          NULL);
 #else
   SoupSession *session;
   SoupCookieJar *jar;
diff --git a/embed/ephy-embed-utils.c b/embed/ephy-embed-utils.c
index 6c669f7..3040106 100644
--- a/embed/ephy-embed-utils.c
+++ b/embed/ephy-embed-utils.c
@@ -30,7 +30,7 @@
 
 #include "ephy-string.h"
 #include "ephy-embed-utils.h"
-#include "ephy-request-about.h"
+#include "ephy-about-handler.h"
 
 char*
 ephy_embed_utils_link_message_parse (char *message)
diff --git a/embed/ephy-request-about.c b/embed/ephy-request-about.c
index cddb9d1..9a0bcaf 100644
--- a/embed/ephy-request-about.c
+++ b/embed/ephy-request-about.c
@@ -23,45 +23,22 @@
 #endif
 #include "ephy-request-about.h"
 
-#include "ephy-file-helpers.h"
-#include "ephy-smaps.h"
-#include "ephy-web-app-utils.h"
+#include "ephy-about-handler.h"
 
 #include <gio/gio.h>
 #include <glib/gi18n.h>
 #include <libsoup/soup-uri.h>
-#ifdef HAVE_WEBKIT2
-#include <webkit2/webkit2.h>
-#else
-#include <webkit/webkit.h>
-#endif
 
 G_DEFINE_TYPE (EphyRequestAbout, ephy_request_about, SOUP_TYPE_REQUEST)
 
 struct _EphyRequestAboutPrivate {
   gssize content_length;
-  gchar *css_style;
-  EphySMaps *smaps;
 };
 
 static void
 ephy_request_about_init (EphyRequestAbout *about)
 {
   about->priv = G_TYPE_INSTANCE_GET_PRIVATE (about, EPHY_TYPE_REQUEST_ABOUT, EphyRequestAboutPrivate);
-  about->priv->content_length = 0;
-  about->priv->css_style = NULL;
-  about->priv->smaps = ephy_smaps_new ();
-}
-
-static void
-ephy_request_about_finalize (GObject *obj)
-{
-  EphyRequestAboutPrivate *priv = EPHY_REQUEST_ABOUT (obj)->priv;
-
-  g_object_unref (priv->smaps);
-  g_free (priv->css_style);
-
-  G_OBJECT_CLASS (ephy_request_about_parent_class)->finalize (obj);
 }
 
 static gboolean
@@ -72,18 +49,6 @@ ephy_request_about_check_uri (SoupRequest  *request,
   return uri->host == NULL;
 }
 
-static void
-read_css_style (EphyRequestAbout *about)
-{
-  GError *error = NULL;
-  const gchar *file = ephy_file ("about.css");
-
-  if (file && !g_file_get_contents (file, &about->priv->css_style, NULL, &error)) {
-    g_debug ("%s", error->message);
-    g_error_free (error);
-  }
-}
-
 static GInputStream *
 ephy_request_about_send (SoupRequest          *request,
                          GCancellable         *cancellable,
@@ -91,126 +56,10 @@ ephy_request_about_send (SoupRequest          *request,
 {
   EphyRequestAbout *about = EPHY_REQUEST_ABOUT (request);
   SoupURI *uri = soup_request_get_uri (request);
-  GString *data_str = g_string_new("<html>");
-
-  if (!about->priv->css_style)
-    read_css_style (about);
-
-  if (!g_strcmp0 (uri->path, "plugins")) {
-#ifdef HAVE_WEBKIT2
-    /* TODO: SoupRequest and Plugins */
-#else
-    WebKitWebPluginDatabase* database = webkit_get_web_plugin_database ();
-    GSList *plugin_list, *p;
-
-    g_string_append_printf (data_str, "<head><title>%s</title>" \
-                            "<style type=\"text/css\">%s</style></head><body>",
-                            _("Installed plugins"),
-                            about->priv->css_style);
-
-    g_string_append_printf (data_str, "<h1>%s</h1>", _("Installed plugins"));
-    plugin_list = webkit_web_plugin_database_get_plugins (database);
-
-    for (p = plugin_list; p; p = p->next) {
-      WebKitWebPlugin *plugin = WEBKIT_WEB_PLUGIN (p->data);
-      GSList *m, *mime_types;
-
-      g_string_append_printf (data_str, "<h2>%s</h2>%s<br>%s: <b>%s</b>"\
-                              "<table id=\"plugin-table\">"             \
-                              "  <thead><tr><th>%s</th><th>%s</th><th>%s</th></tr></thead><tbody>",
-                              webkit_web_plugin_get_name (plugin),
-                              webkit_web_plugin_get_description (plugin),
-                              _("Enabled"), webkit_web_plugin_get_enabled (plugin) ? _("Yes") : _("No"),
-                              _("MIME type"), _("Description"), _("Suffixes"));
-
-      mime_types = webkit_web_plugin_get_mimetypes (plugin);
+  GString *data_str = ephy_about_handler_handle (uri->path);
 
-      for (m = mime_types; m; m = m->next) {
-        WebKitWebPluginMIMEType *mime_type = (WebKitWebPluginMIMEType*) m->data;
-        guint i;
-
-        g_string_append_printf (data_str, "<tr><td>%s</td><td>%s</td><td>",
-                                mime_type->name, mime_type->description);
-
-        for (i = 0; mime_type->extensions[i] != NULL; i++)
-          g_string_append_printf (data_str, "%s%c", mime_type->extensions[i],
-                                  mime_type->extensions[i + 1] ? ',' : ' ');
-
-        g_string_append (data_str, "</td></tr>");
-      }
-
-      g_string_append (data_str, "</tbody></table>");
-    }
-
-    webkit_web_plugin_database_plugins_list_free (plugin_list);
-#endif
-    g_string_append (data_str, "</body>");
-  } else if (!g_strcmp0 (uri->path, "memory")) {
-    char *memory = ephy_smaps_to_html (EPHY_REQUEST_ABOUT (request)->priv->smaps);
-
-    if (memory) {
-      g_string_append_printf (data_str, "<head><title>%s</title>"       \
-                              "<style type=\"text/css\">%s</style></head><body>",
-                              _("Memory usage"),
-                              about->priv->css_style);
-
-      g_string_append_printf (data_str, "<h1>%s</h1>", _("Memory usage"));
-      g_string_append (data_str, memory);
-      g_free (memory);
-    }
-
-  } else if (!g_strcmp0 (uri->path, "epiphany")) {
-    g_string_append_printf (data_str, "<head><title>Epiphany</title>" \
-                            "<style type=\"text/css\">%s</style></head>" \
-                            "<body style=\"background: #3369FF; color: white; font-style: italic;\">",
-                            about->priv->css_style);
-
-    g_string_append (data_str, "<div id=\"ephytext\">" \
-                     "Il semble que la perfection soit atteinte non quand il n'y a plus rien Ã" \
-                     " ajouter, mais quand il n'y a plus rien à retrancher." \
-                     "</div>" \
-                     "<div id=\"from\">" \
-                     "<!-- Terre des Hommes, III: L'Avion, p. 60 -->" \
-                     "Antoine de Saint-ExupÃry" \
-                     "</div></body>");
-  } else if (!g_strcmp0 (uri->path, "applications")) {
-    GList *applications, *p;
-
-    g_string_append_printf (data_str, "<head><title>%s</title>"   \
-                            "<style type=\"text/css\">%s</style></head>" \
-                            "<body class=\"applications-body\"><h1>%s</h1>" \
-                            "<p>%s</p>",
-                            _("Applications"),
-                            about->priv->css_style,
-                            _("Applications"),
-                            _("List of installed web applications"));
-
-
-    g_string_append (data_str, "<form><table>");
-
-    applications = ephy_web_application_get_application_list ();
-    for (p = applications; p; p = p->next) {
-      char *icon_uri;
-      EphyWebApplication *app = (EphyWebApplication*)p->data;
-
-      icon_uri = ephy_file_create_data_uri_for_filename (app->icon_url, "image/png");
-      g_string_append_printf (data_str, "<tbody><tr><td class=\"icon\"><img width=64 height=64 src=\"%s\">" \
-                              " </img></td><td class=\"data\"><div class=\"appname\">%s</div><div class=\"appurl\">%s</div></td><td class=\"input\"><input type=\"submit\" value=\"Delete\" id=\"%s\"></td><td class=\"date\">%s <br /> %s</td></tr>",
-                              icon_uri ? icon_uri : "",
-                              app->name, app->url, app->name,
-                              /* Note for translators: this refers to the installation date. */
-                              _("Installed on:"), app->install_date);
-      g_free (icon_uri);
-    }
-
-    g_string_append (data_str, "</form></table></body>");
-    
-    ephy_web_application_free_application_list (applications);
-  }
-
-  g_string_append (data_str, "</html>");
   about->priv->content_length = data_str->len;
-  return g_memory_input_stream_new_from_data (g_string_free (data_str, false), about->priv->content_length, g_free);
+  return g_memory_input_stream_new_from_data (g_string_free (data_str, FALSE), about->priv->content_length, g_free);
 }
 
 static goffset
@@ -230,11 +79,8 @@ static const char *about_schemes[] = { EPHY_ABOUT_SCHEME, NULL };
 static void
 ephy_request_about_class_init (EphyRequestAboutClass *request_about_class)
 {
-  GObjectClass *gobject_class = G_OBJECT_CLASS (request_about_class);
   SoupRequestClass *request_class = SOUP_REQUEST_CLASS (request_about_class);
 
-  gobject_class->finalize = ephy_request_about_finalize;
-
   request_class->schemes = about_schemes;
   request_class->check_uri = ephy_request_about_check_uri;
   request_class->send = ephy_request_about_send;
diff --git a/embed/ephy-request-about.h b/embed/ephy-request-about.h
index cc441a7..f8e3e23 100644
--- a/embed/ephy-request-about.h
+++ b/embed/ephy-request-about.h
@@ -16,9 +16,6 @@
 #define EPHY_IS_REQUEST_ABOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EPHY_TYPE_REQUEST_ABOUT))
 #define EPHY_REQUEST_ABOUT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), EPHY_TYPE_REQUEST_ABOUT, EphyRequestAboutClass))
 
-#define EPHY_ABOUT_SCHEME "ephy-about"
-#define EPHY_ABOUT_SCHEME_LEN 10
-
 typedef struct _EphyRequestAboutPrivate EphyRequestAboutPrivate;
 
 typedef struct {
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index ff445fe..dc40d1c 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -37,7 +37,7 @@
 #include "ephy-permission-manager.h"
 #include "ephy-prefs.h"
 #include "ephy-profile-utils.h"
-#include "ephy-request-about.h"
+#include "ephy-about-handler.h"
 #include "ephy-settings.h"
 #include "ephy-string.h"
 #include "ephy-web-app-utils.h"
diff --git a/lib/widgets/ephy-location-entry.c b/lib/widgets/ephy-location-entry.c
index 207ebcc..d17c34c 100644
--- a/lib/widgets/ephy-location-entry.c
+++ b/lib/widgets/ephy-location-entry.c
@@ -28,7 +28,7 @@
 #include "ephy-dnd.h"
 #include "ephy-debug.h"
 #include "ephy-gui.h"
-#include "ephy-request-about.h"
+#include "ephy-about-handler.h"
 
 #include <glib/gi18n.h>
 #include <gdk/gdkkeysyms.h>
diff --git a/src/ephy-session.c b/src/ephy-session.c
index 0c67712..d48c177 100644
--- a/src/ephy-session.c
+++ b/src/ephy-session.c
@@ -32,7 +32,7 @@
 #include "ephy-gui.h"
 #include "ephy-history-window.h"
 #include "ephy-prefs.h"
-#include "ephy-request-about.h"
+#include "ephy-about-handler.h"
 #include "ephy-settings.h"
 #include "ephy-shell.h"
 #include "ephy-window.h"



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]