[evolution/wip/mcrha/webkit-jsc-api] Extend test_get_element_from_point() to test also when being scrolled



commit f626c9db98366af13dd7c4886d22852053ae939a
Author: Milan Crha <mcrha redhat com>
Date:   Tue Oct 8 17:47:30 2019 +0200

    Extend test_get_element_from_point() to test also when being scrolled

 src/e-util/test-web-view-jsc.c        | 88 ++++++++++++++++++++++++++++++-----
 src/web-extensions/evolution-utils.js |  3 +-
 2 files changed, 79 insertions(+), 12 deletions(-)
---
diff --git a/src/e-util/test-web-view-jsc.c b/src/e-util/test-web-view-jsc.c
index 2179b05577..f5dbdc43ca 100644
--- a/src/e-util/test-web-view-jsc.c
+++ b/src/e-util/test-web-view-jsc.c
@@ -1777,7 +1777,8 @@ test_get_element_from_point (TestFixture *fixture)
                { "empty:///frm2", "frm2", "btn1" },
                { "empty:///frm2", "frm2", "btn2" }
        };
-       gint ii;
+       gchar *script;
+       gint ii, scroll_x, scroll_y, client_width, client_height, tested;
 
        test_utils_load_body (fixture, LOAD_ALL);
 
@@ -1793,14 +1794,15 @@ test_get_element_from_point (TestFixture *fixture)
                "               }\n"
                "       }\n"
                "       var res = [];\n"
-               "       res[\"left\"] = xx + (elem.offsetWidth / 2);\n"
-               "       res[\"top\"] = yy + (elem.offsetHeight / 2);\n"
+               "       res[\"left\"] = xx + (elem.offsetWidth / 2) - window.scrollX;\n"
+               "       res[\"right\"] = xx + elem.offsetWidth - 2 - window.scrollX;\n"
+               "       res[\"top\"] = yy + (elem.offsetHeight / 2) - window.scrollY;\n"
                "       return res;"
                "}\n"
                "\n"
                /* To not scroll in the frm1 */
-               "document.getElementById(\"frm1\").height = 
document.getElementById(\"frm1\").contentDocument.getElementById(\"btn1\").offsetTop + "
-               "2 * 
document.getElementById(\"frm1\").contentDocument.getElementById(\"btn1\").offsetHeight;\n"
+               "document.getElementById(\"frm1\").height = 
document.getElementById(\"frm1\").contentDocument.getElementById(\"btn1\").offsetTop +"
+               " 2 * 
document.getElementById(\"frm1\").contentDocument.getElementById(\"btn1\").offsetHeight;\n"
                "\n"
                "document.body.scrollHeight;\n");
 
@@ -1819,7 +1821,7 @@ test_get_element_from_point (TestFixture *fixture)
                const gchar *iframe_src;
                gchar *script;
                JSCValue *value;
-               gint left, top;
+               gint xx, yy;
 
                script = e_web_view_jsc_printf_script ("TestGetPosition(%s, %s);", elems[ii].iframe_id, 
elems[ii].elem_id);
 
@@ -1828,11 +1830,11 @@ test_get_element_from_point (TestFixture *fixture)
                g_assert_nonnull (value);
                g_assert (jsc_value_is_object (value));
 
-               left = e_web_view_jsc_get_object_property_int32 (value, "left", -1);
-               top = e_web_view_jsc_get_object_property_int32 (value, "top", -1);
+               xx = e_web_view_jsc_get_object_property_int32 (value, "left", -1);
+               yy = e_web_view_jsc_get_object_property_int32 (value, "top", -1);
 
-               g_assert_cmpint (left, >, -1);
-               g_assert_cmpint (top, >, -1);
+               g_assert_cmpint (xx, >, -1);
+               g_assert_cmpint (yy, >, -1);
 
                g_clear_object (&value);
                g_free (script);
@@ -1842,7 +1844,7 @@ test_get_element_from_point (TestFixture *fixture)
                if (!iframe_src)
                        iframe_src = webkit_web_view_get_uri (fixture->web_view);
 
-               test_utils_verify_get_element_from_point (fixture, left, top, iframe_src, 
elems[ii].iframe_id, elems[ii].elem_id);
+               test_utils_verify_get_element_from_point (fixture, xx, yy, iframe_src, elems[ii].iframe_id, 
elems[ii].elem_id);
        }
 
        test_utils_verify_get_element_from_point (fixture, -1, -1, webkit_web_view_get_uri 
(fixture->web_view), "", "");
@@ -1850,6 +1852,70 @@ test_get_element_from_point (TestFixture *fixture)
        test_utils_jsc_call_sync (fixture, "Evo.findIFrameDocument(\"\").getElementById(\"btn3\").focus();", 
NULL);
 
        test_utils_verify_get_element_from_point (fixture, -1, -1, webkit_web_view_get_uri 
(fixture->web_view), "", "btn3");
+
+       scroll_x = test_utils_jsc_call_int32_sync (fixture, "document.body.scrollWidth;") / 2;
+       scroll_y = test_utils_jsc_call_int32_sync (fixture, "document.body.scrollHeight;") / 2;
+
+       /* To scroll in the overall document */
+       gtk_widget_set_size_request (fixture->window, -1, -1);
+       gtk_window_resize (GTK_WINDOW (fixture->window), scroll_x, scroll_y);
+
+       /* Window/widget resize is done asynchronously, thus wait for it */
+       g_signal_connect (fixture->window, "size-allocate",
+               G_CALLBACK (window_size_allocated_cb), fixture);
+
+       test_utils_wait (fixture);
+
+       g_signal_handlers_disconnect_by_func (fixture->window, G_CALLBACK (window_size_allocated_cb), 
fixture);
+
+       /* Scroll by some value */
+       scroll_x /= 2;
+       scroll_y /= 2;
+       script = e_web_view_jsc_printf_script ("window.scrollBy(%d,%d);", scroll_x, scroll_y);
+       test_utils_jsc_call_sync (fixture, script, NULL);
+       g_free (script);
+
+       test_utils_wait_noop (fixture);
+
+       scroll_x = test_utils_jsc_call_int32_sync (fixture, "window.scrollX;");
+       scroll_y = test_utils_jsc_call_int32_sync (fixture, "window.scrollY;");
+       client_width = test_utils_jsc_call_int32_sync (fixture, "document.body.clientWidth;");
+       client_height = test_utils_jsc_call_int32_sync (fixture, "document.body.clientHeight;");
+
+       tested = 0;
+
+       for (ii = 0; ii < G_N_ELEMENTS (elems); ii++) {
+               const gchar *iframe_src;
+               gchar *script;
+               JSCValue *value;
+               gint xx, yy;
+
+               script = e_web_view_jsc_printf_script ("TestGetPosition(%s, %s);", elems[ii].iframe_id, 
elems[ii].elem_id);
+
+               test_utils_jsc_call_sync (fixture, script, &value);
+
+               g_assert_nonnull (value);
+               g_assert (jsc_value_is_object (value));
+
+               xx = e_web_view_jsc_get_object_property_int32 (value, "right", -1);
+               yy = e_web_view_jsc_get_object_property_int32 (value, "top", -1);
+
+               g_clear_object (&value);
+               g_free (script);
+
+               if (xx >= 0 && xx < client_width && yy >= 0 && yy < client_height) {
+                       iframe_src = elems[ii].iframe_src;
+
+                       if (!iframe_src)
+                               iframe_src = webkit_web_view_get_uri (fixture->web_view);
+
+                       test_utils_verify_get_element_from_point (fixture, xx, yy, iframe_src, 
elems[ii].iframe_id, elems[ii].elem_id);
+
+                       tested++;
+               }
+       }
+
+       g_assert_cmpint (tested, >, 0);
 }
 
 gint
diff --git a/src/web-extensions/evolution-utils.js b/src/web-extensions/evolution-utils.js
index 8a484e48ae..963b24bb9d 100644
--- a/src/web-extensions/evolution-utils.js
+++ b/src/web-extensions/evolution-utils.js
@@ -523,7 +523,8 @@ Evo.findElementFromPoint = function(doc, xx, yy, parent_elem)
                                top_offset += offset_parent.offsetTop - offset_parent.scrollTop;
 
                                offset_parent = offset_parent.offsetParent;
-                       } while (offset_parent);
+                       /* Stop on body, because it sometimes have the same offset/scroll values as its 
iframe parent and sometimes not. */
+                       } while (offset_parent && !(/* offset_parent instanceof HTMLBodyElement */ 
offset_parent.tagName.toUpperCase() == "BODY"));
                }
 
                elem = doc.elementFromPoint(xx - left_offset + window.scrollX, yy - top_offset + 
window.scrollY);


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