aboutsummaryrefslogtreecommitdiffstats
path: root/embed/webkit/webkit-embed.cpp
diff options
context:
space:
mode:
authorXan Lopez <xan@src.gnome.org>2007-10-07 03:21:14 +0800
committerXan Lopez <xan@src.gnome.org>2007-10-07 03:21:14 +0800
commit843b31a0eddb2e88e565abb657f32f85994b0c0f (patch)
tree2e58d87132ade6f2d71e71e9d93b156aa7d1da5a /embed/webkit/webkit-embed.cpp
parent9d1f50379b55fad9062eb6ee21c35f138ca29d60 (diff)
downloadgsoc2013-epiphany-843b31a0eddb2e88e565abb657f32f85994b0c0f.tar
gsoc2013-epiphany-843b31a0eddb2e88e565abb657f32f85994b0c0f.tar.gz
gsoc2013-epiphany-843b31a0eddb2e88e565abb657f32f85994b0c0f.tar.bz2
gsoc2013-epiphany-843b31a0eddb2e88e565abb657f32f85994b0c0f.tar.lz
gsoc2013-epiphany-843b31a0eddb2e88e565abb657f32f85994b0c0f.tar.xz
gsoc2013-epiphany-843b31a0eddb2e88e565abb657f32f85994b0c0f.tar.zst
gsoc2013-epiphany-843b31a0eddb2e88e565abb657f32f85994b0c0f.zip
Implement several missing methods.
Based on the patch by Cosimo Cecchi. This adds the stubs for proper net status notification, implements get_title, get_location and workarounds the bug in webkit that will make pages not load images if the protocol is not specified in the url (it will only work for http though). Fixes bug #461652 svn path=/trunk/; revision=7517
Diffstat (limited to 'embed/webkit/webkit-embed.cpp')
-rw-r--r--embed/webkit/webkit-embed.cpp176
1 files changed, 122 insertions, 54 deletions
diff --git a/embed/webkit/webkit-embed.cpp b/embed/webkit/webkit-embed.cpp
index 4f59e0bad..c9364a694 100644
--- a/embed/webkit/webkit-embed.cpp
+++ b/embed/webkit/webkit-embed.cpp
@@ -27,6 +27,7 @@
#include "ephy-string.h"
#include "ephy-embed-event.h"
+#include <webkitgtkframe.h>
#include <webkitgtkpage.h>
#include <webkitgtkglobal.h>
#include <string.h>
@@ -40,34 +41,6 @@ static void webkit_embed_destroy (GtkObject *object);
static void webkit_embed_finalize (GObject *object);
static void ephy_embed_iface_init (EphyEmbedIface *iface);
-#if 0
-static void load_started_cb (WebKitPage *page,
- WebKitFrame *frame,
- WebKitEmbed *wembed);
-
-static void webkit_embed_location_changed_cb (GtkMozEmbed *embed,
- WebKitEmbed *membed);
-static void webkit_embed_net_state_all_cb (GtkMozEmbed *embed,
- const char *aURI,
- gint state,
- guint status,
- WebKitEmbed *membed);
-static gboolean webkit_embed_dom_mouse_click_cb(GtkMozEmbed *embed,
- gpointer dom_event,
- WebKitEmbed *membed);
-static gboolean webkit_embed_dom_mouse_down_cb (GtkMozEmbed *embed,
-
-
- WebKitEmbed *membed);
-static gboolean webkit_embed_dom_key_press_cb (GtkMozEmbed *embed,
- gpointer dom_event,
- WebKitEmbed *membed);
-static void webkit_embed_new_window_cb (GtkMozEmbed *embed,
- GtkMozEmbed **newEmbed,
- guint chrome_mask,
- WebKitEmbed *membed);
-#endif
-
#define WEBKIT_EMBED_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), WEBKIT_TYPE_EMBED, WebKitEmbedPrivate))
typedef enum
@@ -82,6 +55,7 @@ struct WebKitEmbedPrivate
{
WebKitPage *page;
WebKitEmbedLoadState load_state;
+ char *loading_uri;
};
static void
@@ -121,14 +95,98 @@ impl_close (EphyEmbed *embed)
}
static void
+webkit_embed_title_changed_cb (WebKitFrame *frame,
+ gchar *title,
+ gchar *location,
+ EphyEmbed *embed)
+{
+ /* FIXME: We emit ge-location signal here, but it should really belong
+ * to a "location_changed" signal by WebKit, as we can change title
+ * without changing location or change location without changing title
+ */
+
+ g_signal_emit_by_name (embed, "ge-location", location, NULL);
+ g_signal_emit_by_name (embed, "title", title, NULL);
+}
+
+static void
+update_load_state (WebKitEmbed *embed, WebKitPage *page)
+{
+ 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);
+
+ g_signal_emit_by_name (EPHY_EMBED (embed), "ge_net_state",
+ embed->priv->loading_uri, estate);
+}
+
+static void
+webkit_embed_load_started_cb (WebKitPage *page,
+ WebKitFrame *frame,
+ EphyEmbed *embed)
+{
+ WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+ wembed->priv->load_state = WEBKIT_EMBED_LOAD_STARTED;
+
+ update_load_state (wembed, page);
+}
+
+static void
+webkit_embed_load_progress_changed_cb (WebKitPage *page,
+ 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;
+
+ /* FIXME: EphyTab seems to have a strange way of calculating progress,
+ * and it's not compatible with the simple integer value WebKit emits.
+ * EphyTab IMHO should use "progress" signal from GtkMozEmbed. That way,
+ * we could use the same functions for WebKit too.
+ */
+
+ update_load_state (wembed, page);
+}
+
+static void
+webkit_embed_load_finished_cb (WebKitPage *page,
+ WebKitFrame *frame,
+ EphyEmbed *embed)
+{
+ WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+ wembed->priv->load_state = WEBKIT_EMBED_LOAD_STOPPED;
+
+ update_load_state (wembed, page);
+
+ g_signal_emit_by_name (embed, "net-stop", NULL);
+}
+
+static void
webkit_embed_class_init (WebKitEmbedClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- webkit_embed_parent_class = (GObjectClass *) g_type_class_peek_parent (klass);
-
object_class->finalize = webkit_embed_finalize;
gtk_object_class->destroy = webkit_embed_destroy;
@@ -144,6 +202,7 @@ webkit_embed_init (WebKitEmbed *embed)
WebKitPage *page;
embed->priv = WEBKIT_EMBED_GET_PRIVATE (embed);
+ embed->priv->loading_uri = NULL;
gtk_scrolled_window_set_vadjustment (GTK_SCROLLED_WINDOW (embed), NULL);
gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (embed), NULL);
@@ -156,14 +215,14 @@ webkit_embed_init (WebKitEmbed *embed)
gtk_container_add (GTK_CONTAINER (embed), GTK_WIDGET (page));
gtk_widget_show (GTK_WIDGET (page));
-#if 0
g_signal_connect (G_OBJECT (page), "load-started",
- G_CALLBACK (load_started_cb), embed);
+ G_CALLBACK (webkit_embed_load_started_cb), embed);
+ g_signal_connect (G_OBJECT (page), "load_finished",
+ G_CALLBACK (webkit_embed_load_finished_cb), embed);
g_signal_connect (G_OBJECT (page), "title-changed",
- G_CALLBACK (title_changed_cb), page);
+ G_CALLBACK (webkit_embed_title_changed_cb), embed);
g_signal_connect (G_OBJECT (page), "load-progress-changed",
- G_CALLBACK (load_progress_changed), page);
-#endif
+ G_CALLBACK (webkit_embed_load_progress_changed_cb), embed);
}
static void
@@ -175,19 +234,12 @@ webkit_embed_destroy (GtkObject *object)
static void
webkit_embed_finalize (GObject *object)
{
- G_OBJECT_CLASS (webkit_embed_parent_class)->finalize (object);
-}
+ WebKitEmbed *wembed = WEBKIT_EMBED (object);
-#if 0
-static void
-load_started_cb (WebKitPage *page,
- WebKitFrame *frame,
- WebKitEmbed *wembed)
-{
- g_debug("load-started, emitting ge_location with www.google.com as location");
- g_signal_emit_by_name (wembed, "ge_location", "www.google.com");
+ g_free (wembed->priv->loading_uri);
+
+ G_OBJECT_CLASS (webkit_embed_parent_class)->finalize (object);
}
-#endif
static void
impl_load_url (EphyEmbed *embed,
@@ -195,13 +247,9 @@ impl_load_url (EphyEmbed *embed,
{
WebKitEmbed *wembed = WEBKIT_EMBED (embed);
- g_debug ("a url %s", url);
-
webkit_page_open (wembed->priv->page, url);
}
-static char * impl_get_location (EphyEmbed *embed, gboolean toplevel);
-
static void
impl_load (EphyEmbed *embed,
const char *url,
@@ -209,9 +257,27 @@ impl_load (EphyEmbed *embed,
EphyEmbed *preview_embed)
{
WebKitEmbed *wembed = WEBKIT_EMBED (embed);
+ char *effective_url = NULL;
- g_debug ("url %s", url);
- webkit_page_open (wembed->priv->page, url);
+ /* 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 ("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_page_open (wembed->priv->page, effective_url);
+
+ g_free (effective_url);
}
static void
@@ -264,7 +330,8 @@ impl_go_up (EphyEmbed *embed)
static char *
impl_get_title (EphyEmbed *embed)
{
- return NULL;
+ WebKitFrame *frame = webkit_page_get_main_frame (WEBKIT_EMBED (embed)->priv->page);
+ return g_strdup (webkit_frame_get_title (frame));
}
static char *
@@ -283,7 +350,8 @@ static char *
impl_get_location (EphyEmbed *embed,
gboolean toplevel)
{
- return NULL;
+ WebKitFrame *frame = webkit_page_get_main_frame (WEBKIT_EMBED (embed)->priv->page);
+ return g_strdup (webkit_frame_get_location (frame));
}
static void