[GTK] Use custom JavaScript instead of DBus to implement WebProcess tests
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKit2Gtk / DOMNodeTest.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 class WebKitDOMNodeTest : public WebProcessTest {
28 public:
29     static std::unique_ptr<WebProcessTest> create() { return std::unique_ptr<WebKitDOMNodeTest>(new WebKitDOMNodeTest()); }
30
31 private:
32     bool testHierarchyNavigation(WebKitWebPage* page)
33     {
34         WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
35         g_assert(WEBKIT_DOM_IS_DOCUMENT(document));
36
37         WebKitDOMHTMLHeadElement* head = webkit_dom_document_get_head(document);
38         g_assert(WEBKIT_DOM_IS_HTML_HEAD_ELEMENT(head));
39
40         // Title, head's child.
41         g_assert(webkit_dom_node_has_child_nodes(WEBKIT_DOM_NODE(head)));
42         GRefPtr<WebKitDOMNodeList> list = adoptGRef(webkit_dom_node_get_child_nodes(WEBKIT_DOM_NODE(head)));
43         g_assert(WEBKIT_DOM_IS_NODE_LIST(list.get()));
44         g_assert_cmpint(webkit_dom_node_list_get_length(list.get()), ==, 1);
45         WebKitDOMNode* node = webkit_dom_node_list_item(list.get(), 0);
46         g_assert(WEBKIT_DOM_IS_HTML_TITLE_ELEMENT(node));
47
48         // Body, Head sibling.
49         node = webkit_dom_node_get_next_sibling(WEBKIT_DOM_NODE(head));
50         g_assert(WEBKIT_DOM_IS_HTML_BODY_ELEMENT(node));
51         WebKitDOMHTMLBodyElement* body = WEBKIT_DOM_HTML_BODY_ELEMENT(node);
52
53         // There is no third sibling
54         g_assert(!webkit_dom_node_get_next_sibling(node));
55
56         // Body's previous sibling is Head.
57         node = webkit_dom_node_get_previous_sibling(WEBKIT_DOM_NODE(body));
58         g_assert(WEBKIT_DOM_IS_HTML_HEAD_ELEMENT(node));
59
60         // Body has 3 children.
61         g_assert(webkit_dom_node_has_child_nodes(WEBKIT_DOM_NODE(body)));
62         list = adoptGRef(webkit_dom_node_get_child_nodes(WEBKIT_DOM_NODE(body)));
63         unsigned long length = webkit_dom_node_list_get_length(list.get());
64         g_assert_cmpint(length, ==, 3);
65
66         // The three of them are P tags.
67         for (unsigned long i = 0; i < length; i++) {
68             node = webkit_dom_node_list_item(list.get(), i);
69             g_assert(WEBKIT_DOM_IS_HTML_PARAGRAPH_ELEMENT(node));
70         }
71
72         // Go backwards
73         unsigned i;
74         for (i = 0; node; node = webkit_dom_node_get_previous_sibling(node), i++) { }
75         g_assert_cmpint(i, ==, 3);
76
77         return true;
78     }
79
80     bool testInsertion(WebKitWebPage* page)
81     {
82         WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
83         g_assert(WEBKIT_DOM_IS_DOCUMENT(document));
84
85         WebKitDOMHTMLElement* body = webkit_dom_document_get_body(document);
86         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(body));
87
88         // Body shouldn't have any children at this point.
89         g_assert(!webkit_dom_node_has_child_nodes(WEBKIT_DOM_NODE(body)));
90
91         // Insert one P element.
92         WebKitDOMElement* p = webkit_dom_document_create_element(document, "P", 0);
93         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(p));
94         webkit_dom_node_append_child(WEBKIT_DOM_NODE(body), WEBKIT_DOM_NODE(p), 0);
95
96         // Now it should have one, the same that we inserted.
97         g_assert(webkit_dom_node_has_child_nodes(WEBKIT_DOM_NODE(body)));
98         GRefPtr<WebKitDOMNodeList> list = adoptGRef(webkit_dom_node_get_child_nodes(WEBKIT_DOM_NODE(body)));
99         g_assert(WEBKIT_DOM_IS_NODE_LIST(list.get()));
100         g_assert_cmpint(webkit_dom_node_list_get_length(list.get()), ==, 1);
101         WebKitDOMNode* node = webkit_dom_node_list_item(list.get(), 0);
102         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(node));
103         g_assert(webkit_dom_node_is_same_node(WEBKIT_DOM_NODE(p), node));
104
105         // Replace the P tag with a DIV tag.
106         WebKitDOMElement* div = webkit_dom_document_create_element(document, "DIV", 0);
107         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(div));
108         webkit_dom_node_replace_child(WEBKIT_DOM_NODE(body), WEBKIT_DOM_NODE(div), WEBKIT_DOM_NODE(p), 0);
109         g_assert(webkit_dom_node_has_child_nodes(WEBKIT_DOM_NODE(body)));
110         list = adoptGRef(webkit_dom_node_get_child_nodes(WEBKIT_DOM_NODE(body)));
111         g_assert(WEBKIT_DOM_IS_NODE_LIST(list.get()));
112         g_assert_cmpint(webkit_dom_node_list_get_length(list.get()), ==, 1);
113         node = webkit_dom_node_list_item(list.get(), 0);
114         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(node));
115         g_assert(webkit_dom_node_is_same_node(WEBKIT_DOM_NODE(div), node));
116
117         // Now remove the tag.
118         webkit_dom_node_remove_child(WEBKIT_DOM_NODE(body), node, 0);
119         list = adoptGRef(webkit_dom_node_get_child_nodes(WEBKIT_DOM_NODE(body)));
120         g_assert(WEBKIT_DOM_IS_NODE_LIST(list.get()));
121         g_assert_cmpint(webkit_dom_node_list_get_length(list.get()), ==, 0);
122
123         // Test insert before. If refChild is null, insert newChild as last element of parent.
124         div = webkit_dom_document_create_element(document, "DIV", 0);
125         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(div));
126         webkit_dom_node_insert_before(WEBKIT_DOM_NODE(body), WEBKIT_DOM_NODE(div), 0, 0);
127         g_assert(webkit_dom_node_has_child_nodes(WEBKIT_DOM_NODE(body)));
128         list = adoptGRef(webkit_dom_node_get_child_nodes(WEBKIT_DOM_NODE(body)));
129         g_assert(WEBKIT_DOM_IS_NODE_LIST(list.get()));
130         g_assert_cmpint(webkit_dom_node_list_get_length(list.get()), ==, 1);
131         node = webkit_dom_node_list_item(list.get(), 0);
132         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(node));
133         g_assert(webkit_dom_node_is_same_node(WEBKIT_DOM_NODE(div), node));
134
135         // Now insert a 'p' before 'div'.
136         p = webkit_dom_document_create_element(document, "P", 0);
137         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(p));
138         webkit_dom_node_insert_before(WEBKIT_DOM_NODE(body), WEBKIT_DOM_NODE(p), WEBKIT_DOM_NODE(div), 0);
139         g_assert(webkit_dom_node_has_child_nodes(WEBKIT_DOM_NODE(body)));
140         list = adoptGRef(webkit_dom_node_get_child_nodes(WEBKIT_DOM_NODE(body)));
141         g_assert(WEBKIT_DOM_IS_NODE_LIST(list.get()));
142         g_assert_cmpint(webkit_dom_node_list_get_length(list.get()), ==, 2);
143         node = webkit_dom_node_list_item(list.get(), 0);
144         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(node));
145         g_assert(webkit_dom_node_is_same_node(WEBKIT_DOM_NODE(p), node));
146         node = webkit_dom_node_list_item(list.get(), 1);
147         g_assert(WEBKIT_DOM_IS_HTML_ELEMENT(node));
148         g_assert(webkit_dom_node_is_same_node(WEBKIT_DOM_NODE(div), node));
149
150         return true;
151     }
152
153     bool testTagNames(WebKitWebPage* page)
154     {
155         static const char* expectedTagNames[] = { "HTML", "HEAD", "BODY", "VIDEO", "SOURCE", "VIDEO", "SOURCE", "INPUT" };
156
157         WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
158         g_assert(WEBKIT_DOM_IS_DOCUMENT(document));
159
160         WebKitDOMNodeList* list = webkit_dom_document_get_elements_by_tag_name(document, "*");
161         gulong nodeCount = webkit_dom_node_list_get_length(list);
162         g_assert_cmpuint(nodeCount, ==, G_N_ELEMENTS(expectedTagNames));
163         for (unsigned i = 0; i < nodeCount; i++) {
164             WebKitDOMNode* node = webkit_dom_node_list_item(list, i);
165             g_assert(WEBKIT_DOM_IS_NODE(node));
166             GUniquePtr<char> tagName(webkit_dom_node_get_node_name(node));
167             g_assert_cmpstr(tagName.get(), ==, expectedTagNames[i]);
168         }
169
170         return true;
171     }
172
173     bool runTest(const char* testName, WebKitWebPage* page) override
174     {
175         if (!strcmp(testName, "hierarchy-navigation"))
176             return testHierarchyNavigation(page);
177         if (!strcmp(testName, "insertion"))
178             return testInsertion(page);
179         if (!strcmp(testName, "tag-names"))
180             return testTagNames(page);
181
182         g_assert_not_reached();
183         return false;
184     }
185 };
186
187 static void __attribute__((constructor)) registerTests()
188 {
189     REGISTER_TEST(WebKitDOMNodeTest, "WebKitDOMNode/hierarchy-navigation");
190     REGISTER_TEST(WebKitDOMNodeTest, "WebKitDOMNode/insertion");
191     REGISTER_TEST(WebKitDOMNodeTest, "WebKitDOMNode/tag-names");
192 }
193
194