aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ephy-find-toolbar.c104
1 files changed, 95 insertions, 9 deletions
diff --git a/src/ephy-find-toolbar.c b/src/ephy-find-toolbar.c
index d8ce10eab..3f13053f8 100644
--- a/src/ephy-find-toolbar.c
+++ b/src/ephy-find-toolbar.c
@@ -41,6 +41,9 @@ struct _EphyFindToolbarPrivate
{
EphyWindow *window;
WebKitWebView *web_view;
+#ifdef HAVE_WEBKIT2
+ WebKitFindController *controller;
+#endif
GtkWidget *entry;
GtkWidget *label;
GtkToolItem *next;
@@ -239,12 +242,10 @@ find_prev_cb (EphyFindToolbar *toolbar)
g_signal_emit (toolbar, signals[PREVIOUS], 0);
}
+#ifndef HAVE_WEBKIT2
static void
ephy_find_toolbar_mark_matches (EphyFindToolbar *toolbar)
{
-#ifdef HAVE_WEBKIT2
- /* TODO: Find */
-#else
EphyFindToolbarPrivate *priv = toolbar->priv;
WebKitWebView *web_view = priv->web_view;
gboolean case_sensitive;
@@ -258,9 +259,28 @@ ephy_find_toolbar_mark_matches (EphyFindToolbar *toolbar)
case_sensitive,
0);
webkit_web_view_set_highlight_text_matches (web_view, TRUE);
+}
#endif
+
+#ifdef HAVE_WEBKIT2
+static void
+real_find (EphyFindToolbarPrivate *priv,
+ EphyFindDirection direction)
+{
+ WebKitFindOptions options = WEBKIT_FIND_OPTIONS_NONE;
+
+ if (!g_strcmp0 (priv->find_string, ""))
+ return;
+
+ if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->case_sensitive)))
+ options |= WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE;
+ if (direction == EPHY_FIND_DIRECTION_PREV)
+ options |= WEBKIT_FIND_OPTIONS_BACKWARDS;
+
+ webkit_find_controller_search (priv->controller, priv->find_string, options, G_MAXUINT);
}
+#else
static EphyFindResult
real_find (EphyFindToolbarPrivate *priv,
EphyFindDirection direction)
@@ -272,10 +292,6 @@ real_find (EphyFindToolbarPrivate *priv,
if (!priv->find_string || !g_strcmp0 (priv->find_string, ""))
return EPHY_FIND_RESULT_NOTFOUND;
-#ifdef HAVE_WEBKIT2
- /* TODO: Find */
- return EPHY_FIND_RESULT_NOTFOUND;
-#else
if (!webkit_web_view_search_text
(web_view, priv->find_string, case_sensitive, forward, FALSE)) {
/* not found, try to wrap */
@@ -290,25 +306,64 @@ real_find (EphyFindToolbarPrivate *priv,
}
return EPHY_FIND_RESULT_FOUND;
-#endif
}
+#endif
static gboolean
do_search (EphyFindToolbar *toolbar)
{
EphyFindToolbarPrivate *priv = toolbar->priv;
+#ifndef HAVE_WEBKIT2
EphyFindResult result;
+#endif
priv->find_source_id = 0;
+#ifdef HAVE_WEBKIT2
+ real_find (priv, EPHY_FIND_DIRECTION_NEXT);
+#else
ephy_find_toolbar_mark_matches (toolbar);
result = real_find (priv, EPHY_FIND_DIRECTION_NEXT);
set_status (toolbar, result);
+#endif
return FALSE;
}
+#ifdef HAVE_WEBKIT2
+static void
+found_text_cb (WebKitFindController *controller,
+ guint n_matches,
+ EphyFindToolbar *toolbar)
+{
+ WebKitFindOptions options;
+ EphyFindResult result;
+
+ options = webkit_find_controller_get_options (controller);
+ /* FIXME: it's not possible to remove the wrap flag, so the status is now always wrapped. */
+ result = options & WEBKIT_FIND_OPTIONS_WRAP_AROUND ? EPHY_FIND_RESULT_FOUNDWRAPPED : EPHY_FIND_RESULT_FOUND;
+ set_status (toolbar, result);
+}
+
+static void
+failed_to_find_text_cb (WebKitFindController *controller,
+ EphyFindToolbar *toolbar)
+{
+ EphyFindToolbarPrivate *priv = toolbar->priv;
+ WebKitFindOptions options;
+
+ options = webkit_find_controller_get_options (controller);
+ if (options & WEBKIT_FIND_OPTIONS_WRAP_AROUND) {
+ set_status (toolbar, EPHY_FIND_RESULT_NOTFOUND);
+ return;
+ }
+
+ options |= WEBKIT_FIND_OPTIONS_WRAP_AROUND;
+ webkit_find_controller_search (controller, priv->find_string, options, G_MAXUINT);
+}
+#endif
+
static void
entry_changed_cb (GtkEntry *entry,
EphyFindToolbar *toolbar)
@@ -446,6 +501,10 @@ case_sensitive_toggled_cb (GtkWidget *check,
(proxy, G_CALLBACK (case_sensitive_menu_toggled_cb), toolbar);
}
+#ifdef HAVE_WEBKIT2
+ do_search (toolbar);
+#else
+
ephy_find_toolbar_mark_matches (toolbar);
/*
@@ -466,6 +525,7 @@ case_sensitive_toggled_cb (GtkWidget *check,
set_status (toolbar, result);
}
+#endif
}
static gboolean
@@ -788,6 +848,12 @@ ephy_find_toolbar_set_embed (EphyFindToolbar *toolbar,
if (priv->web_view != NULL)
{
+#ifdef HAVE_WEBKIT2
+ g_signal_handlers_disconnect_matched (priv->controller,
+ G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, toolbar);
+#endif
+
g_signal_handlers_disconnect_matched (EPHY_WEB_VIEW (web_view),
G_SIGNAL_MATCH_DATA,
0, 0, NULL, NULL, toolbar);
@@ -796,6 +862,16 @@ ephy_find_toolbar_set_embed (EphyFindToolbar *toolbar,
priv->web_view = web_view;
if (web_view != NULL)
{
+#ifdef HAVE_WEBKIT2
+ priv->controller = webkit_web_view_get_find_controller (web_view);
+ g_signal_connect_object (priv->controller, "found-text",
+ G_CALLBACK (found_text_cb),
+ toolbar, 0);
+ g_signal_connect_object (priv->controller, "failed-to-find-text",
+ G_CALLBACK (failed_to_find_text_cb),
+ toolbar, 0);
+#endif
+
clear_status (toolbar);
g_signal_connect_object (EPHY_WEB_VIEW (web_view), "search-key-press",
@@ -804,6 +880,7 @@ ephy_find_toolbar_set_embed (EphyFindToolbar *toolbar,
}
}
+#ifndef HAVE_WEBKIT2
typedef struct
{
EphyFindToolbar *toolbar;
@@ -867,17 +944,26 @@ find_again (EphyFindToolbar *toolbar, EphyFindDirection direction)
data,
(GDestroyNotify) find_again_data_destroy_cb);
}
+#endif
void
ephy_find_toolbar_find_next (EphyFindToolbar *toolbar)
{
+#ifdef HAVE_WEBKIT2
+ webkit_find_controller_search_next (toolbar->priv->controller);
+#else
find_again (toolbar, EPHY_FIND_DIRECTION_NEXT);
+#endif
}
void
ephy_find_toolbar_find_previous (EphyFindToolbar *toolbar)
{
+#ifdef HAVE_WEBKIT2
+ webkit_find_controller_search_previous (toolbar->priv->controller);
+#else
find_again (toolbar, EPHY_FIND_DIRECTION_PREV);
+#endif
}
void
@@ -909,7 +995,7 @@ ephy_find_toolbar_close (EphyFindToolbar *toolbar)
if (priv->web_view == NULL) return;
#ifdef HAVE_WEBKIT2
- /* TODO: Find */
+ webkit_find_controller_search_finish (toolbar->priv->controller);
#else
webkit_web_view_set_highlight_text_matches (priv->web_view, FALSE);
#endif