[GTK] Use custom JavaScript instead of DBus to implement WebProcess tests
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKit2Gtk / DOMNodeFilterTest.cpp
1 /*
2  * Copyright (C) 2013 Igalia S.L.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21
22 #include "WebProcessTest.h"
23 #include <gio/gio.h>
24 #include <webkit2/webkit-web-extension.h>
25 #include <wtf/gobject/GUniquePtr.h>
26
27 typedef struct _WebKitNodeFilter {
28     GObject parent;
29 } WebKitNodeFilter;
30
31 typedef struct _WebKitNodeFilterClass {
32     GObjectClass parentClass;
33 } WebKitNodeFilterClass;
34
35 static short webkitNodeFilterAcceptNode(WebKitDOMNodeFilter*, WebKitDOMNode* node)
36 {
37     // Filter out input elements.
38     return WEBKIT_DOM_IS_HTML_INPUT_ELEMENT(node) ? WEBKIT_DOM_NODE_FILTER_REJECT : WEBKIT_DOM_NODE_FILTER_ACCEPT;
39 }
40
41 static void webkitNodeFilterDOMNodeFilterIfaceInit(WebKitDOMNodeFilterIface* iface)
42 {
43     iface->accept_node = webkitNodeFilterAcceptNode;
44 }
45
46 G_DEFINE_TYPE_WITH_CODE(WebKitNodeFilter, webkit_node_filter, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(WEBKIT_DOM_TYPE_NODE_FILTER, webkitNodeFilterDOMNodeFilterIfaceInit))
47
48 static void webkit_node_filter_init(WebKitNodeFilter*)
49 {
50 }
51
52 static void webkit_node_filter_class_init(WebKitNodeFilterClass*)
53 {
54 }
55
56 static const char* expectedNodesAll[] = { "HTML", "HEAD", "TITLE", "#text", "BODY", "INPUT", "INPUT", "BR" };
57 static const char* expectedNodesNoInput[] = { "HTML", "HEAD", "TITLE", "#text", "BODY", "BR" };
58 static const char* expectedElementsNoInput[] = { "HTML", "HEAD", "TITLE", "BODY", "BR" };
59
60 class WebKitDOMNodeFilterTest : public WebProcessTest {
61 public:
62     static std::unique_ptr<WebProcessTest> create() { return std::unique_ptr<WebProcessTest>(new WebKitDOMNodeFilterTest()); }
63
64 private:
65     bool testTreeWalker(WebKitWebPage* page)
66     {
67         WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
68         g_assert(WEBKIT_DOM_IS_DOCUMENT(document));
69
70         WebKitDOMElement* root = webkit_dom_document_get_element_by_id(document, "root");
71         g_assert(WEBKIT_DOM_IS_NODE(root));
72
73         // No filter.
74         WebKitDOMTreeWalker* walker = webkit_dom_document_create_tree_walker(document, WEBKIT_DOM_NODE(root), WEBKIT_DOM_NODE_FILTER_SHOW_ALL, nullptr, FALSE, nullptr);
75         g_assert(WEBKIT_DOM_IS_TREE_WALKER(walker));
76         g_assert(!webkit_dom_tree_walker_get_filter(walker));
77
78         unsigned i = 0;
79         for (WebKitDOMNode* node = WEBKIT_DOM_NODE(root); node; node = webkit_dom_tree_walker_next_node(walker), ++i) {
80             g_assert_cmpuint(i, <, G_N_ELEMENTS(expectedNodesAll));
81             GUniquePtr<char> nodeName(webkit_dom_node_get_node_name(node));
82             g_assert_cmpstr(nodeName.get(), ==, expectedNodesAll[i]);
83         }
84         g_assert_cmpuint(i, ==, G_N_ELEMENTS(expectedNodesAll));
85
86         // Input elements filter.
87         GRefPtr<WebKitDOMNodeFilter> filter = adoptGRef(static_cast<WebKitDOMNodeFilter*>(g_object_new(webkit_node_filter_get_type(), nullptr)));
88         walker = webkit_dom_document_create_tree_walker(document, WEBKIT_DOM_NODE(root), WEBKIT_DOM_NODE_FILTER_SHOW_ALL, filter.get(), FALSE, nullptr);
89         g_assert(WEBKIT_DOM_IS_TREE_WALKER(walker));
90         g_assert(webkit_dom_tree_walker_get_filter(walker) == filter.get());
91
92         i = 0;
93         for (WebKitDOMNode* node = WEBKIT_DOM_NODE(root); node; node = webkit_dom_tree_walker_next_node(walker), ++i) {
94             g_assert_cmpuint(i, <, G_N_ELEMENTS(expectedNodesNoInput));
95             GUniquePtr<char> nodeName(webkit_dom_node_get_node_name(node));
96             g_assert_cmpstr(nodeName.get(), ==, expectedNodesNoInput[i]);
97         }
98         g_assert_cmpuint(i, ==, G_N_ELEMENTS(expectedNodesNoInput));
99
100         // Show only elements, reusing the input filter.
101         walker = webkit_dom_document_create_tree_walker(document, WEBKIT_DOM_NODE(root), WEBKIT_DOM_NODE_FILTER_SHOW_ELEMENT, filter.get(), FALSE, nullptr);
102         g_assert(WEBKIT_DOM_IS_TREE_WALKER(walker));
103         g_assert(webkit_dom_tree_walker_get_filter(walker) == filter.get());
104
105         i = 0;
106         for (WebKitDOMNode* node = WEBKIT_DOM_NODE(root); node; node = webkit_dom_tree_walker_next_node(walker), ++i) {
107             g_assert_cmpuint(i, <, G_N_ELEMENTS(expectedElementsNoInput));
108             GUniquePtr<char> nodeName(webkit_dom_node_get_node_name(node));
109             g_assert_cmpstr(nodeName.get(), ==, expectedElementsNoInput[i]);
110         }
111         g_assert_cmpuint(i, ==, G_N_ELEMENTS(expectedElementsNoInput));
112
113         return true;
114     }
115
116     bool testNodeIterator(WebKitWebPage* page)
117     {
118         WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
119         g_assert(WEBKIT_DOM_IS_DOCUMENT(document));
120
121         WebKitDOMElement* root = webkit_dom_document_get_element_by_id(document, "root");
122         g_assert(WEBKIT_DOM_IS_NODE(root));
123
124         // No filter.
125         WebKitDOMNodeIterator* iter = webkit_dom_document_create_node_iterator(document, WEBKIT_DOM_NODE(root), WEBKIT_DOM_NODE_FILTER_SHOW_ALL, nullptr, FALSE, nullptr);
126         g_assert(WEBKIT_DOM_IS_NODE_ITERATOR(iter));
127         g_assert(!webkit_dom_node_iterator_get_filter(iter));
128
129         unsigned i = 0;
130         while (WebKitDOMNode* node = webkit_dom_node_iterator_next_node(iter, nullptr)) {
131             g_assert_cmpuint(i, <, G_N_ELEMENTS(expectedNodesAll));
132             GUniquePtr<char> nodeName(webkit_dom_node_get_node_name(node));
133             g_assert_cmpstr(nodeName.get(), ==, expectedNodesAll[i]);
134             i++;
135         }
136         g_assert_cmpuint(i, ==, G_N_ELEMENTS(expectedNodesAll));
137
138         // Input elements filter.
139         GRefPtr<WebKitDOMNodeFilter> filter = adoptGRef(static_cast<WebKitDOMNodeFilter*>(g_object_new(webkit_node_filter_get_type(), nullptr)));
140         iter = webkit_dom_document_create_node_iterator(document, WEBKIT_DOM_NODE(root), WEBKIT_DOM_NODE_FILTER_SHOW_ALL, filter.get(), FALSE, nullptr);
141         g_assert(WEBKIT_DOM_IS_NODE_ITERATOR(iter));
142         g_assert(webkit_dom_node_iterator_get_filter(iter) == filter.get());
143
144         i = 0;
145         while (WebKitDOMNode* node = webkit_dom_node_iterator_next_node(iter, nullptr)) {
146             g_assert_cmpuint(i, <, G_N_ELEMENTS(expectedNodesNoInput));
147             GUniquePtr<char> nodeName(webkit_dom_node_get_node_name(node));
148             g_assert_cmpstr(nodeName.get(), ==, expectedNodesNoInput[i]);
149             i++;
150         }
151         g_assert_cmpuint(i, ==, G_N_ELEMENTS(expectedNodesNoInput));
152
153         // Show only elements, reusing the input filter.
154         iter = webkit_dom_document_create_node_iterator(document, WEBKIT_DOM_NODE(root), WEBKIT_DOM_NODE_FILTER_SHOW_ELEMENT, filter.get(), FALSE, nullptr);
155         g_assert(WEBKIT_DOM_IS_NODE_ITERATOR(iter));
156         g_assert(webkit_dom_node_iterator_get_filter(iter) == filter.get());
157
158         i = 0;
159         while (WebKitDOMNode* node = webkit_dom_node_iterator_next_node(iter, nullptr)) {
160             g_assert_cmpuint(i, <, G_N_ELEMENTS(expectedElementsNoInput));
161             GUniquePtr<char> nodeName(webkit_dom_node_get_node_name(node));
162             g_assert_cmpstr(nodeName.get(), ==, expectedElementsNoInput[i]);
163             i++;
164         }
165         g_assert_cmpuint(i, ==, G_N_ELEMENTS(expectedElementsNoInput));
166
167         return true;
168     }
169
170     bool runTest(const char* testName, WebKitWebPage* page) override
171     {
172         if (!strcmp(testName, "tree-walker"))
173             return testTreeWalker(page);
174         if (!strcmp(testName, "node-iterator"))
175             return testNodeIterator(page);
176
177         g_assert_not_reached();
178         return false;
179     }
180 };
181
182 static void __attribute__((constructor)) registerTests()
183 {
184     REGISTER_TEST(WebKitDOMNodeFilterTest, "WebKitDOMNodeFilter/tree-walker");
185     REGISTER_TEST(WebKitDOMNodeFilterTest, "WebKitDOMNodeFilter/node-iterator");
186 }
187
188