diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Tools/TestWebKitAPI/Tests/WebKit2Gtk/DOMDOMWindowTest.cpp | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKit2Gtk/DOMDOMWindowTest.cpp')
-rw-r--r-- | Tools/TestWebKitAPI/Tests/WebKit2Gtk/DOMDOMWindowTest.cpp | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/DOMDOMWindowTest.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/DOMDOMWindowTest.cpp new file mode 100644 index 000000000..fc8cefb52 --- /dev/null +++ b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/DOMDOMWindowTest.cpp @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2013 Igalia S.L. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "config.h" + +#include "WebProcessTest.h" +#include <gio/gio.h> +#include <webkit2/webkit-web-extension.h> +#include <wtf/RunLoop.h> + +class WebKitDOMDOMWindowTest; +static gboolean loadedCallback(WebKitDOMDOMWindow*, WebKitDOMEvent*, WebKitDOMDOMWindowTest*); +static gboolean clickedCallback(WebKitDOMDOMWindow*, WebKitDOMEvent*, WebKitDOMDOMWindowTest*); + +class WebKitDOMDOMWindowTest : public WebProcessTest { +public: + static std::unique_ptr<WebProcessTest> create() { return std::make_unique<WebKitDOMDOMWindowTest>(); } + +private: + guint64 webPageFromArgs(GVariant* args) + { + GVariantIter iter; + g_variant_iter_init(&iter, args); + + const char* key; + GVariant* value; + while (g_variant_iter_loop(&iter, "{&sv}", &key, &value)) { + if (!strcmp(key, "pageID") && g_variant_classify(value) == G_VARIANT_CLASS_UINT64) + return g_variant_get_uint64(value); + } + + g_assert_not_reached(); + return 0; + } + + bool testSignals(WebKitWebExtension* extension, GVariant* args) + { + notify("ready", ""); + + WebKitWebPage* page = webkit_web_extension_get_page(extension, webPageFromArgs(args)); + g_assert(WEBKIT_IS_WEB_PAGE(page)); + WebKitDOMDocument* document = webkit_web_page_get_dom_document(page); + g_assert(WEBKIT_DOM_IS_DOCUMENT(document)); + + WebKitDOMDOMWindow* domWindow = webkit_dom_document_get_default_view(document); + g_assert(domWindow); + + // The "load" WebKitDOMDOMWindow signal is issued before this test is + // called. There's no way to capture it here. We simply assume that + // the document is loaded and notify the uiprocess accordingly + // notify("loaded", ""); + + webkit_dom_event_target_add_event_listener( + WEBKIT_DOM_EVENT_TARGET(domWindow), + "load", + G_CALLBACK(loadedCallback), + false, + this); + + // loadedCallback() will stop this loop + RunLoop::run(); + + document = webkit_web_page_get_dom_document(page); + g_assert(WEBKIT_DOM_IS_DOCUMENT(document)); + + WebKitDOMElement* element = webkit_dom_document_get_element_by_id(document, "test"); + g_assert(element); + + webkit_dom_event_target_add_event_listener( + WEBKIT_DOM_EVENT_TARGET(element), + "click", + G_CALLBACK(clickedCallback), + false, + this); + + // The "click" action will be issued in the uiprocess and that will + // trigger the dom event here. + // clickedCallback() will stop this loop + RunLoop::run(); + + return true; + } + + bool testDispatchEvent(WebKitWebExtension* extension, GVariant* args) + { + notify("ready", ""); + + WebKitWebPage* page = webkit_web_extension_get_page(extension, webPageFromArgs(args)); + g_assert(WEBKIT_IS_WEB_PAGE(page)); + WebKitDOMDocument* document = webkit_web_page_get_dom_document(page); + g_assert(WEBKIT_DOM_IS_DOCUMENT(document)); + + WebKitDOMDOMWindow* domWindow = webkit_dom_document_get_default_view(document); + g_assert(domWindow); + + // The "load" WebKitDOMDOMWindow signal is issued before this test is + // called. There's no way to capture it here. We simply assume that + // the document is loaded and notify the uiprocess accordingly + // notify("loaded", ""); + + webkit_dom_event_target_add_event_listener( + WEBKIT_DOM_EVENT_TARGET(domWindow), + "load", + G_CALLBACK(loadedCallback), + false, + this); + + // loadedCallback() will stop this loop + RunLoop::run(); + + document = webkit_web_page_get_dom_document(page); + g_assert(WEBKIT_DOM_IS_DOCUMENT(document)); + + WebKitDOMElement* element = webkit_dom_document_get_element_by_id(document, "test"); + g_assert(element); + + WebKitDOMEvent* event = webkit_dom_document_create_event(document, "MouseEvent", 0); + g_assert(event); + g_assert(WEBKIT_DOM_IS_EVENT(event)); + g_assert(WEBKIT_DOM_IS_MOUSE_EVENT(event)); + + glong clientX, clientY; + clientX = webkit_dom_element_get_client_left(element); + clientY = webkit_dom_element_get_client_top(element); + + webkit_dom_event_target_add_event_listener( + WEBKIT_DOM_EVENT_TARGET(element), + "click", + G_CALLBACK(clickedCallback), + false, + this); + + webkit_dom_mouse_event_init_mouse_event(WEBKIT_DOM_MOUSE_EVENT(event), + "click", TRUE, TRUE, + domWindow, 0, 0, 0, clientX, clientY, + FALSE, FALSE, FALSE, FALSE, + 1, WEBKIT_DOM_EVENT_TARGET(element)); + + webkit_dom_event_target_dispatch_event(WEBKIT_DOM_EVENT_TARGET(element), event, 0); + + // clickedCallback() will stop this loop + RunLoop::run(); + + return true; + } + + bool testGetComputedStyle(WebKitWebExtension* extension, GVariant* args) + { + WebKitWebPage* page = webkit_web_extension_get_page(extension, webPageFromArgs(args)); + g_assert(WEBKIT_IS_WEB_PAGE(page)); + WebKitDOMDocument* document = webkit_web_page_get_dom_document(page); + g_assert(WEBKIT_DOM_IS_DOCUMENT(document)); + WebKitDOMDOMWindow* domWindow = webkit_dom_document_get_default_view(document); + g_assert(domWindow); + WebKitDOMElement* element = webkit_dom_document_get_element_by_id(document, "test"); + g_assert(element); + g_assert(WEBKIT_DOM_IS_ELEMENT(element)); + WebKitDOMCSSStyleDeclaration* cssStyle = webkit_dom_dom_window_get_computed_style(domWindow, element, 0); + gchar* fontSize = webkit_dom_css_style_declaration_get_property_value(cssStyle, "font-size"); + g_assert_cmpstr(fontSize, ==, "16px"); + + return true; + } + + virtual bool runTest(const char* testName, WebKitWebExtension* extension, GVariant* args) + { + if (!strcmp(testName, "signals")) + return testSignals(extension, args); + if (!strcmp(testName, "dispatch-event")) + return testDispatchEvent(extension, args); + if (!strcmp(testName, "get-computed-style")) + return testGetComputedStyle(extension, args); + + g_assert_not_reached(); + return false; + } +}; + +static void __attribute__((constructor)) registerTests() +{ + REGISTER_TEST(WebKitDOMDOMWindowTest, "WebKitDOMDOMWindow/signals"); + REGISTER_TEST(WebKitDOMDOMWindowTest, "WebKitDOMDOMWindow/dispatch-event"); + REGISTER_TEST(WebKitDOMDOMWindowTest, "WebKitDOMDOMWindow/get-computed-style"); +} + +static gboolean loadedCallback(WebKitDOMDOMWindow* view, WebKitDOMEvent* event, WebKitDOMDOMWindowTest* test) +{ + test->notify("loaded", ""); + + // Stop the loop and let testSignals() or testDispatchEvent() continue its course + RunLoop::current().stop(); + + return FALSE; +} + +static gboolean clickedCallback(WebKitDOMDOMWindow* view, WebKitDOMEvent* event, WebKitDOMDOMWindowTest* test) +{ + test->notify("clicked", ""); + test->notify("finish", ""); + + // Stop the loop and let testSignals() or testDispatchEvent() continue its course + RunLoop::current().stop(); + + return FALSE; +} |