WebKit/gtk/tests/testatkroles.c
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     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 /* 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 at least glib-2.16.0 and gtk-2.14.0 to run the unit tests. Doing nothing now.");
       
   425     return 0;
       
   426 }
       
   427 
       
   428 #endif