aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@src.gnome.org>2008-06-17 22:47:01 +0800
committerCosimo Cecchi <cosimoc@src.gnome.org>2008-06-17 22:47:01 +0800
commit1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3 (patch)
tree62b37e4255ebe65f1cbb2b29594cb682b0a12194
parent6b624c65e1394a72ae33e3d29b2b990943eb24a4 (diff)
downloadgsoc2013-epiphany-1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3.tar
gsoc2013-epiphany-1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3.tar.gz
gsoc2013-epiphany-1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3.tar.bz2
gsoc2013-epiphany-1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3.tar.lz
gsoc2013-epiphany-1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3.tar.xz
gsoc2013-epiphany-1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3.tar.zst
gsoc2013-epiphany-1a5f7ff8a8fad7b80324f45bcc99076462bd7dd3.zip
Implement search in page for the WebKit embed.
svn path=/trunk/; revision=8284
-rw-r--r--embed/webkit/webkit-embed-find.c90
1 files changed, 81 insertions, 9 deletions
diff --git a/embed/webkit/webkit-embed-find.c b/embed/webkit/webkit-embed-find.c
index 7b9887840..b91545989 100644
--- a/embed/webkit/webkit-embed-find.c
+++ b/embed/webkit/webkit-embed-find.c
@@ -25,19 +25,43 @@
#include "ephy-embed-find.h"
#include "ephy-embed-shell.h"
+#include <webkit/webkit.h>
+
#include "webkit-embed-find.h"
#define WEBKIT_EMBED_FIND_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), WEBKIT_TYPE_EMBED_FIND, WebKitEmbedFindPrivate))
struct _WebKitEmbedFindPrivate
{
-
+ WebKitWebView *web_view;
+ char *find_string;
+ gboolean case_sensitive;
};
static void
impl_set_embed (EphyEmbedFind *efind,
EphyEmbed *embed)
{
+ WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (efind)->priv;
+
+ priv->web_view = WEBKIT_WEB_VIEW (gtk_bin_get_child (GTK_BIN (gtk_bin_get_child (GTK_BIN (embed)))));
+}
+
+static void
+set_string_and_highlight (WebKitEmbedFindPrivate *priv, const char *find_string)
+{
+ WebKitWebView *web_view = priv->web_view;
+
+ if (g_strcmp0 (priv->find_string, find_string) != 0) {
+ g_free (priv->find_string);
+ priv->find_string = g_strdup (find_string);
+ }
+ webkit_web_view_unmark_text_matches (web_view);
+ webkit_web_view_mark_text_matches (web_view,
+ priv->find_string,
+ priv->case_sensitive,
+ 0);
+ webkit_web_view_set_highlight_text_matches (web_view, TRUE);
}
static void
@@ -45,6 +69,33 @@ impl_set_properties (EphyEmbedFind *efind,
const char *find_string,
gboolean case_sensitive)
{
+ WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (efind)->priv;
+
+ priv->case_sensitive = case_sensitive;
+ set_string_and_highlight (priv, find_string);
+}
+
+static EphyEmbedFindResult
+real_find (WebKitEmbedFind *wefind,
+ gboolean forward)
+{
+ WebKitEmbedFindPrivate *priv = wefind->priv;
+ WebKitWebView *web_view = priv->web_view;
+
+ if (!webkit_web_view_search_text
+ (web_view, priv->find_string, priv->case_sensitive, TRUE, FALSE)) {
+ /* not found, try to wrap */
+ if (!webkit_web_view_search_text
+ (web_view, priv->find_string, priv->case_sensitive, TRUE, TRUE)) {
+ /* there's no result */
+ return EPHY_EMBED_FIND_NOTFOUND;
+ } else {
+ /* found wrapped */
+ return EPHY_EMBED_FIND_FOUNDWRAPPED;
+ }
+ }
+
+ return EPHY_EMBED_FIND_FOUND;
}
static EphyEmbedFindResult
@@ -52,7 +103,11 @@ impl_find (EphyEmbedFind *efind,
const char *find_string,
gboolean links_only)
{
- return EPHY_EMBED_FIND_FOUND;
+ WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (efind)->priv;
+
+ set_string_and_highlight (priv, find_string);
+
+ return real_find (WEBKIT_EMBED_FIND (efind), TRUE);
}
static EphyEmbedFindResult
@@ -60,13 +115,16 @@ impl_find_again (EphyEmbedFind *efind,
gboolean forward,
gboolean links_only)
{
- return EPHY_EMBED_FIND_FOUND;
+ return real_find (WEBKIT_EMBED_FIND (efind), forward);
}
static void
impl_set_selection (EphyEmbedFind *efind,
gboolean attention)
{
+ WebKitWebView *web_view = WEBKIT_EMBED_FIND (efind)->priv->web_view;
+
+ webkit_web_view_set_highlight_text_matches (web_view, attention);
}
static gboolean
@@ -90,18 +148,32 @@ ephy_find_iface_init (EphyEmbedFindIface *iface)
static void
webkit_embed_find_init (WebKitEmbedFind *find)
{
+ WebKitEmbedFindPrivate *priv = find->priv = WEBKIT_EMBED_FIND_GET_PRIVATE (find);
+
+ priv->web_view = NULL;
+ priv->case_sensitive = FALSE;
+ priv->find_string = NULL;
+}
+
+G_DEFINE_TYPE_WITH_CODE (WebKitEmbedFind, webkit_embed_find, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (EPHY_TYPE_EMBED_FIND,
+ ephy_find_iface_init))
+
+static void
+webkit_embed_find_finalize (GObject *o)
+{
+ WebKitEmbedFindPrivate *priv = WEBKIT_EMBED_FIND (o)->priv;
+
+ g_free (priv->find_string);
+ G_OBJECT_CLASS (webkit_embed_find_parent_class)->finalize (o);
}
static void
webkit_embed_find_class_init (WebKitEmbedFindClass *klass)
{
-#if 0
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = webkit_embed_find_finalize;
g_type_class_add_private (object_class, sizeof (WebKitEmbedFindPrivate));
-#endif
}
-
-G_DEFINE_TYPE_WITH_CODE (WebKitEmbedFind, webkit_embed_find, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (EPHY_TYPE_EMBED_FIND,
- ephy_find_iface_init))