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 GTK_CHECK_VERSION(2, 14, 0) 27 28 /* Non form roles */ 29 #define HTML_DOCUMENT_FRAME "<html><body>This is a test.</body></html>" 30 #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>" 31 #define HTML_IMAGE "<html><body><img src='foobar.png' alt='This is a test.'/></body></html>" 32 #define HTML_LINK_TEXT "<html><body><a href='foobar.html'>This is a test.</a></body></html>" 33 #define HTML_LIST "<html><body><ul><li>1</li><li>2</li></ul><ol><li>1</li><li>2</li></ol></body></html>" 34 #define HTML_PARAGRAPH "<html><body><p>This is a test.</p></body></html>" 35 #define HTML_SECTION "<html><body><div>This is a test.</div></body></html>" 36 #define HTML_TABLE "<html><body><table border='1'><tr><td>This is</td><td>a test.</td></tr></table></body></html>" 37 #define HTML_SEPARATOR "<html><body><hr/></body></html>" 38 #define HTML_COMBOBOX "<html><body><select size='1'><option>one</option><option>two</option><option>three</option></select></body></html>" 39 /* Form roles */ 40 #define HTML_FORM "<html><body><form>This is a test.</form></body></html>" 41 #define HTML_CHECK_BOX "<html><body><input type='checkbox' />This is a test.</body></html>" 42 #define HTML_LABELED_ENTRY "<html><body><label for='foo'>Name:</label><input type='text' id='foo' /></body></html>" 43 #define HTML_LISTBOX "<html><body><select size='3'><option>one</option><option>two</option><option>three</option></select></body></html>" 44 #define HTML_PASSWORD_TEXT "<html><body><input type='password' /></body></html>" 45 #define HTML_PUSH_BUTTON "<html><body><input type='submit' value='ok' />This is a test.</body></html>" 46 #define HTML_RADIO_BUTTON "<html><body><input type='radio' />This is a test.</body></html>" 47 48 typedef struct { 49 AtkObject* documentFrame; 50 AtkObject* obj; 51 AtkRole role; 52 GtkWidget* webView; 53 GtkAllocation alloc; 54 GMainLoop* loop; 55 } AtkRolesFixture; 56 57 static gboolean finish_loading(AtkRolesFixture* fixture) 58 { 59 if (g_main_loop_is_running(fixture->loop)) 60 g_main_loop_quit(fixture->loop); 61 62 fixture->documentFrame = gtk_widget_get_accessible(fixture->webView); 63 g_assert(fixture->documentFrame); 64 65 return FALSE; 66 } 67 68 static void atk_roles_fixture_setup(AtkRolesFixture* fixture, gconstpointer data) 69 { 70 fixture->loop = g_main_loop_new(NULL, TRUE); 71 fixture->alloc = (GtkAllocation) { 0, 0, 800, 600 }; 72 fixture->webView = webkit_web_view_new(); 73 g_object_ref_sink(fixture->webView); 74 75 gtk_widget_size_allocate(fixture->webView, &fixture->alloc); 76 77 if (data != NULL) 78 webkit_web_view_load_string(WEBKIT_WEB_VIEW (fixture->webView), (const char*) data, NULL, NULL, NULL); 79 80 g_idle_add((GSourceFunc) finish_loading, fixture); 81 g_main_loop_run(fixture->loop); 82 } 83 84 static void atk_roles_fixture_teardown(AtkRolesFixture* fixture, gconstpointer data) 85 { 86 g_object_unref(fixture->webView); 87 g_main_loop_unref(fixture->loop); 88 } 89 90 static void get_child_and_test_role(AtkObject* obj, gint pos, AtkRole role) 91 { 92 AtkObject* child; 93 AtkRole child_role; 94 95 child = atk_object_ref_accessible_child(obj, pos); 96 g_assert(child); 97 child_role = atk_object_get_role(child); 98 g_assert(child_role == role); 99 100 g_object_unref(child); 101 } 102 103 static void test_webkit_atk_get_role_document_frame(AtkRolesFixture* fixture, gconstpointer data) 104 { 105 fixture->role = atk_object_get_role(fixture->documentFrame); 106 g_assert(fixture->role == ATK_ROLE_DOCUMENT_FRAME); 107 } 108 109 static void test_webkit_atk_get_role_heading(AtkRolesFixture* fixture, gconstpointer data) 110 { 111 get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_HEADING); 112 get_child_and_test_role(fixture->documentFrame, 1, ATK_ROLE_HEADING); 113 get_child_and_test_role(fixture->documentFrame, 2, ATK_ROLE_HEADING); 114 get_child_and_test_role(fixture->documentFrame, 3, ATK_ROLE_HEADING); 115 get_child_and_test_role(fixture->documentFrame, 4, ATK_ROLE_HEADING); 116 get_child_and_test_role(fixture->documentFrame, 5, ATK_ROLE_HEADING); 117 } 118 119 static void test_webkit_atk_get_role_image(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_IMAGE); 126 127 g_object_unref(fixture->obj); 128 } 129 130 static void test_webkit_atk_get_role_link(AtkRolesFixture* fixture, gconstpointer data) 131 { 132 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 133 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 134 g_assert(fixture->obj); 135 136 get_child_and_test_role(fixture->obj, 0, ATK_ROLE_LINK); 137 138 g_object_unref(fixture->obj); 139 } 140 141 static void test_webkit_atk_get_role_list_and_item(AtkRolesFixture* fixture, gconstpointer data) 142 { 143 AtkObject* listObj; 144 145 listObj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 146 g_assert(listObj); 147 fixture->role = atk_object_get_role(listObj); 148 g_assert(fixture->role == ATK_ROLE_LIST); 149 150 get_child_and_test_role(listObj, 0, ATK_ROLE_LIST_ITEM); 151 get_child_and_test_role(listObj, 1, ATK_ROLE_LIST_ITEM); 152 g_object_unref(listObj); 153 154 listObj = atk_object_ref_accessible_child(fixture->documentFrame, 1); 155 g_assert(listObj); 156 fixture->role = atk_object_get_role(listObj); 157 g_assert(fixture->role == ATK_ROLE_LIST); 158 159 get_child_and_test_role(listObj, 0, ATK_ROLE_LIST_ITEM); 160 get_child_and_test_role(listObj, 1, ATK_ROLE_LIST_ITEM); 161 g_object_unref(listObj); 162 } 163 164 static void test_webkit_atk_get_role_paragraph(AtkRolesFixture* fixture, gconstpointer data) 165 { 166 get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_PARAGRAPH); 167 } 168 169 static void test_webkit_atk_get_role_section(AtkRolesFixture* fixture, gconstpointer data) 170 { 171 get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_SECTION); 172 } 173 174 // Does not yet test table cells because of bug 30895. 175 static void test_webkit_atk_get_role_table(AtkRolesFixture* fixture, gconstpointer data) 176 { 177 get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_TABLE); 178 } 179 180 static void test_webkit_atk_get_role_separator(AtkRolesFixture *fixture, gconstpointer data) 181 { 182 get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_SEPARATOR); 183 } 184 185 static void test_webkit_atk_get_role_combobox(AtkRolesFixture *fixture, gconstpointer data) 186 { 187 AtkObject* comboboxMenu; 188 189 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 190 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 191 g_assert(fixture->obj); 192 193 fixture->obj = atk_object_ref_accessible_child(fixture->obj, 0); 194 g_assert(fixture->obj); 195 fixture->role = atk_object_get_role(fixture->obj); 196 g_assert(fixture->role == ATK_ROLE_COMBO_BOX); 197 198 comboboxMenu = atk_object_ref_accessible_child(fixture->obj, 0); 199 g_assert(comboboxMenu); 200 fixture->role = atk_object_get_role(comboboxMenu); 201 g_assert(fixture->role == ATK_ROLE_MENU); 202 203 get_child_and_test_role(comboboxMenu, 0, ATK_ROLE_MENU_ITEM); 204 get_child_and_test_role(comboboxMenu, 1, ATK_ROLE_MENU_ITEM); 205 get_child_and_test_role(comboboxMenu, 2, ATK_ROLE_MENU_ITEM); 206 207 g_object_unref(fixture->obj); 208 g_object_unref(comboboxMenu); 209 } 210 211 /* Form roles */ 212 static void test_webkit_atk_get_role_form(AtkRolesFixture *fixture, gconstpointer data) 213 { 214 get_child_and_test_role(fixture->documentFrame, 0, ATK_ROLE_FORM); 215 } 216 217 static void test_webkit_atk_get_role_check_box(AtkRolesFixture* fixture, gconstpointer data) 218 { 219 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 220 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 221 g_assert(fixture->obj); 222 223 get_child_and_test_role(fixture->obj, 0, ATK_ROLE_CHECK_BOX); 224 225 g_object_unref(fixture->obj); 226 } 227 228 static void test_webkit_atk_get_role_entry(AtkRolesFixture* fixture, gconstpointer data) 229 { 230 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 231 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 232 g_assert(fixture->obj); 233 234 get_child_and_test_role(fixture->obj, 1, ATK_ROLE_ENTRY); 235 236 g_object_unref(fixture->obj); 237 } 238 239 static void test_webkit_atk_get_role_label(AtkRolesFixture* fixture, gconstpointer data) 240 { 241 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 242 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 243 g_assert(fixture->obj); 244 245 get_child_and_test_role(fixture->obj, 0, ATK_ROLE_LABEL); 246 247 g_object_unref(fixture->obj); 248 } 249 250 static void test_webkit_atk_get_role_listbox(AtkRolesFixture* fixture, gconstpointer data) 251 { 252 AtkObject* listboxObj; 253 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 254 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 255 g_assert(fixture->obj); 256 257 listboxObj = atk_object_ref_accessible_child(fixture->obj, 0); 258 g_assert(listboxObj); 259 fixture->role = atk_object_get_role(listboxObj); 260 g_assert(fixture->role == ATK_ROLE_LIST); 261 262 get_child_and_test_role(listboxObj, 0, ATK_ROLE_LIST_ITEM); 263 get_child_and_test_role(listboxObj, 1, ATK_ROLE_LIST_ITEM); 264 get_child_and_test_role(listboxObj, 2, ATK_ROLE_LIST_ITEM); 265 266 g_object_unref(fixture->obj); 267 g_object_unref(listboxObj); 268 } 269 270 static void test_webkit_atk_get_role_password_text(AtkRolesFixture* fixture, gconstpointer data) 271 { 272 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 273 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 274 g_assert(fixture->obj); 275 276 get_child_and_test_role(fixture->obj, 0, ATK_ROLE_PASSWORD_TEXT); 277 278 g_object_unref(fixture->obj); 279 } 280 281 static void test_webkit_atk_get_role_push_button(AtkRolesFixture* fixture, gconstpointer data) 282 { 283 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 284 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 285 g_assert(fixture->obj); 286 287 get_child_and_test_role(fixture->obj, 0, ATK_ROLE_PUSH_BUTTON); 288 289 g_object_unref(fixture->obj); 290 } 291 292 static void test_webkit_atk_get_role_radio_button(AtkRolesFixture* fixture, gconstpointer data) 293 { 294 // This is an extraneous object of ATK_ROLE_PANEL which we should get rid of. 295 fixture->obj = atk_object_ref_accessible_child(fixture->documentFrame, 0); 296 g_assert(fixture->obj); 297 298 get_child_and_test_role(fixture->obj, 0, ATK_ROLE_RADIO_BUTTON); 299 300 g_object_unref(fixture->obj); 301 } 302 303 int main(int argc, char** argv) 304 { 305 g_thread_init(NULL); 306 gtk_test_init(&argc, &argv, NULL); 307 308 g_test_bug_base("https://bugs.webkit.org/"); 309 310 g_test_add("/webkit/atk/test_webkit_atk_get_role_document_frame", 311 AtkRolesFixture, HTML_DOCUMENT_FRAME, 312 atk_roles_fixture_setup, 313 test_webkit_atk_get_role_document_frame, 314 atk_roles_fixture_teardown); 315 316 g_test_add("/webkit/atk/test_webkit_atk_get_role_heading", 317 AtkRolesFixture, HTML_HEADING, 318 atk_roles_fixture_setup, 319 test_webkit_atk_get_role_heading, 320 atk_roles_fixture_teardown); 321 322 g_test_add("/webkit/atk/test_webkit_atk_get_role_image", 323 AtkRolesFixture, HTML_IMAGE, 324 atk_roles_fixture_setup, 325 test_webkit_atk_get_role_image, 326 atk_roles_fixture_teardown); 327 328 g_test_add("/webkit/atk/test_webkit_atk_get_role_link", 329 AtkRolesFixture, HTML_LINK_TEXT, 330 atk_roles_fixture_setup, 331 test_webkit_atk_get_role_link, 332 atk_roles_fixture_teardown); 333 334 g_test_add("/webkit/atk/test_webkit_atk_get_role_list_and_item", 335 AtkRolesFixture, HTML_LIST, 336 atk_roles_fixture_setup, 337 test_webkit_atk_get_role_list_and_item, 338 atk_roles_fixture_teardown); 339 340 g_test_add("/webkit/atk/test_webkit_atk_get_role_paragraph", 341 AtkRolesFixture, HTML_PARAGRAPH, 342 atk_roles_fixture_setup, 343 test_webkit_atk_get_role_paragraph, 344 atk_roles_fixture_teardown); 345 346 g_test_add("/webkit/atk/test_webkit_atk_get_role_section", 347 AtkRolesFixture, HTML_SECTION, 348 atk_roles_fixture_setup, 349 test_webkit_atk_get_role_section, 350 atk_roles_fixture_teardown); 351 352 g_test_add("/webkit/atk/test_webkit_atk_get_role_table", 353 AtkRolesFixture, HTML_TABLE, 354 atk_roles_fixture_setup, 355 test_webkit_atk_get_role_table, 356 atk_roles_fixture_teardown); 357 358 g_test_add("/webkit/atk/test_webkit_atk_get_role_separator", 359 AtkRolesFixture, HTML_SEPARATOR, 360 atk_roles_fixture_setup, 361 test_webkit_atk_get_role_separator, 362 atk_roles_fixture_teardown); 363 364 g_test_add("/webkit/atk/test_webkit_atk_get_role_combobox", 365 AtkRolesFixture, HTML_COMBOBOX, 366 atk_roles_fixture_setup, 367 test_webkit_atk_get_role_combobox, 368 atk_roles_fixture_teardown); 369 370 /* Form roles */ 371 g_test_add("/webkit/atk/test_webkit_atk_get_role_form", 372 AtkRolesFixture, HTML_FORM, 373 atk_roles_fixture_setup, 374 test_webkit_atk_get_role_form, 375 atk_roles_fixture_teardown); 376 g_test_add("/webkit/atk/test_webkit_atk_get_role_check_box", 377 AtkRolesFixture, HTML_CHECK_BOX, 378 atk_roles_fixture_setup, 379 test_webkit_atk_get_role_check_box, 380 atk_roles_fixture_teardown); 381 382 g_test_add("/webkit/atk/test_webkit_atk_get_role_entry", 383 AtkRolesFixture, HTML_LABELED_ENTRY, 384 atk_roles_fixture_setup, 385 test_webkit_atk_get_role_entry, 386 atk_roles_fixture_teardown); 387 388 g_test_add("/webkit/atk/test_webkit_atk_get_role_label", 389 AtkRolesFixture, HTML_LABELED_ENTRY, 390 atk_roles_fixture_setup, 391 test_webkit_atk_get_role_label, 392 atk_roles_fixture_teardown); 393 394 g_test_add("/webkit/atk/test_webkit_atk_get_role_listbox", 395 AtkRolesFixture, HTML_LISTBOX, 396 atk_roles_fixture_setup, 397 test_webkit_atk_get_role_listbox, 398 atk_roles_fixture_teardown); 399 400 g_test_add("/webkit/atk/test_webkit_atk_get_role_password_text", 401 AtkRolesFixture, HTML_PASSWORD_TEXT, 402 atk_roles_fixture_setup, 403 test_webkit_atk_get_role_password_text, 404 atk_roles_fixture_teardown); 405 406 g_test_add("/webkit/atk/test_webkit_atk_get_role_push_button", 407 AtkRolesFixture, HTML_PUSH_BUTTON, 408 atk_roles_fixture_setup, 409 test_webkit_atk_get_role_push_button, 410 atk_roles_fixture_teardown); 411 412 g_test_add("/webkit/atk/test_webkit_atk_get_role_radio_button", 413 AtkRolesFixture, HTML_RADIO_BUTTON, 414 atk_roles_fixture_setup, 415 test_webkit_atk_get_role_radio_button, 416 atk_roles_fixture_teardown); 417 418 return g_test_run(); 419 } 420 421 #else 422 int main(int argc, char** argv) 423 { 424 g_critical("You will need gtk-2.14.0 to run the unit tests. Doing nothing now."); 425 return 0; 426 } 427 428 #endif 429