aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Rego Casasnovas <rego@igalia.com>2013-02-25 18:58:40 +0800
committerClaudio Saavedra <csaavedra@igalia.com>2013-02-28 15:07:53 +0800
commit236494702aa8dab1af7992e8f82e1420372fff15 (patch)
tree55c3716ec5746d92055d6ff71132ff2c2b2d4ac5
parent6753ea9b24f5a46f3b96132dc43c89fdfa281e03 (diff)
downloadgsoc2013-epiphany-236494702aa8dab1af7992e8f82e1420372fff15.tar
gsoc2013-epiphany-236494702aa8dab1af7992e8f82e1420372fff15.tar.gz
gsoc2013-epiphany-236494702aa8dab1af7992e8f82e1420372fff15.tar.bz2
gsoc2013-epiphany-236494702aa8dab1af7992e8f82e1420372fff15.tar.lz
gsoc2013-epiphany-236494702aa8dab1af7992e8f82e1420372fff15.tar.xz
gsoc2013-epiphany-236494702aa8dab1af7992e8f82e1420372fff15.tar.zst
gsoc2013-epiphany-236494702aa8dab1af7992e8f82e1420372fff15.zip
Create ephy-web-dom-utils for sharing DOM bindings code between WK1 and WK2
https://bugzilla.gnome.org/show_bug.cgi?id=694659
-rw-r--r--embed/ephy-web-view.c62
-rw-r--r--embed/web-extension/Makefile.am7
-rw-r--r--embed/web-extension/ephy-web-extension.c65
-rw-r--r--lib/Makefile.am2
-rw-r--r--lib/ephy-web-dom-utils.c98
-rw-r--r--lib/ephy-web-dom-utils.h40
6 files changed, 157 insertions, 117 deletions
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index 0973b5cf1..96be4c55d 100644
--- a/embed/ephy-web-view.c
+++ b/embed/ephy-web-view.c
@@ -43,6 +43,7 @@
#include "ephy-settings.h"
#include "ephy-string.h"
#include "ephy-web-app-utils.h"
+#include "ephy-web-dom-utils.h"
#include "ephy-zoom.h"
#include <gio/gio.h>
@@ -3396,12 +3397,15 @@ ephy_web_view_set_typed_address (EphyWebView *view,
g_object_notify (G_OBJECT (view), "typed-address");
}
-#define MIN_INPUT_LENGTH 50
-
/**
* ephy_web_view_has_modified_forms:
* @view: an #EphyWebView
*
+ * A small heuristic is used here. If there's only one input element modified
+ * and it does not have a lot of text the user is likely not very interested in
+ * saving this work, so it returns %FALSE in this case (eg, google search
+ * input).
+ *
* Returns %TRUE if the user has modified &lt;input&gt; or &lt;textarea&gt;
* values in @view's loaded document.
*
@@ -3433,60 +3437,10 @@ ephy_web_view_has_modified_forms (EphyWebView *view)
return retval;
#else
- WebKitDOMHTMLCollection *forms = NULL;
- WebKitDOMDocument *document = NULL;
- gulong forms_n;
- int i;
-
g_return_val_if_fail (EPHY_IS_WEB_VIEW (view), FALSE);
- document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
- forms = webkit_dom_document_get_forms (document);
- forms_n = webkit_dom_html_collection_get_length (forms);
-
- for (i = 0; i < forms_n; i++) {
- WebKitDOMHTMLCollection *elements;
- WebKitDOMNode *form_element = webkit_dom_html_collection_item (forms, i);
- gulong elements_n;
- int j;
- gboolean modified_input_element = FALSE;
-
- elements = webkit_dom_html_form_element_get_elements (WEBKIT_DOM_HTML_FORM_ELEMENT (form_element));
- elements_n = webkit_dom_html_collection_get_length (elements);
-
- for (j = 0; j < elements_n; j++) {
- WebKitDOMNode *element;
-
- element = webkit_dom_html_collection_item (elements, j);
-
- if (WEBKIT_DOM_IS_HTML_TEXT_AREA_ELEMENT (element))
- if (webkit_dom_html_text_area_element_is_edited (WEBKIT_DOM_HTML_TEXT_AREA_ELEMENT (element)))
- return TRUE;
-
- if (WEBKIT_DOM_IS_HTML_INPUT_ELEMENT (element))
- if (webkit_dom_html_input_element_is_edited (WEBKIT_DOM_HTML_INPUT_ELEMENT (element))) {
- glong length;
- char *text;
-
- /* A small heuristic here. If there's only one input element
- * modified and it does not have a lot of text the user is
- * likely not very interested in saving this work, so do
- * nothing (eg, google search input). */
- if (modified_input_element)
- return TRUE;
-
- modified_input_element = TRUE;
-
- text = webkit_dom_html_input_element_get_value (WEBKIT_DOM_HTML_INPUT_ELEMENT (element));
- length = g_utf8_strlen (text, -1);
- g_free (text);
-
- if (length > MIN_INPUT_LENGTH)
- return TRUE;
- }
- }
- }
- return FALSE;
+ WebKitDOMDocument *document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
+ return ephy_web_dom_has_modified_forms (document);
#endif
}
diff --git a/embed/web-extension/Makefile.am b/embed/web-extension/Makefile.am
index fe7277288..b11f40689 100644
--- a/embed/web-extension/Makefile.am
+++ b/embed/web-extension/Makefile.am
@@ -1,11 +1,16 @@
webextension_LTLIBRARIES = libephywebextension.la
+INCLUDES = \
+ -I$(top_srcdir)/lib
+
webextensiondir = \
$(libdir)/epiphany/$(EPIPHANY_MAJOR)/web-extensions
libephywebextension_la_SOURCES = \
ephy-web-extension.c \
- ephy-web-extension.h
+ ephy-web-extension.h \
+ $(top_srcdir)/lib/ephy-web-dom-utils.c \
+ $(top_srcdir)/lib/ephy-web-dom-utils.h
libephywebextension_la_CPPFLAG = \
$(AM_CPPFLAGS)
diff --git a/embed/web-extension/ephy-web-extension.c b/embed/web-extension/ephy-web-extension.c
index 8eb93e8a7..2355228e7 100644
--- a/embed/web-extension/ephy-web-extension.c
+++ b/embed/web-extension/ephy-web-extension.c
@@ -19,6 +19,7 @@
#include "config.h"
#include "ephy-web-extension.h"
+#include "ephy-web-dom-utils.h"
#include <gio/gio.h>
#include <webkit2/webkit-web-extension.h>
@@ -33,66 +34,6 @@ static const char introspection_xml[] =
" </interface>"
"</node>";
-#define MIN_INPUT_LENGTH 50
-
-static gboolean
-ephy_web_extension_page_has_modified_forms (WebKitWebPage *web_page)
-{
- WebKitDOMHTMLCollection *forms = NULL;
- WebKitDOMDocument *document = NULL;
- gulong forms_n;
- int i;
-
- document = webkit_web_page_get_dom_document (web_page);
- forms = webkit_dom_document_get_forms (document);
- forms_n = webkit_dom_html_collection_get_length (forms);
-
- for (i = 0; i < forms_n; i++) {
- WebKitDOMHTMLCollection *elements;
- WebKitDOMNode *form_element = webkit_dom_html_collection_item (forms, i);
- gulong elements_n;
- int j;
- gboolean modified_input_element = FALSE;
-
- elements = webkit_dom_html_form_element_get_elements (WEBKIT_DOM_HTML_FORM_ELEMENT (form_element));
- elements_n = webkit_dom_html_collection_get_length (elements);
-
- for (j = 0; j < elements_n; j++) {
- WebKitDOMNode *element;
-
- element = webkit_dom_html_collection_item (elements, j);
-
- if (WEBKIT_DOM_IS_HTML_TEXT_AREA_ELEMENT (element))
- if (webkit_dom_html_text_area_element_is_edited (WEBKIT_DOM_HTML_TEXT_AREA_ELEMENT (element)))
- return TRUE;
-
- if (WEBKIT_DOM_IS_HTML_INPUT_ELEMENT (element))
- if (webkit_dom_html_input_element_is_edited (WEBKIT_DOM_HTML_INPUT_ELEMENT (element))) {
- glong length;
- char *text;
-
- /* A small heuristic here. If there's only one input element
- * modified and it does not have a lot of text the user is
- * likely not very interested in saving this work, so do
- * nothing (eg, google search input). */
- if (modified_input_element)
- return TRUE;
-
- modified_input_element = TRUE;
-
- text = webkit_dom_html_input_element_get_value (WEBKIT_DOM_HTML_INPUT_ELEMENT (element));
- length = g_utf8_strlen (text, -1);
- g_free (text);
-
- if (length > MIN_INPUT_LENGTH)
- return TRUE;
- }
- }
- }
-
- return FALSE;
-}
-
static void
handle_method_call (GDBusConnection *connection,
const char *sender,
@@ -119,9 +60,9 @@ handle_method_call (GDBusConnection *connection,
}
if (g_strcmp0 (method_name, "HasModifiedForms") == 0) {
- gboolean has_modifed_forms;
+ WebKitDOMDocument *document = webkit_web_page_get_dom_document (web_page);
+ gboolean has_modifed_forms = ephy_web_dom_has_modified_forms (document);
- has_modifed_forms = ephy_web_extension_page_has_modified_forms (web_page);
g_dbus_method_invocation_return_value (invocation, g_variant_new ("(b)", has_modifed_forms));
}
}
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 7f9b69c94..e7d039ba0 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -24,6 +24,7 @@ NOINST_H_FILES = \
ephy-snapshot-service.h \
ephy-time-helpers.h \
ephy-web-app-utils.h \
+ ephy-web-dom-utils.h \
ephy-zoom.h
TYPES_H_FILES = \
@@ -65,6 +66,7 @@ libephymisc_la_SOURCES = \
ephy-string.c \
ephy-time-helpers.c \
ephy-web-app-utils.c \
+ ephy-web-dom-utils.c \
ephy-zoom.c \
$(INST_H_FILES) \
$(NOINST_H_FILES)
diff --git a/lib/ephy-web-dom-utils.c b/lib/ephy-web-dom-utils.c
new file mode 100644
index 000000000..52fb6766e
--- /dev/null
+++ b/lib/ephy-web-dom-utils.c
@@ -0,0 +1,98 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set sw=2 ts=2 sts=2 et: */
+/*
+ * Copyright © 2013 Igalia S.L.
+ *
+ * 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-web-dom-utils.h"
+
+#ifdef HAVE_WEBKIT2
+#include <webkit2/webkit2.h>
+#include <webkit2/webkit-web-extension.h>
+#else
+#include <webkit/webkit.h>
+#endif
+
+/**
+ * ephy_web_dom_has_modified_forms:
+ * @document: the DOM document to check if there are or not modified forms.
+ *
+ * A small heuristic is used here. If there's only one input element modified
+ * and it does not have a lot of text the user is likely not very interested in
+ * saving this work, so it returns %FALSE in this case (eg, google search
+ * input).
+ *
+ * Returns %TRUE if the user has modified &lt;input&gt; or &lt;textarea&gt;
+ * values in the @document.
+ **/
+gboolean
+ephy_web_dom_has_modified_forms (WebKitDOMDocument *document)
+{
+ WebKitDOMHTMLCollection *forms;
+ gulong forms_n;
+ int i;
+
+ forms = webkit_dom_document_get_forms (document);
+ forms_n = webkit_dom_html_collection_get_length (forms);
+
+ for (i = 0; i < forms_n; i++) {
+ WebKitDOMHTMLCollection *elements;
+ WebKitDOMNode *form_element = webkit_dom_html_collection_item (forms, i);
+ gulong elements_n;
+ int j;
+ gboolean modified_input_element = FALSE;
+
+ elements = webkit_dom_html_form_element_get_elements (WEBKIT_DOM_HTML_FORM_ELEMENT (form_element));
+ elements_n = webkit_dom_html_collection_get_length (elements);
+
+ for (j = 0; j < elements_n; j++) {
+ WebKitDOMNode *element;
+
+ element = webkit_dom_html_collection_item (elements, j);
+
+ if (WEBKIT_DOM_IS_HTML_TEXT_AREA_ELEMENT (element))
+ if (webkit_dom_html_text_area_element_is_edited (WEBKIT_DOM_HTML_TEXT_AREA_ELEMENT (element)))
+ return TRUE;
+
+ if (WEBKIT_DOM_IS_HTML_INPUT_ELEMENT (element))
+ if (webkit_dom_html_input_element_is_edited (WEBKIT_DOM_HTML_INPUT_ELEMENT (element))) {
+ glong length;
+ char *text;
+
+ /* A small heuristic here. If there's only one input element
+ * modified and it does not have a lot of text the user is
+ * likely not very interested in saving this work, so do
+ * nothing (eg, google search input). */
+ if (modified_input_element)
+ return TRUE;
+
+ modified_input_element = TRUE;
+
+ text = webkit_dom_html_input_element_get_value (WEBKIT_DOM_HTML_INPUT_ELEMENT (element));
+ length = g_utf8_strlen (text, -1);
+ g_free (text);
+
+ if (length > 50)
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
diff --git a/lib/ephy-web-dom-utils.h b/lib/ephy-web-dom-utils.h
new file mode 100644
index 000000000..b5dbd255c
--- /dev/null
+++ b/lib/ephy-web-dom-utils.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2013 Igalia S.L.
+ *
+ * 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.
+ *
+ */
+
+#if !defined (__EPHY_EPIPHANY_H_INSIDE__) && !defined (EPIPHANY_COMPILATION)
+#error "Only <epiphany/epiphany.h> can be included directly."
+#endif
+
+#ifndef EPHY_WEB_DOM_UTILS_H
+#define EPHY_WEB_DOM_UTILS_H
+
+#ifdef HAVE_WEBKIT2
+#include <webkit2/webkit2.h>
+#include <webkit2/webkit-web-extension.h>
+#else
+#include <webkit/webkit.h>
+#endif
+
+G_BEGIN_DECLS
+
+gboolean ephy_web_dom_has_modified_forms (WebKitDOMDocument *document);
+
+G_END_DECLS
+
+#endif