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