[epiphany] Create ephy-web-dom-utils for sharing DOM bindings code between WK1 and WK2



commit 236494702aa8dab1af7992e8f82e1420372fff15
Author: Manuel Rego Casasnovas <rego igalia com>
Date:   Mon Feb 25 11:58:40 2013 +0100

    Create ephy-web-dom-utils for sharing DOM bindings code between WK1 and WK2
    
    https://bugzilla.gnome.org/show_bug.cgi?id=694659

 embed/ephy-web-view.c                    |   62 +++----------------
 embed/web-extension/Makefile.am          |    7 ++-
 embed/web-extension/ephy-web-extension.c |   65 +-------------------
 lib/Makefile.am                          |    2 +
 lib/ephy-web-dom-utils.c                 |   98 ++++++++++++++++++++++++++++++
 lib/ephy-web-dom-utils.h                 |   40 ++++++++++++
 6 files changed, 157 insertions(+), 117 deletions(-)
---
diff --git a/embed/ephy-web-view.c b/embed/ephy-web-view.c
index 0973b5c..96be4c5 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 fe72772..b11f406 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 8eb93e8..2355228 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 7f9b69c..e7d039b 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 0000000..52fb676
--- /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 0000000..b5dbd25
--- /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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]