2010-04-19 Diego Escalante Urrelo <descalante@igalia.com>
[WebKit-https.git] / WebKit / gtk / tests / testatkroles.c
1 /*
2  * Copyright © 2010 Joanmarie Diggs
3  * Copyright © 2010 Igalia S.L.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #include <glib.h>
22 #include <glib/gstdio.h>
23 #include <gtk/gtk.h>
24 #include <webkit/webkit.h>
25
26 #if GLIB_CHECK_VERSION(2, 16, 0) && GTK_CHECK_VERSION(2, 14, 0)
27
28 #define HTML_DOCUMENT_FRAME "<html><body>This is a test.</body></html>"
29 #define HTML_HEADING "<html><body><h1>1</h1><h2>2</h2><h3>3</h3><h4>4</h4><h5>5</h5><h6>6</h6></body></html>"
30 #define HTML_IMAGE "<html><body><img src='foobar.png' alt='This is a test.'/></body></html>"
31 #define HTML_LINK_TEXT "<html><body><a href='foobar.html'>This is a test.</a></body></html>"
32 #define HTML_LIST "<html><body><ul><li>1</li><li>2</li></ul><ol><li>1</li><li>2</li></ol></body></html>"
33 #define HTML_PARAGRAPH "<html><body><p>This is a test.</p></body></html>"
34 #define HTML_SECTION "<html><body><div>This is a test.</div></body></html>"
35 #define HTML_TABLE "<html><body><table border='1'><tr><td>This is</td><td>a test.</td></tr></table></body></html>"
36
37 typedef struct {
38     AtkObject* documentFrame;
39     AtkObject* obj;
40     AtkRole role;
41     GtkWidget* webView;
42     GtkAllocation alloc;
43     GMainLoop* loop;
44 } AtkRolesFixture;
45
46 static gboolean finish_loading(AtkRolesFixture* fixture)
47 {
48     if (g_main_loop_is_running(fixture->loop))
49         g_main_loop_quit(fixture->loop);
50
51     fixture->documentFrame = gtk_widget_get_accessible(fixture->webView);
52     g_assert(fixture->documentFrame);
53
54     return FALSE;
55 }
56
57 static void atk_roles_fixture_setup(AtkRolesFixture* fixture, gconstpointer data)
58 {
59     fixture->loop = g_main_loop_new(NULL, TRUE);
60     fixture->alloc = (GtkAllocation) { 0, 0, 800, 600 };
61     fixture->webView = webkit_web_view_new();
62     g_object_ref_sink(fixture->webView);
63
64     gtk_widget_size_allocate(fixture->webView, &fixture->alloc);
65
66     if (data != NULL)
67         webkit_web_view_load_string(WEBKIT_WEB_VIEW (fixture->webView), (const char*) data, NULL, NULL, NULL);
68
69     g_idle_add((GSourceFunc) finish_loading, fixture);
70     g_main_loop_run(fixture->loop);
71 }
72
73 static void atk_roles_fixture_teardown(AtkRolesFixture* fixture, gconstpointer data)
74 {
75     g_object_unref(fixture->webView);
76     g_main_loop_unref(fixture->loop);
77 }
78
79 static void get_child_and_test_role(AtkObject* obj, gint pos, AtkRole role)
80 {
81     AtkObject* child;
82     AtkRole child_role;
83
84     child = atk_object_ref_accessible_child(obj, pos);
85     g_assert(child);
86     child_role = atk_object_get_role(child);
87     g_assert(child_role == role);
88
89     g_object_unref(child);
90 }
91
92 static void test_webkit_atk_get_role_document_frame(AtkRolesFixture* fixture, gconstpointer data)
93 {
94     fixture->role = atk_object_get_role(fixture->documentFrame);
95     g_assert(fixture->role == ATK_ROLE_DOCUMENT_FRAME);
96 }
97
98 static void test_webkit_atk_get_role_heading(AtkRolesFixture* fixture, gconstpointer data)
99 {
100     get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_HEADING);
101     get_child_and_test_role(fixture->documentFrame, 1, ATK_ROLE_HEADING);
102     get_child_and_test_role(fixture->documentFrame, 2, ATK_ROLE_HEADING);
103     get_child_and_test_role(fixture->documentFrame, 3, ATK_ROLE_HEADING);
104     get_child_and_test_role(fixture->documentFrame, 4, ATK_ROLE_HEADING);
105     get_child_and_test_role(fixture->documentFrame, 5, ATK_ROLE_HEADING);
106 }
107
108 static void test_webkit_atk_get_role_image(AtkRolesFixture* fixture, gconstpointer data)
109 {
110     // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of.
111     fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0);
112     g_assert(fixture->obj);
113
114     get_child_and_test_role(fixture->obj, 0, ATK_ROLE_IMAGE);
115
116     g_object_unref(fixture->obj);
117 }
118
119 static void test_webkit_atk_get_role_link(AtkRolesFixture* fixture, gconstpointer data)
120 {
121     // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of.
122     fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0);
123     g_assert(fixture->obj);
124
125     get_child_and_test_role(fixture->obj, 0, ATK_ROLE_LINK);
126
127     g_object_unref(fixture->obj);
128 }
129
130 static void test_webkit_atk_get_role_list_and_item(AtkRolesFixture* fixture, gconstpointer data)
131 {
132     AtkObject* listObj;
133
134     listObj = atk_object_ref_accessible_child(fixture->documentFrame, 0);
135     g_assert(listObj);
136     fixture->role = atk_object_get_role(listObj);
137     g_assert(fixture->role == ATK_ROLE_LIST);
138
139     get_child_and_test_role(listObj, 0, ATK_ROLE_LIST_ITEM);
140     get_child_and_test_role(listObj, 1, ATK_ROLE_LIST_ITEM);
141     g_object_unref(listObj);
142
143     listObj = atk_object_ref_accessible_child(fixture->documentFrame, 1);
144     g_assert(listObj);
145     fixture->role = atk_object_get_role(listObj);
146     g_assert(fixture->role == ATK_ROLE_LIST);
147
148     get_child_and_test_role(listObj, 0, ATK_ROLE_LIST_ITEM);
149     get_child_and_test_role(listObj, 1, ATK_ROLE_LIST_ITEM);
150     g_object_unref(listObj);
151 }
152
153 static void test_webkit_atk_get_role_paragraph(AtkRolesFixture* fixture, gconstpointer data)
154 {
155     get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_PARAGRAPH);
156 }
157
158 static void test_webkit_atk_get_role_section(AtkRolesFixture* fixture, gconstpointer data)
159 {
160     get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_SECTION);
161 }
162
163 // Does not yet test table cells because of bug 30895.
164 static void test_webkit_atk_get_role_table(AtkRolesFixture* fixture, gconstpointer data)
165 {
166     get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_TABLE);
167 }
168
169 int main(int argc, char** argv)
170 {
171     g_thread_init(NULL);
172     gtk_test_init(&argc, &argv, NULL);
173
174     g_test_bug_base("https://bugs.webkit.org/");
175
176     g_test_add("/webkit/atk/test_webkit_atk_get_role_document_frame",
177                AtkRolesFixture, HTML_DOCUMENT_FRAME,
178                atk_roles_fixture_setup,
179                test_webkit_atk_get_role_document_frame,
180                atk_roles_fixture_teardown);
181
182     g_test_add("/webkit/atk/test_webkit_atk_get_role_heading",
183                AtkRolesFixture, HTML_HEADING,
184                atk_roles_fixture_setup,
185                test_webkit_atk_get_role_heading,
186                atk_roles_fixture_teardown);
187
188     g_test_add("/webkit/atk/test_webkit_atk_get_role_image",
189                AtkRolesFixture, HTML_IMAGE,
190                atk_roles_fixture_setup,
191                test_webkit_atk_get_role_image,
192                atk_roles_fixture_teardown);
193
194     g_test_add("/webkit/atk/test_webkit_atk_get_role_link",
195                AtkRolesFixture, HTML_LINK_TEXT,
196                atk_roles_fixture_setup,
197                test_webkit_atk_get_role_link,
198                atk_roles_fixture_teardown);
199
200     g_test_add("/webkit/atk/test_webkit_atk_get_role_list_and_item",
201                AtkRolesFixture, HTML_LIST,
202                atk_roles_fixture_setup,
203                test_webkit_atk_get_role_list_and_item,
204                atk_roles_fixture_teardown);
205
206     g_test_add("/webkit/atk/test_webkit_atk_get_role_paragraph",
207                AtkRolesFixture, HTML_PARAGRAPH,
208                atk_roles_fixture_setup,
209                test_webkit_atk_get_role_paragraph,
210                atk_roles_fixture_teardown);
211
212     g_test_add("/webkit/atk/test_webkit_atk_get_role_section",
213                AtkRolesFixture, HTML_SECTION,
214                atk_roles_fixture_setup,
215                test_webkit_atk_get_role_section,
216                atk_roles_fixture_teardown);
217
218     g_test_add("/webkit/atk/test_webkit_atk_get_role_table",
219                AtkRolesFixture, HTML_TABLE,
220                atk_roles_fixture_setup,
221                test_webkit_atk_get_role_table,
222                atk_roles_fixture_teardown);
223
224     return g_test_run ();
225 }
226
227 #else
228 int main(int argc, char** argv)
229 {
230     g_critical("You will need at least glib-2.16.0 and gtk-2.14.0 to run the unit tests. Doing nothing now.");
231     return 0;
232 }
233
234 #endif