aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSergio Villar Senin <svillar@igalia.com>2011-03-30 15:36:08 +0800
committerSergio Villar Senin <svillar@igalia.com>2011-06-01 22:00:59 +0800
commit89cd6749b82686ca78e8d44c5b3fb18fead02363 (patch)
tree0156a79859ec3a08a5e985d5d538c486980f1b47 /lib
parent813993d057e19bf9f7b1c091d165026c6dad8a41 (diff)
downloadgsoc2013-epiphany-89cd6749b82686ca78e8d44c5b3fb18fead02363.tar
gsoc2013-epiphany-89cd6749b82686ca78e8d44c5b3fb18fead02363.tar.gz
gsoc2013-epiphany-89cd6749b82686ca78e8d44c5b3fb18fead02363.tar.bz2
gsoc2013-epiphany-89cd6749b82686ca78e8d44c5b3fb18fead02363.tar.lz
gsoc2013-epiphany-89cd6749b82686ca78e8d44c5b3fb18fead02363.tar.xz
gsoc2013-epiphany-89cd6749b82686ca78e8d44c5b3fb18fead02363.tar.zst
gsoc2013-epiphany-89cd6749b82686ca78e8d44c5b3fb18fead02363.zip
Added about:plugins support.
We are now able to show a page with the list of installed plugins. Bug #575498
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.am4
-rw-r--r--lib/ephy-request-about.c149
-rw-r--r--lib/ephy-request-about.h37
-rw-r--r--lib/widgets/ephy-location-entry.c17
4 files changed, 203 insertions, 4 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 6be8ef745..63d58db1e 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -19,8 +19,9 @@ NOINST_H_FILES = \
ephy-node-common.h \
ephy-object-helpers.h \
ephy-prefs.h \
- ephy-profile-utils.h \
+ ephy-profile-utils.h \
ephy-print-utils.h \
+ ephy-request-about.h \
ephy-shlib-loader.h \
ephy-signal-accumulator.h \
ephy-string.h \
@@ -60,6 +61,7 @@ libephymisc_la_SOURCES = \
ephy-profile-utils.c \
ephy-profile-utils.h \
ephy-print-utils.c \
+ ephy-request-about.c \
ephy-settings.c \
ephy-shlib-loader.c \
ephy-signal-accumulator.c \
diff --git a/lib/ephy-request-about.c b/lib/ephy-request-about.c
new file mode 100644
index 000000000..167f2ec27
--- /dev/null
+++ b/lib/ephy-request-about.c
@@ -0,0 +1,149 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * ephy-request-about.c: about: URI request object
+ *
+ * Copyright (C) 2011, Igalia S.L.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gio/gio.h>
+#include <glib/gi18n.h>
+#include <libsoup/soup-uri.h>
+#include <webkit/webkit.h>
+
+#include "ephy-file-helpers.h"
+#include "ephy-request-about.h"
+
+G_DEFINE_TYPE (EphyRequestAbout, ephy_request_about, SOUP_TYPE_REQUEST)
+
+struct _EphyRequestAboutPrivate {
+ gssize content_length;
+ gchar *css_style;
+};
+
+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;
+}
+
+static void
+ephy_request_about_finalize (GObject *obj)
+{
+ g_free (EPHY_REQUEST_ABOUT(obj)->priv->css_style);
+
+ G_OBJECT_CLASS (ephy_request_about_parent_class)->finalize (obj);
+}
+
+static gboolean
+ephy_request_about_check_uri (SoupRequest *request,
+ SoupURI *uri,
+ GError **error)
+{
+ return uri->host == NULL;
+}
+
+static void
+read_css_style (EphyRequestAbout *about)
+{
+ GError *error = NULL;
+
+ if (!g_file_get_contents (ephy_file("about.css"), &(about->priv->css_style), NULL, &error))
+ g_debug (error->message);
+}
+
+static GInputStream *
+ephy_request_about_send (SoupRequest *request,
+ GCancellable *cancellable,
+ GError **error)
+{
+ 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);
+
+ g_string_append_printf (data_str, "<head><title>%s</title>" \
+ "<style type=\"text/css\">%s</style></head><body>",
+ _("Installed plugins"),
+ about->priv->css_style);
+
+ if (!g_strcmp0 (uri->path, "plugins")) {
+ WebKitWebPluginDatabase* database = webkit_get_web_plugin_database ();
+ GSList *plugin_list, *p;
+
+ 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 extensions_len = g_strv_length (mime_type->extensions);
+ 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; i < extensions_len; i++)
+ g_string_append_printf (data_str, "%s%c", mime_type->extensions[i],
+ i == (extensions_len - 1) ? ' ' : ',');
+
+ g_string_append(data_str, "</td></tr>");
+ }
+ g_string_append(data_str, "</tbody></table>");
+ }
+ webkit_web_plugin_database_plugins_list_free (plugin_list);
+ }
+
+ g_string_append(data_str, "</body></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);
+}
+
+static goffset
+ephy_request_about_get_content_length (SoupRequest *request)
+{
+ return EPHY_REQUEST_ABOUT (request)->priv->content_length;
+}
+
+static const char *
+ephy_request_about_get_content_type (SoupRequest *request)
+{
+ return "text/html";
+}
+
+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;
+ request_class->get_content_length = ephy_request_about_get_content_length;
+ request_class->get_content_type = ephy_request_about_get_content_type;
+
+ g_type_class_add_private (request_about_class, sizeof (EphyRequestAboutPrivate));
+}
diff --git a/lib/ephy-request-about.h b/lib/ephy-request-about.h
new file mode 100644
index 000000000..bb16eda80
--- /dev/null
+++ b/lib/ephy-request-about.h
@@ -0,0 +1,37 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2011, Igalia S.L.
+ */
+
+#ifndef EPHY_REQUEST_ABOUT_H
+#define EPHY_REQUEST_ABOUT_H 1
+
+#define LIBSOUP_USE_UNSTABLE_REQUEST_API
+#include <libsoup/soup-request.h>
+
+#define EPHY_TYPE_REQUEST_ABOUT (ephy_request_about_get_type ())
+#define EPHY_REQUEST_ABOUT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), EPHY_TYPE_REQUEST_ABOUT, EphyRequestAbout))
+#define EPHY_REQUEST_ABOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EPHY_TYPE_REQUEST_ABOUT, EphyRequestAboutClass))
+#define EPHY_IS_REQUEST_ABOUT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), EPHY_TYPE_REQUEST_ABOUT))
+#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 {
+ SoupRequest parent;
+
+ EphyRequestAboutPrivate *priv;
+} EphyRequestAbout;
+
+typedef struct {
+ SoupRequestClass parent;
+
+} EphyRequestAboutClass;
+
+GType ephy_request_about_get_type (void);
+
+#endif /* EPHY_REQUEST_ABOUT_H */
diff --git a/lib/widgets/ephy-location-entry.c b/lib/widgets/ephy-location-entry.c
index 79c921fcb..cb8d9b363 100644
--- a/lib/widgets/ephy-location-entry.c
+++ b/lib/widgets/ephy-location-entry.c
@@ -32,6 +32,7 @@
#include "ephy-stock-icons.h"
#include "ephy-debug.h"
#include "ephy-gui.h"
+#include "ephy-request-about.h"
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
@@ -1049,6 +1050,12 @@ textcell_data_func (GtkCellLayout *cell_layout,
if (url)
{
+ /* Do not show internal ephy-about: protocol to users */
+ if (g_str_has_prefix (url, EPHY_ABOUT_SCHEME)) {
+ g_free (url);
+ url = g_strdup_printf ("about:%s", url + strlen (EPHY_ABOUT_SCHEME) + 1);
+ }
+
ctext = g_strdup_printf ("%s\n%s", title, url);
style = gtk_widget_get_style_context (priv->entry);
@@ -1278,7 +1285,7 @@ ephy_location_entry_set_location (EphyLocationEntry *entry,
EphyLocationEntryPrivate *priv = entry->priv;
GtkClipboard *clipboard;
const char *text;
- char* selection = NULL;
+ char *effective_text = NULL, *selection = NULL;
int start, end;
/* Setting a new text will clear the clipboard. This makes it impossible
@@ -1303,6 +1310,9 @@ ephy_location_entry_set_location (EphyLocationEntry *entry,
if (address != NULL && strcmp (address, "about:blank") != 0)
{
+ if (g_str_has_prefix (address, EPHY_ABOUT_SCHEME))
+ effective_text = g_strdup_printf ("about:%s",
+ address + strlen (EPHY_ABOUT_SCHEME) + 1);
text = address;
}
else
@@ -1311,11 +1321,12 @@ ephy_location_entry_set_location (EphyLocationEntry *entry,
}
/* First record the new hash, then update the entry text */
- priv->hash = g_str_hash (text);
+ priv->hash = g_str_hash (effective_text ? effective_text : text);
priv->block_update = TRUE;
- gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
+ gtk_entry_set_text (GTK_ENTRY (priv->entry), effective_text ? effective_text : text);
priv->block_update = FALSE;
+ g_free (effective_text);
/* We need to call update_address_state() here, as the 'changed' signal
* may not get called if the user has typed in the exact correct url */