2011-04-11 Mario Sanchez Prada <msanchez@igalia.com>
authormario@webkit.org <mario@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Apr 2011 17:39:11 +0000 (17:39 +0000)
committermario@webkit.org <mario@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Apr 2011 17:39:11 +0000 (17:39 +0000)
        Reviewed by Chris Fleizach.

        [GTK] ARIA tables not exposing cells as HTML tables do
        https://bugs.webkit.org/show_bug.cgi?id=57463

        Unskipped passing test and added GTK-specific expectations.

        * platform/gtk/Skipped: Unskip accessibility test.
        * platform/gtk/accessibility/aria-table-hierarchy-expected.txt: Added.
2011-04-11  Mario Sanchez Prada  <msanchez@igalia.com>

        Reviewed by Chris Fleizach.

        [GTK] ARIA tables not exposing cells as HTML tables do
        https://bugs.webkit.org/show_bug.cgi?id=57463

        Expose cells for ARIA grids consistently with HTML tables in GTK,
        keeping the same behaviour for the other platforms.

        * accessibility/AccessibilityARIAGrid.cpp:
        (WebCore::AccessibilityARIAGrid::addChild): Add the row's children
        to the accessibility hierarchy when accessibility objects for rows
        are ignoring accessibility, otherwise add the row.
        (WebCore::AccessibilityARIAGrid::addChildren): Do not check at
        this point whether every child of the table ignores or not
        accessibility, letting addChild() make the proper decision later.

        * accessibility/AccessibilityARIAGridCell.cpp:
        (WebCore::AccessibilityARIAGridCell::parentTable): Consider that
        rows could be ignoring accessibility, hence the parent could be
        retrieved in the first call to parentObjectUnignored().
        (WebCore::AccessibilityARIAGridCell::rowIndexRange): Ditto.
        (WebCore::AccessibilityARIAGridCell::columnIndexRange): Ditto..

        * accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:
        (atkRole): Map ColumnHeader and RowHeader to ATK_ROLE_TABLE_CELL.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@83450 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/platform/gtk/Skipped
LayoutTests/platform/gtk/accessibility/aria-table-hierarchy-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityARIAGrid.cpp
Source/WebCore/accessibility/AccessibilityARIAGridCell.cpp
Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp

index ea275c3..35c6ff1 100644 (file)
@@ -1,3 +1,15 @@
+2011-04-11  Mario Sanchez Prada  <msanchez@igalia.com>
+
+        Reviewed by Chris Fleizach.
+
+        [GTK] ARIA tables not exposing cells as HTML tables do
+        https://bugs.webkit.org/show_bug.cgi?id=57463
+
+        Unskipped passing test and added GTK-specific expectations.
+
+        * platform/gtk/Skipped: Unskip accessibility test.
+        * platform/gtk/accessibility/aria-table-hierarchy-expected.txt: Added.
+
 2011-04-11  Dimitri Glazkov  <dglazkov@chromium.org>
 
         [GTK] Update expectations after r83445.
index 371b116..5421403 100644 (file)
@@ -1235,9 +1235,6 @@ fast/dom/nodesFromRect-inner-documents.html
 # LayoutTestController::addUserScript not implemented for gtk
 plugins/plugin-document-load-prevented-userscript.html
 
-# https://bugs.webkit.org/show_bug.cgi?id=47564
-platform/gtk/accessibility/aria-table-hierarchy.html
-
 # https://bugs.webkit.org/show_bug.cgi?id=50872
 http/tests/misc/dns-prefetch-control.html
 
diff --git a/LayoutTests/platform/gtk/accessibility/aria-table-hierarchy-expected.txt b/LayoutTests/platform/gtk/accessibility/aria-table-hierarchy-expected.txt
new file mode 100644 (file)
index 0000000..7a91efb
--- /dev/null
@@ -0,0 +1,61 @@
+foo
+bar
+Odd
+Even
+1
+2
+3
+4
+hello
+world
+Odd
+Even
+1
+
+2
+
+3
+
+4
+
+This tests the Atk table hierarhy for an ARIA table.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS table1.role is 'AXRole: table'
+PASS table1.rowCount is 1
+PASS table1.columnCount is 2
+PASS table2.role is 'AXRole: table'
+PASS table2.rowCount is 3
+PASS table2.columnCount is 2
+PASS table3.role is 'AXRole: table'
+PASS table3.rowCount is 1
+PASS table3.columnCount is 2
+PASS table4.role is 'AXRole: table'
+PASS table4.rowCount is 3
+PASS table4.columnCount is 2
+PASS children is 2
+PASS table1.childAtIndex(i).role is 'AXRole: table cell'
+PASS table1.childAtIndex(i).role is 'AXRole: table cell'
+PASS children is 6
+PASS table2.childAtIndex(i).role is 'AXRole: table cell'
+PASS table2.childAtIndex(i).role is 'AXRole: table cell'
+PASS table2.childAtIndex(i).role is 'AXRole: table cell'
+PASS table2.childAtIndex(i).role is 'AXRole: table cell'
+PASS table2.childAtIndex(i).role is 'AXRole: table cell'
+PASS table2.childAtIndex(i).role is 'AXRole: table cell'
+PASS children is 2
+PASS table3.childAtIndex(i).role is 'AXRole: table cell'
+PASS table3.childAtIndex(i).role is 'AXRole: table cell'
+PASS children is 6
+PASS table4.childAtIndex(i).role is 'AXRole: table cell'
+PASS table4.childAtIndex(i).role is 'AXRole: table cell'
+PASS table4.childAtIndex(i).role is 'AXRole: table cell'
+PASS table4.childAtIndex(i).role is 'AXRole: table cell'
+PASS table4.childAtIndex(i).role is 'AXRole: table cell'
+PASS table4.childAtIndex(i).role is 'AXRole: table cell'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
index 09231a8..94fa2e9 100644 (file)
@@ -1,3 +1,31 @@
+2011-04-11  Mario Sanchez Prada  <msanchez@igalia.com>
+
+        Reviewed by Chris Fleizach.
+
+        [GTK] ARIA tables not exposing cells as HTML tables do
+        https://bugs.webkit.org/show_bug.cgi?id=57463
+
+        Expose cells for ARIA grids consistently with HTML tables in GTK,
+        keeping the same behaviour for the other platforms.
+
+        * accessibility/AccessibilityARIAGrid.cpp:
+        (WebCore::AccessibilityARIAGrid::addChild): Add the row's children
+        to the accessibility hierarchy when accessibility objects for rows
+        are ignoring accessibility, otherwise add the row.
+        (WebCore::AccessibilityARIAGrid::addChildren): Do not check at
+        this point whether every child of the table ignores or not
+        accessibility, letting addChild() make the proper decision later.
+
+        * accessibility/AccessibilityARIAGridCell.cpp:
+        (WebCore::AccessibilityARIAGridCell::parentTable): Consider that
+        rows could be ignoring accessibility, hence the parent could be
+        retrieved in the first call to parentObjectUnignored().
+        (WebCore::AccessibilityARIAGridCell::rowIndexRange): Ditto.
+        (WebCore::AccessibilityARIAGridCell::columnIndexRange): Ditto..
+
+        * accessibility/gtk/AccessibilityObjectWrapperAtk.cpp:
+        (atkRole): Map ColumnHeader and RowHeader to ATK_ROLE_TABLE_CELL.
+
 2011-04-11  Sergio Villar Senin  <svillar@igalia.com>
 
         Reviewed by Martin Robinson.
index d51750a..5f9444a 100644 (file)
@@ -75,7 +75,14 @@ void AccessibilityARIAGrid::addChild(AccessibilityObject* child, HashSet<Accessi
     
     row->setRowIndex((int)m_rows.size());        
     m_rows.append(row);
-    m_children.append(row);
+
+    // Try adding the row if it's not ignoring accessibility,
+    // otherwise add its children (the cells) as the grid's children.
+    if (!row->accessibilityIsIgnored())
+        m_children.append(row);
+    else
+        m_children.append(row->children());
+
     appendedRows.add(row);
 }
     
@@ -99,17 +106,21 @@ void AccessibilityARIAGrid::addChildren()
     unsigned columnCount = 0;
     for (RefPtr<AccessibilityObject> child = firstChild(); child; child = child->nextSibling()) {
 
-        // in case the render tree doesn't match the expected ARIA hierarchy, look at the children
-        if (child->accessibilityIsIgnored()) {
+        if (child->isTableRow() || child->ariaRoleAttribute() == RowRole)
+            addChild(child.get(), appendedRows, columnCount);
+        else {
+            // in case the render tree doesn't match the expected ARIA hierarchy, look at the children
             if (!child->hasChildren())
                 child->addChildren();
-            
-            AccessibilityChildrenVector children = child->children();
-            unsigned length = children.size();
-            for (unsigned i = 0; i < length; ++i)
-                addChild(children[i].get(), appendedRows, columnCount);
-        } else
-            addChild(child.get(), appendedRows, columnCount);            
+
+            // Do not navigate children through the Accessibility
+            // children vector to let addChild() check the result
+            // of accessibilityIsIgnored() and make the proper
+            // decision (add the objects or their children).
+            AccessibilityObject* grandChild = 0;
+            for (grandChild = child->firstChild(); grandChild; grandChild = grandChild->nextSibling())
+                addChild(grandChild, appendedRows, columnCount);
+        }
     }
     
     // make the columns based on the number of columns in the first body
index c8157f5..55d09ad 100644 (file)
@@ -30,6 +30,7 @@
 #include "AccessibilityARIAGridCell.h"
 
 #include "AccessibilityObject.h"
+#include "AccessibilityTable.h"
 #include "AccessibilityTableRow.h"
 
 using namespace std;
@@ -53,9 +54,15 @@ PassRefPtr<AccessibilityARIAGridCell> AccessibilityARIAGridCell::create(RenderOb
 AccessibilityObject* AccessibilityARIAGridCell::parentTable() const
 {
     AccessibilityObject* parent = parentObjectUnignored();
-    if (!parent || !parent->isTableRow())
+    if (!parent)
         return 0;
     
+    if (parent->isAccessibilityTable())
+        return parent;
+
+    // It could happen that we hadn't reached the parent table yet (in
+    // case objects for rows were not ignoring accessibility) so for
+    // that reason we need to run parentObjectUnignored once again.
     parent = parent->parentObjectUnignored();
     if (!parent || !parent->isAccessibilityTable())
         return 0;
@@ -66,20 +73,42 @@ AccessibilityObject* AccessibilityARIAGridCell::parentTable() const
 void AccessibilityARIAGridCell::rowIndexRange(pair<int, int>& rowRange)
 {
     AccessibilityObject* parent = parentObjectUnignored();
-    if (!parent || !parent->isTableRow())
+    if (!parent)
         return;
 
+    if (parent->isTableRow()) {
+        // We already got a table row, use its API.
+        rowRange.first = static_cast<AccessibilityTableRow*>(parent)->rowIndex();
+    } else if (parent->isAccessibilityTable()) {
+        // We reached the parent table, so we need to inspect its
+        // children to determine the row index for the cell in it.
+        unsigned columnCount = static_cast<AccessibilityTable*>(parent)->columnCount();
+        if (!columnCount)
+            return;
+
+        AccessibilityChildrenVector siblings = parent->children();
+        unsigned childrenSize = siblings.size();
+        for (unsigned k = 0; k < childrenSize; ++k) {
+            if (siblings[k].get() == this) {
+                rowRange.first = k / columnCount;
+                break;
+            }
+        }
+    }
+
     // as far as I can tell, grid cells cannot span rows
-    rowRange.first = static_cast<AccessibilityTableRow*>(parent)->rowIndex();
-    rowRange.second = 1;    
+    rowRange.second = 1;
 }
 
 void AccessibilityARIAGridCell::columnIndexRange(pair<int, int>& columnRange)
 {
     AccessibilityObject* parent = parentObjectUnignored();
-    if (!parent || !parent->isTableRow())
+    if (!parent)
         return;
-    
+
+    if (!parent->isTableRow() && !parent->isAccessibilityTable())
+        return;
+
     AccessibilityChildrenVector siblings = parent->children();
     unsigned childrenSize = siblings.size();
     for (unsigned k = 0; k < childrenSize; ++k) {
index 6d662e4..502da0b 100644 (file)
@@ -452,6 +452,8 @@ static AtkRole atkRole(AccessibilityRole role)
     case GroupRole:
     case RadioGroupRole:
         return ATK_ROLE_PANEL;
+    case RowHeaderRole: // Row headers are cells after all.
+    case ColumnHeaderRole: // Column headers are cells after all.
     case CellRole:
         return ATK_ROLE_TABLE_CELL;
     case LinkRole: