aboutsummaryrefslogtreecommitdiffstats
path: root/embed/webkit/webkit-embed.c
diff options
context:
space:
mode:
authorXan Lopez <xan@src.gnome.org>2007-12-10 06:05:34 +0800
committerXan Lopez <xan@src.gnome.org>2007-12-10 06:05:34 +0800
commit04d807546492d1dc26d75faf184e1face508a128 (patch)
treef74a67a26af47300c803ee1b84d2436a7da66261 /embed/webkit/webkit-embed.c
parent98ca0fc609810f0024179654484f8428fa50d020 (diff)
downloadgsoc2013-epiphany-04d807546492d1dc26d75faf184e1face508a128.tar
gsoc2013-epiphany-04d807546492d1dc26d75faf184e1face508a128.tar.gz
gsoc2013-epiphany-04d807546492d1dc26d75faf184e1face508a128.tar.bz2
gsoc2013-epiphany-04d807546492d1dc26d75faf184e1face508a128.tar.lz
gsoc2013-epiphany-04d807546492d1dc26d75faf184e1face508a128.tar.xz
gsoc2013-epiphany-04d807546492d1dc26d75faf184e1face508a128.tar.zst
gsoc2013-epiphany-04d807546492d1dc26d75faf184e1face508a128.zip
Rename cpp files to c in the WebKit backend; they are pure C.
Also fix a couple of compiler warnings. svn path=/trunk/; revision=7764
Diffstat (limited to 'embed/webkit/webkit-embed.c')
-rw-r--r--embed/webkit/webkit-embed.c516
1 files changed, 516 insertions, 0 deletions
diff --git a/embed/webkit/webkit-embed.c b/embed/webkit/webkit-embed.c
new file mode 100644
index 000000000..c2187b29d
--- /dev/null
+++ b/embed/webkit/webkit-embed.c
@@ -0,0 +1,516 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
+/*
+ * Copyright © 2007 Xan Lopez
+ *
+ * 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.
+ *
+ */
+
+#include "config.h"
+
+#include "ephy-command-manager.h"
+#include "ephy-debug.h"
+#include "ephy-embed-shell.h"
+#include "ephy-embed-single.h"
+#include "ephy-string.h"
+#include "ephy-embed-event.h"
+
+#include <libgnomevfs/gnome-vfs.h>
+
+#include <webkitwebframe.h>
+#include <webkitwebview.h>
+#include <string.h>
+
+#include "webkit-embed.h"
+#include "ephy-embed.h"
+#include "ephy-base-embed.h"
+
+static void webkit_embed_class_init (WebKitEmbedClass *klass);
+static void webkit_embed_init (WebKitEmbed *gs);
+static void webkit_embed_destroy (GtkObject *object);
+static void webkit_embed_finalize (GObject *object);
+static void ephy_embed_iface_init (EphyEmbedIface *iface);
+
+#define WEBKIT_EMBED_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), WEBKIT_TYPE_EMBED, WebKitEmbedPrivate))
+
+typedef enum
+ {
+ WEBKIT_EMBED_LOAD_STARTED,
+ WEBKIT_EMBED_LOAD_REDIRECTING,
+ WEBKIT_EMBED_LOAD_LOADING,
+ WEBKIT_EMBED_LOAD_STOPPED
+ } WebKitEmbedLoadState;
+
+struct WebKitEmbedPrivate
+{
+ WebKitWebView *web_view;
+ WebKitEmbedLoadState load_state;
+ char *loading_uri;
+};
+
+static void
+impl_manager_do_command (EphyCommandManager *manager,
+ const char *command)
+{
+}
+
+static gboolean
+impl_manager_can_do_command (EphyCommandManager *manager,
+ const char *command)
+{
+ return FALSE;
+}
+
+static void
+ephy_command_manager_iface_init (EphyCommandManagerIface *iface)
+{
+ iface->do_command = impl_manager_do_command;
+ iface->can_do_command = impl_manager_can_do_command;
+}
+
+G_DEFINE_TYPE_WITH_CODE (WebKitEmbed, webkit_embed, EPHY_TYPE_BASE_EMBED,
+ G_IMPLEMENT_INTERFACE (EPHY_TYPE_EMBED,
+ ephy_embed_iface_init)
+ G_IMPLEMENT_INTERFACE (EPHY_TYPE_COMMAND_MANAGER,
+ ephy_command_manager_iface_init))
+
+static void
+impl_close (EphyEmbed *embed)
+{
+ gtk_widget_destroy (GTK_WIDGET (embed));
+}
+
+static void
+webkit_embed_title_changed_cb (WebKitWebFrame *web_frame,
+ gchar *title,
+ gchar *location,
+ EphyEmbed *embed)
+{
+ ephy_base_embed_set_title (EPHY_BASE_EMBED (embed),
+ title);
+ ephy_base_embed_location_changed (EPHY_BASE_EMBED (embed),
+ location);
+}
+
+static void
+update_load_state (WebKitEmbed *embed, WebKitWebView *web_view)
+{
+ EphyEmbedNetState estate = EPHY_EMBED_STATE_UNKNOWN;
+
+ if (embed->priv->load_state == WEBKIT_EMBED_LOAD_STARTED)
+ estate = (EphyEmbedNetState) (estate |
+ EPHY_EMBED_STATE_START |
+ EPHY_EMBED_STATE_NEGOTIATING |
+ EPHY_EMBED_STATE_IS_REQUEST |
+ EPHY_EMBED_STATE_IS_NETWORK);
+
+ if (embed->priv->load_state == WEBKIT_EMBED_LOAD_LOADING)
+ estate = (EphyEmbedNetState) (estate |
+ EPHY_EMBED_STATE_TRANSFERRING |
+ EPHY_EMBED_STATE_IS_REQUEST |
+ EPHY_EMBED_STATE_IS_NETWORK);
+
+ if (embed->priv->load_state == WEBKIT_EMBED_LOAD_STOPPED)
+ estate = (EphyEmbedNetState) (estate |
+ EPHY_EMBED_STATE_STOP |
+ EPHY_EMBED_STATE_IS_DOCUMENT |
+ EPHY_EMBED_STATE_IS_NETWORK);
+
+ ephy_base_embed_update_from_net_state (EPHY_BASE_EMBED (embed),
+ embed->priv->loading_uri,
+ (EphyEmbedNetState)estate);
+}
+
+static void
+webkit_embed_load_started_cb (WebKitWebView *web_view,
+ WebKitWebFrame *web_frame,
+ EphyEmbed *embed)
+{
+ WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+ wembed->priv->load_state = WEBKIT_EMBED_LOAD_STARTED;
+
+ update_load_state (wembed, web_view);
+}
+
+static void
+webkit_embed_load_progress_changed_cb (WebKitWebView *web_view,
+ int progress,
+ EphyEmbed *embed)
+{
+ WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+
+ if (wembed->priv->load_state == WEBKIT_EMBED_LOAD_STARTED)
+ wembed->priv->load_state = WEBKIT_EMBED_LOAD_LOADING;
+
+ ephy_base_embed_set_load_percent (EPHY_BASE_EMBED (embed), progress);
+}
+
+static void
+webkit_embed_load_finished_cb (WebKitWebView *web_view,
+ WebKitWebFrame *web_frame,
+ EphyEmbed *embed)
+{
+ WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+ wembed->priv->load_state = WEBKIT_EMBED_LOAD_STOPPED;
+
+ update_load_state (wembed, web_view);
+}
+
+static void
+webkit_embed_hovering_over_link_cb (WebKitWebView *web_view,
+ char *title,
+ char *location,
+ EphyEmbed *embed)
+{
+ ephy_base_embed_set_link_message (EPHY_BASE_EMBED (embed), location);
+}
+
+static void
+webkit_embed_class_init (WebKitEmbedClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass);
+
+ object_class->finalize = webkit_embed_finalize;
+
+ gtk_object_class->destroy = webkit_embed_destroy;
+
+ g_type_class_add_private (object_class, sizeof(WebKitEmbedPrivate));
+}
+
+static void
+webkit_embed_init (WebKitEmbed *embed)
+{
+ WebKitWebView *web_view;
+ GtkWidget *sw;
+
+ embed->priv = WEBKIT_EMBED_GET_PRIVATE (embed);
+ embed->priv->loading_uri = NULL;
+
+ sw = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+ web_view = WEBKIT_WEB_VIEW (webkit_web_view_new ());
+ embed->priv->web_view = web_view;
+ gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (web_view));
+ gtk_widget_show (sw);
+ gtk_widget_show (GTK_WIDGET (web_view));
+
+ gtk_container_add (GTK_CONTAINER (embed), sw);
+
+ g_signal_connect (G_OBJECT (web_view), "load-started",
+ G_CALLBACK (webkit_embed_load_started_cb), embed);
+ g_signal_connect (G_OBJECT (web_view), "load_finished",
+ G_CALLBACK (webkit_embed_load_finished_cb), embed);
+ g_signal_connect (G_OBJECT (web_view), "title-changed",
+ G_CALLBACK (webkit_embed_title_changed_cb), embed);
+ g_signal_connect (G_OBJECT (web_view), "load-progress-changed",
+ G_CALLBACK (webkit_embed_load_progress_changed_cb), embed);
+ g_signal_connect (G_OBJECT (web_view), "hovering-over-link",
+ G_CALLBACK (webkit_embed_hovering_over_link_cb), embed);
+}
+
+static void
+webkit_embed_destroy (GtkObject *object)
+{
+ GTK_OBJECT_CLASS (webkit_embed_parent_class)->destroy (object);
+}
+
+static void
+webkit_embed_finalize (GObject *object)
+{
+ WebKitEmbed *wembed = WEBKIT_EMBED (object);
+
+ g_free (wembed->priv->loading_uri);
+
+ G_OBJECT_CLASS (webkit_embed_parent_class)->finalize (object);
+}
+
+static void
+impl_load_url (EphyEmbed *embed,
+ const char *url)
+{
+ WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+
+ webkit_web_view_open (wembed->priv->web_view, url);
+}
+
+static void
+impl_load (EphyEmbed *embed,
+ const char *url,
+ EphyEmbedLoadFlags flags,
+ EphyEmbed *preview_embed)
+{
+ WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+ char *effective_url = NULL;
+
+ /* FIXME: WebKit has some strange bug for which there must be
+ * protocol prefix into the parsed URL, or it will not show images
+ * and lock badly. I copied this function from WebKit's
+ * GdkLauncher.
+ */
+ if (strncmp ("about:", url, 6) != 0 &&
+ strncmp ("http://", url, 7) != 0 &&
+ strncmp ("https://", url, 8) != 0 &&
+ strncmp ("file://", url, 7) != 0 &&
+ strncmp ("ftp://", url, 6) != 0)
+ effective_url = g_strconcat ("http://", url, NULL);
+ else
+ effective_url = g_strdup (url);
+
+ g_free (wembed->priv->loading_uri);
+ wembed->priv->loading_uri = g_strdup (effective_url);
+
+ webkit_web_view_open (wembed->priv->web_view, effective_url);
+
+ g_free (effective_url);
+}
+
+static void
+impl_stop_load (EphyEmbed *embed)
+{
+ webkit_web_view_stop_loading (WEBKIT_EMBED (embed)->priv->web_view);
+}
+
+static gboolean
+impl_can_go_back (EphyEmbed *embed)
+{
+ return webkit_web_view_can_go_backward (WEBKIT_EMBED (embed)->priv->web_view);
+}
+
+static gboolean
+impl_can_go_forward (EphyEmbed *embed)
+{
+ return webkit_web_view_can_go_forward (WEBKIT_EMBED (embed)->priv->web_view);
+}
+
+static gboolean
+impl_can_go_up (EphyEmbed *embed)
+{
+ return FALSE;
+}
+
+static GSList *
+impl_get_go_up_list (EphyEmbed *embed)
+{
+ return NULL;
+}
+
+static void
+impl_go_back (EphyEmbed *embed)
+{
+ webkit_web_view_go_backward (WEBKIT_EMBED (embed)->priv->web_view);
+}
+
+static void
+impl_go_forward (EphyEmbed *embed)
+{
+ webkit_web_view_go_forward (WEBKIT_EMBED (embed)->priv->web_view);
+}
+
+static void
+impl_go_up (EphyEmbed *embed)
+{
+}
+
+static char *
+impl_get_js_status (EphyEmbed *embed)
+{
+ return NULL;
+}
+
+static char *
+impl_get_location (EphyEmbed *embed,
+ gboolean toplevel)
+{
+ WebKitWebFrame *web_frame = webkit_web_view_get_main_frame (WEBKIT_EMBED (embed)->priv->web_view);
+ return g_strdup (webkit_web_frame_get_location (web_frame));
+}
+
+static void
+impl_reload (EphyEmbed *embed,
+ gboolean force)
+{
+ webkit_web_view_reload (WEBKIT_EMBED (embed)->priv->web_view);
+}
+
+static float
+impl_get_zoom (EphyEmbed *embed)
+{
+ return 1.0;
+}
+
+static void
+impl_set_zoom (EphyEmbed *embed,
+ float zoom)
+{
+}
+
+static void
+impl_scroll_lines (EphyEmbed *embed,
+ int num_lines)
+{
+}
+
+static void
+impl_scroll_pages (EphyEmbed *embed,
+ int num_pages)
+{
+}
+
+static void
+impl_scroll_pixels (EphyEmbed *embed,
+ int dx,
+ int dy)
+{
+}
+
+static int
+impl_shistory_n_items (EphyEmbed *embed)
+{
+ return 0;
+}
+
+static void
+impl_shistory_get_nth (EphyEmbed *embed,
+ int nth,
+ gboolean is_relative,
+ char **url,
+ char **title)
+{
+ *url = NULL;
+ *title = NULL;
+}
+
+static int
+impl_shistory_get_pos (EphyEmbed *embed)
+{
+ return 0;
+}
+
+static void
+impl_shistory_go_nth (EphyEmbed *embed,
+ int nth)
+{
+}
+
+static void
+impl_shistory_copy (EphyEmbed *source,
+ EphyEmbed *dest,
+ gboolean copy_back,
+ gboolean copy_forward,
+ gboolean copy_current)
+{
+}
+
+static void
+impl_get_security_level (EphyEmbed *embed,
+ EphyEmbedSecurityLevel *level,
+ char **description)
+{
+ if (level) *level = EPHY_EMBED_STATE_IS_UNKNOWN;
+}
+
+static void
+impl_show_page_certificate (EphyEmbed *embed)
+{
+}
+
+static void
+impl_print (EphyEmbed *embed)
+{
+}
+
+static void
+impl_set_print_preview_mode (EphyEmbed *embed, gboolean preview_mode)
+{
+}
+
+static int
+impl_print_preview_n_pages (EphyEmbed *embed)
+{
+ return 0;
+}
+
+static void
+impl_print_preview_navigate (EphyEmbed *embed,
+ EphyEmbedPrintPreviewNavType type,
+ int page)
+{
+}
+
+static void
+impl_set_encoding (EphyEmbed *embed,
+ const char *encoding)
+{
+}
+
+static char *
+impl_get_encoding (EphyEmbed *embed)
+{
+ return NULL;
+}
+
+static gboolean
+impl_has_automatic_encoding (EphyEmbed *embed)
+{
+ return FALSE;
+}
+
+static gboolean
+impl_has_modified_forms (EphyEmbed *embed)
+{
+ return FALSE;
+}
+
+static void
+ephy_embed_iface_init (EphyEmbedIface *iface)
+{
+ iface->load_url = impl_load_url;
+ iface->load = impl_load;
+ iface->stop_load = impl_stop_load;
+ iface->can_go_back = impl_can_go_back;
+ iface->can_go_forward =impl_can_go_forward;
+ iface->can_go_up = impl_can_go_up;
+ iface->get_go_up_list = impl_get_go_up_list;
+ iface->go_back = impl_go_back;
+ iface->go_forward = impl_go_forward;
+ iface->go_up = impl_go_up;
+ iface->get_location = impl_get_location;
+ iface->get_js_status = impl_get_js_status;
+ iface->reload = impl_reload;
+ iface->set_zoom = impl_set_zoom;
+ iface->get_zoom = impl_get_zoom;
+ iface->scroll_lines = impl_scroll_lines;
+ iface->scroll_pages = impl_scroll_pages;
+ iface->scroll_pixels = impl_scroll_pixels;
+ iface->shistory_n_items = impl_shistory_n_items;
+ iface->shistory_get_nth = impl_shistory_get_nth;
+ iface->shistory_get_pos = impl_shistory_get_pos;
+ iface->shistory_go_nth = impl_shistory_go_nth;
+ iface->shistory_copy = impl_shistory_copy;
+ iface->show_page_certificate = impl_show_page_certificate;
+ iface->close = impl_close;
+ iface->set_encoding = impl_set_encoding;
+ iface->get_encoding = impl_get_encoding;
+ iface->has_automatic_encoding = impl_has_automatic_encoding;
+ iface->print = impl_print;
+ iface->set_print_preview_mode = impl_set_print_preview_mode;
+ iface->print_preview_n_pages = impl_print_preview_n_pages;
+ iface->print_preview_navigate = impl_print_preview_navigate;
+ iface->has_modified_forms = impl_has_modified_forms;
+ iface->get_security_level = impl_get_security_level;
+}