Changeset 100424 in webkit


Ignore:
Timestamp:
Nov 16, 2011, 1:46:36 AM (14 years ago)
Author:
mario@webkit.org
Message:

[GTK] Do not hide accessibility root object from AT's
https://bugs.webkit.org/show_bug.cgi?id=72390

Reviewed by Martin Robinson.

  • tests/testatk.c:

(getWebAreaObject): New helper function, to bypass the new root
object in the accessibility hierarchy, since it's not usually
needed for the unit tests.
(testWebkitAtkCaretOffsets): Use getWebAreaObject().
(testWebkitAtkCaretOffsetsAndExtranousWhiteSpaces): Ditto.
(testWebkitAtkComboBox): Ditto.
(testWebkitAtkEmbeddedObjects): Ditto.
(testWebkitAtkGetTextAtOffsetForms): Ditto.
(testWebkitAtkGetTextAtOffset): Ditto.
(testWebkitAtkGetTextAtOffsetNewlines): Ditto.
(testWebkitAtkGetTextAtOffsetTextarea): Ditto.
(testWebkitAtkGetTextAtOffsetTextInput): Ditto.
(testWebkitAtkGetTextAtOffsetWithSpecialCharacters): Ditto.
(testWebkitAtkGetTextInParagraphAndBodySimple): Ditto.
(testWebkitAtkGetTextInParagraphAndBodyModerate): Ditto.
(testWebkitAtkGetTextInTable): Ditto.
(testWebkitAtkGetHeadersInTable): Ditto.
(testWebkitAtkTextAttributes): Ditto.
(testWebkitAtkTextSelections): Ditto.
(testWebkitAtkGetExtents): Ditto.
(testWebkitAtkLayoutAndDataTables): Ditto.
(testWebkitAtkLinksWithInlineImages): Ditto.
(testWebkitAtkHypertextAndHyperlinks): Ditto.
(testWebkitAtkListsOfItems): Ditto.
(testWebkitAtkTextChangedNotifications): Ditto.
(testWebkitAtkParentForRootObject): New test, to make sure that
both top-down and bottom-up navigation among GTK and WebKit worlds
matches accordingly.
(main): Added new test.

  • webkit/webkitwebview.cpp:

(webkit_web_view_get_accessible): Remove the hack introduced
because of bug 51932, to bypass the root object here.

Location:
trunk/Source/WebKit/gtk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/gtk/ChangeLog

    r100309 r100424  
     12011-11-16  Mario Sanchez Prada  <msanchez@igalia.com>
     2
     3        [GTK] Do not hide accessibility root object from AT's
     4        https://bugs.webkit.org/show_bug.cgi?id=72390
     5
     6        Reviewed by Martin Robinson.
     7
     8        * tests/testatk.c:
     9        (getWebAreaObject): New helper function, to bypass the new root
     10        object in the accessibility hierarchy, since it's not usually
     11        needed for the unit tests.
     12        (testWebkitAtkCaretOffsets): Use getWebAreaObject().
     13        (testWebkitAtkCaretOffsetsAndExtranousWhiteSpaces): Ditto.
     14        (testWebkitAtkComboBox): Ditto.
     15        (testWebkitAtkEmbeddedObjects): Ditto.
     16        (testWebkitAtkGetTextAtOffsetForms): Ditto.
     17        (testWebkitAtkGetTextAtOffset): Ditto.
     18        (testWebkitAtkGetTextAtOffsetNewlines): Ditto.
     19        (testWebkitAtkGetTextAtOffsetTextarea): Ditto.
     20        (testWebkitAtkGetTextAtOffsetTextInput): Ditto.
     21        (testWebkitAtkGetTextAtOffsetWithSpecialCharacters): Ditto.
     22        (testWebkitAtkGetTextInParagraphAndBodySimple): Ditto.
     23        (testWebkitAtkGetTextInParagraphAndBodyModerate): Ditto.
     24        (testWebkitAtkGetTextInTable): Ditto.
     25        (testWebkitAtkGetHeadersInTable): Ditto.
     26        (testWebkitAtkTextAttributes): Ditto.
     27        (testWebkitAtkTextSelections): Ditto.
     28        (testWebkitAtkGetExtents): Ditto.
     29        (testWebkitAtkLayoutAndDataTables): Ditto.
     30        (testWebkitAtkLinksWithInlineImages): Ditto.
     31        (testWebkitAtkHypertextAndHyperlinks): Ditto.
     32        (testWebkitAtkListsOfItems): Ditto.
     33        (testWebkitAtkTextChangedNotifications): Ditto.
     34        (testWebkitAtkParentForRootObject): New test, to make sure that
     35        both top-down and bottom-up navigation among GTK and WebKit worlds
     36        matches accordingly.
     37        (main): Added new test.
     38
     39        * webkit/webkitwebview.cpp:
     40        (webkit_web_view_get_accessible): Remove the hack introduced
     41        because of bug 51932, to bypass the root object here.
     42
    1432011-11-15  Anders Carlsson  <andersca@apple.com>
    244
  • trunk/Source/WebKit/gtk/tests/testatk.c

    r98239 r100424  
    6969static const char* textWithAttributes = "<html><head><style>.st1 {font-family: monospace; color:rgb(120,121,122);} .st2 {text-decoration:underline; background-color:rgb(80,81,82);}</style></head><body><p style=\"font-size:14; text-align:right;\">This is the <i>first</i><b> sentence of this text.</b></p><p class=\"st1\">This sentence should have an style applied <span class=\"st2\">and this part should have another one</span>.</p><p>x<sub>1</sub><sup>2</sup>=x<sub>2</sub><sup>3</sup></p><p style=\"text-align:center;\">This sentence is the <strike>last</strike> one.</p></body></html>";
    7070
    71 static void waitForAccessibleObjects()
     71static AtkObject* getWebAreaObject(WebKitWebView* webView)
    7272{
    7373    /* Manually spin the main context to make sure the accessible
     
    7575    while (g_main_context_pending(0))
    7676        g_main_context_iteration(0, TRUE);
     77
     78    AtkObject* rootObject = gtk_widget_get_accessible(GTK_WIDGET(webView));
     79    if (!rootObject)
     80        return NULL;
     81
     82    AtkObject* webAreaObject = atk_object_ref_accessible_child(rootObject, 0);
     83    if (!webAreaObject)
     84        return NULL;
     85
     86    /* We don't need the extra ref here. */
     87    g_object_unref(webAreaObject);
     88
     89    return webAreaObject;
    7790}
    7891
     
    240253    webkit_web_view_load_string(webView, textForCaretBrowsing, 0, 0, 0);
    241254
    242     /* Wait for the accessible objects to be created. */
    243     waitForAccessibleObjects();
    244 
    245     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     255    AtkObject* object = getWebAreaObject(webView);
    246256    g_assert(object);
    247257
     
    343353    webkit_web_view_load_string(webView, contentsWithExtraneousWhiteSpaces, 0, 0, 0);
    344354
    345     /* Wait for the accessible objects to be created. */
    346     waitForAccessibleObjects();
    347 
    348355    /* Enable caret browsing. */
    349356    WebKitWebSettings* settings = webkit_web_view_get_settings(webView);
     
    352359
    353360    /* Get to the inner AtkText object. */
    354     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     361    AtkObject* object = getWebAreaObject(webView);
    355362    g_assert(object);
    356363    object = atk_object_ref_accessible_child(object, 0);
     
    390397    webkit_web_view_load_string(webView, comboBoxSelector, 0, 0, 0);
    391398
    392     /* Wait for the accessible objects to be created. */
    393     waitForAccessibleObjects();
    394 
    395     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     399    AtkObject* object = getWebAreaObject(webView);
    396400    g_assert(object);
    397401
     
    491495    webkit_web_view_load_string(webView, embeddedObjects, 0, 0, 0);
    492496
    493     /* Wait for the accessible objects to be created. */
    494     waitForAccessibleObjects();
    495 
    496     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     497    AtkObject* object = getWebAreaObject(webView);
    497498    g_assert(object);
    498499
     
    577578    webkit_web_view_load_string(webView, contents, 0, 0, 0);
    578579
    579     /* Wait for the accessible objects to be created. */
    580     waitForAccessibleObjects();
    581 
    582580    /* Get to the inner AtkText object. */
    583     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     581    AtkObject* object = getWebAreaObject(webView);
    584582    g_assert(object);
    585583    object = atk_object_ref_accessible_child(object, 0);
     
    602600    webkit_web_view_load_string(webView, contents, 0, 0, 0);
    603601
    604     /* Wait for the accessible objects to be created. */
    605     waitForAccessibleObjects();
    606 
    607602    /* Get to the inner AtkText object. */
    608     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     603    AtkObject* object = getWebAreaObject(webView);
    609604    g_assert(object);
    610605    object = atk_object_ref_accessible_child(object, 0);
     
    627622    webkit_web_view_load_string(webView, contentsWithNewlines, 0, 0, 0);
    628623
    629     /* Wait for the accessible objects to be created. */
    630     waitForAccessibleObjects();
    631 
    632624    /* Get to the inner AtkText object. */
    633     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     625    AtkObject* object = getWebAreaObject(webView);
    634626    g_assert(object);
    635627    object = atk_object_ref_accessible_child(object, 0);
     
    652644    webkit_web_view_load_string(webView, contentsInTextarea, 0, 0, 0);
    653645
    654     /* Wait for the accessible objects to be created. */
    655     waitForAccessibleObjects();
    656 
    657646    /* Get to the inner AtkText object. */
    658     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     647    AtkObject* object = getWebAreaObject(webView);
    659648    g_assert(object);
    660649    object = atk_object_ref_accessible_child(object, 0);
     
    679668    webkit_web_view_load_string(webView, contentsInTextInput, 0, 0, 0);
    680669
    681     /* Wait for the accessible objects to be created. */
    682     waitForAccessibleObjects();
    683 
    684670    /* Get to the inner AtkText object. */
    685     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     671    AtkObject* object = getWebAreaObject(webView);
    686672    g_assert(object);
    687673    object = atk_object_ref_accessible_child(object, 0);
     
    706692    webkit_web_view_load_string(webView, contentsWithSpecialChars, 0, 0, 0);
    707693
    708     /* Wait for the accessible objects to be created. */
    709     waitForAccessibleObjects();
    710 
    711694    /* Get to the inner AtkText object. */
    712     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     695    AtkObject* object = getWebAreaObject(webView);
    713696    g_assert(object);
    714697    object = atk_object_ref_accessible_child(object, 0);
     
    740723    webkit_web_view_load_string(webView, contentsInParagraphAndBodySimple, 0, 0, 0);
    741724
    742     /* Wait for the accessible objects to be created. */
    743     waitForAccessibleObjects();
    744 
    745725    /* Get to the inner AtkText object. */
    746     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     726    AtkObject* object = getWebAreaObject(webView);
    747727    g_assert(object);
    748728    AtkObject* object1 = atk_object_ref_accessible_child(object, 0);
     
    775755    webkit_web_view_load_string(webView, contentsInParagraphAndBodyModerate, 0, 0, 0);
    776756
    777     /* Wait for the accessible objects to be created. */
    778     waitForAccessibleObjects();
    779 
    780757    /* Get to the inner AtkText object. */
    781     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     758    AtkObject* object = getWebAreaObject(webView);
    782759    g_assert(object);
    783760    AtkObject* object1 = atk_object_ref_accessible_child(object, 0);
     
    810787    webkit_web_view_load_string(webView, contentsInTable, 0, 0, 0);
    811788
    812     /* Wait for the accessible objects to be created. */
    813     waitForAccessibleObjects();
    814 
    815     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     789    AtkObject* object = getWebAreaObject(webView);
    816790    g_assert(object);
    817791    object = atk_object_ref_accessible_child(object, 0);
     
    833807    webkit_web_view_load_string(webView, contentsInTableWithHeaders, 0, 0, 0);
    834808
    835     /* Wait for the accessible objects to be created. */
    836     waitForAccessibleObjects();
    837 
    838     AtkObject* axWebView = gtk_widget_get_accessible(GTK_WIDGET(webView));
     809    AtkObject* axWebView = getWebAreaObject(webView);
    839810    g_assert(axWebView);
    840811
     
    967938    webkit_web_view_load_string(webView, textWithAttributes, 0, 0, 0);
    968939
    969     /* Wait for the accessible objects to be created. */
    970     waitForAccessibleObjects();
    971 
    972     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     940    AtkObject* object = getWebAreaObject(webView);
    973941    g_assert(object);
    974942
     
    10771045    webkit_web_view_load_string(webView, textForSelections, 0, 0, 0);
    10781046
    1079     /* Wait for the accessible objects to be created. */
    1080     waitForAccessibleObjects();
    1081 
    1082     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     1047    AtkObject* object = getWebAreaObject(webView);
    10831048    g_assert(object);
    10841049
     
    12341199    webkit_web_view_load_string(webView, centeredContents, 0, 0, 0);
    12351200
    1236     /* Wait for the accessible objects to be created. */
    1237     waitForAccessibleObjects();
    1238 
    1239     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     1201    AtkObject* object = getWebAreaObject(webView);
    12401202    g_assert(object);
    12411203
     
    13501312    webkit_web_view_load_string(webView, layoutAndDataTables, 0, 0, 0);
    13511313
    1352     /* Wait for the accessible objects to be created. */
    1353     waitForAccessibleObjects();
    1354 
    1355     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     1314    AtkObject* object = getWebAreaObject(webView);
    13561315    g_assert(object);
    13571316
     
    13881347    webkit_web_view_load_string(webView, linksWithInlineImages, 0, 0, 0);
    13891348
    1390     /* Wait for the accessible objects to be created. */
    1391     waitForAccessibleObjects();
    1392 
    1393     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     1349    AtkObject* object = getWebAreaObject(webView);
    13941350    g_assert(object);
    13951351
     
    14401396    webkit_web_view_load_string(webView, hypertextAndHyperlinks, 0, 0, 0);
    14411397
    1442     /* Wait for the accessible objects to be created. */
    1443     waitForAccessibleObjects();
    1444 
    1445     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     1398    AtkObject* object = getWebAreaObject(webView);
    14461399    g_assert(object);
    14471400
     
    15351488    webkit_web_view_load_string(webView, listsOfItems, 0, 0, 0);
    15361489
    1537     /* Wait for the accessible objects to be created. */
    1538     waitForAccessibleObjects();
    1539 
    1540     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     1490    AtkObject* object = getWebAreaObject(webView);
    15411491    g_assert(object);
    15421492
     
    16261576    webkit_web_view_load_string(webView, formWithTextInputs, 0, 0, 0);
    16271577
    1628     /* Wait for the accessible objects to be created. */
    1629     waitForAccessibleObjects();
    1630 
    1631     AtkObject* object = gtk_widget_get_accessible(GTK_WIDGET(webView));
     1578    AtkObject* object = getWebAreaObject(webView);
    16321579    g_assert(object);
    16331580
     
    16571604    g_object_unref(textEntry);
    16581605    g_object_unref(webView);
     1606}
     1607
     1608static void testWebkitAtkParentForRootObject()
     1609{
     1610    WebKitWebView* webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
     1611    GtkAllocation allocation = { 0, 0, 800, 600 };
     1612    gtk_widget_size_allocate(GTK_WIDGET(webView), &allocation);
     1613    webkit_web_view_load_string(webView, contents, 0, 0, 0);
     1614
     1615    /* We need a parent for the webview to check top-down and
     1616       bottom-up navigation among them, so create a box for it. */
     1617#ifdef GTK_API_VERSION_2
     1618    GtkWidget* box = gtk_vbox_new(FALSE, 0);
     1619#else
     1620    GtkWidget* box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
     1621#endif
     1622    g_object_ref_sink(box);
     1623    gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(webView), FALSE, FALSE, 0);
     1624
     1625    AtkObject* axBox = gtk_widget_get_accessible (box);
     1626    g_assert(ATK_IS_OBJECT(axBox));
     1627
     1628    g_assert_cmpint(atk_object_get_n_accessible_children(axBox), ==, 1);
     1629    AtkObject* axBoxChild = atk_object_ref_accessible_child(axBox, 0);
     1630    g_assert(axBoxChild);
     1631
     1632    AtkObject* axRoot = gtk_widget_get_accessible(GTK_WIDGET(webView));
     1633    g_assert(ATK_IS_OBJECT(axRoot));
     1634
     1635    /* The box's child should be the AtkObject for the WebView's root. */
     1636    g_assert(axBoxChild == axRoot);
     1637
     1638    /* Bottom-up navigation should match top-down one. */
     1639    g_assert(atk_object_get_parent(axBoxChild) == axBox);
     1640
     1641    g_object_unref(axBoxChild);
     1642    g_object_unref(box);
    16591643}
    16601644
     
    16861670    g_test_add_func("/webkit/atk/listsOfItems", testWebkitAtkListsOfItems);
    16871671    g_test_add_func("/webkit/atk/textChangedNotifications", testWebkitAtkTextChangedNotifications);
     1672    g_test_add_func("/webkit/atk/parentForRootObject", testWebkitAtkParentForRootObject);
    16881673    return g_test_run ();
    16891674}
  • trunk/Source/WebKit/gtk/webkit/webkitwebview.cpp

    r99108 r100424  
    13091309        return 0;
    13101310
    1311     AXObjectCache::enableAccessibility();
     1311    if (!AXObjectCache::accessibilityEnabled())
     1312        AXObjectCache::enableAccessibility();
    13121313
    13131314    Frame* coreFrame = core(webView)->mainFrame();
     
    13231324        return 0;
    13241325
    1325     // We need to return the root accessibility object's first child
    1326     // to get to the actual ATK Object associated with the web view.
    1327     // See https://bugs.webkit.org/show_bug.cgi?id=51932
    13281326    AtkObject* axRoot = rootAccessible->wrapper();
    13291327    if (!axRoot || !ATK_IS_OBJECT(axRoot))
    13301328        return 0;
    13311329
    1332     AtkObject* axWebView = atk_object_ref_accessible_child(ATK_OBJECT(axRoot), 0);
    1333     if (!axWebView || !ATK_IS_OBJECT(axWebView))
    1334         return 0;
    1335 
    1336     // We don't want the extra reference returned by ref_accessible_child.
    1337     g_object_unref(axWebView);
    1338     return axWebView;
     1330    return axRoot;
    13391331}
    13401332
Note: See TracChangeset for help on using the changeset viewer.