AX: Treat cells with ARIA table cell properties as cells
authorjdiggs@igalia.com <jdiggs@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 3 May 2017 17:18:43 +0000 (17:18 +0000)
committerjdiggs@igalia.com <jdiggs@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 3 May 2017 17:18:43 +0000 (17:18 +0000)
https://bugs.webkit.org/show_bug.cgi?id=171178

Reviewed by Chris Fleizach.

Source/WebCore:

Add the following checks to heuristics in AccessibilityTable::isDataTable():
1. If the author has provided a valid aria-rowcount or aria-colcount value on
   the table element, expose it as a data table.
2. If the author has provided a valid aria-colindex or aria-rowindex on the
   cell element, expose it as a data table.
3. If the author has provided a valid aria-rowindex on the row element, expose
   it as a data table.
4. If the author has provided a value for aria-colspan or aria-rowspan on a cell,
   expose it as a data table (even though we are supposed to ignore the value for
   the purpose of exposing the span via platform accessibility APIs)

Remove the heuristic that a table with only one cell is "not a good AXTable candidate."
It prevents us from ever doing the above checks.

Test: accessibility/minimal-table-with-aria-is-data-table.html

* accessibility/AccessibilityTable.cpp:
(WebCore::AccessibilityTable::isDataTable):

LayoutTests:

* accessibility/minimal-table-with-aria-is-data-table-expected.txt: Added.
* accessibility/minimal-table-with-aria-is-data-table.html: Added.
* platform/gtk/accessibility/minimal-table-with-aria-is-data-table-expected.txt: Added.

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

LayoutTests/ChangeLog
LayoutTests/accessibility/minimal-table-with-aria-is-data-table-expected.txt [new file with mode: 0644]
LayoutTests/accessibility/minimal-table-with-aria-is-data-table.html [new file with mode: 0644]
LayoutTests/platform/gtk/accessibility/minimal-table-with-aria-is-data-table-expected.txt [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityTable.cpp

index 4900e3a..9f9f19f 100644 (file)
@@ -1,3 +1,14 @@
+2017-05-03  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        AX: Treat cells with ARIA table cell properties as cells
+        https://bugs.webkit.org/show_bug.cgi?id=171178
+
+        Reviewed by Chris Fleizach.
+
+        * accessibility/minimal-table-with-aria-is-data-table-expected.txt: Added.
+        * accessibility/minimal-table-with-aria-is-data-table.html: Added.
+        * platform/gtk/accessibility/minimal-table-with-aria-is-data-table-expected.txt: Added.
+
 2017-05-03  Andy VanWagoner  <thetalecrafter@gmail.com>
 
         [INTL] Support dashed values in unicode locale extensions
diff --git a/LayoutTests/accessibility/minimal-table-with-aria-is-data-table-expected.txt b/LayoutTests/accessibility/minimal-table-with-aria-is-data-table-expected.txt
new file mode 100644 (file)
index 0000000..23c256a
--- /dev/null
@@ -0,0 +1,17 @@
+This tests that minimal tables are treated as data tables if they have ARIA table-related properties.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+cell1: AXRole: AXCell
+cell2: AXRole: AXCell
+cell3: AXRole: AXCell
+cell4: AXRole: AXCell
+cell5: AXRole: AXCell
+cell6: AXRole: AXCell
+cell7: AXRole: AXCell
+cell8: AXRole: AXGroup
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/accessibility/minimal-table-with-aria-is-data-table.html b/LayoutTests/accessibility/minimal-table-with-aria-is-data-table.html
new file mode 100644 (file)
index 0000000..90a68a9
--- /dev/null
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../resources/js-test-pre.js"></script>
+</head>
+<body id="body">
+<div id="content">
+<table><tr><td id="cell1" aria-colspan="1">x</td></tr></table>
+<table><tr><td id="cell2" aria-rowspan="1">x</td></tr></table>
+<table><tr><td id="cell3" aria-colindex="1">x</td></tr></table>
+<table><tr><td id="cell4" aria-rowindex="1">x</td></tr></table>
+<table><tr aria-rowindex="1"><td id="cell5">x</td></tr></table>
+<table aria-rowcount="1"><tr><td id="cell6">x</td></tr></table>
+<table aria-colcount="1"><tr><td id="cell7">x</td></tr></table>
+<table><tr><td id="cell8">x</td></tr></table>
+</div>
+<script>
+
+    description("This tests that minimal tables are treated as data tables if they have ARIA table-related properties.");
+    if (window.accessibilityController) {
+        for (var i = 1; i <= 8; i++) {
+            var axElement = accessibilityController.accessibleElementById("cell" + i);
+            var result = !axElement ? "(not exposed)" : axElement.role;
+            debug("cell" + i + ": " + result);
+        }
+        document.getElementById("content").style.visibility = "hidden";
+    }
+
+</script>
+
+<script src="../resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/platform/gtk/accessibility/minimal-table-with-aria-is-data-table-expected.txt b/LayoutTests/platform/gtk/accessibility/minimal-table-with-aria-is-data-table-expected.txt
new file mode 100644 (file)
index 0000000..f2d64d0
--- /dev/null
@@ -0,0 +1,17 @@
+This tests that minimal tables are treated as data tables if they have ARIA table-related properties.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+cell1: AXRole: AXCell
+cell2: AXRole: AXCell
+cell3: AXRole: AXCell
+cell4: AXRole: AXCell
+cell5: AXRole: AXCell
+cell6: AXRole: AXCell
+cell7: AXRole: AXCell
+cell8: AXRole: AXSection
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
index 1d10198..2284418 100644 (file)
@@ -1,3 +1,29 @@
+2017-05-03  Joanmarie Diggs  <jdiggs@igalia.com>
+
+        AX: Treat cells with ARIA table cell properties as cells
+        https://bugs.webkit.org/show_bug.cgi?id=171178
+
+        Reviewed by Chris Fleizach.
+
+        Add the following checks to heuristics in AccessibilityTable::isDataTable():
+        1. If the author has provided a valid aria-rowcount or aria-colcount value on
+           the table element, expose it as a data table.
+        2. If the author has provided a valid aria-colindex or aria-rowindex on the
+           cell element, expose it as a data table.
+        3. If the author has provided a valid aria-rowindex on the row element, expose
+           it as a data table.
+        4. If the author has provided a value for aria-colspan or aria-rowspan on a cell,
+           expose it as a data table (even though we are supposed to ignore the value for
+           the purpose of exposing the span via platform accessibility APIs)
+
+        Remove the heuristic that a table with only one cell is "not a good AXTable candidate."
+        It prevents us from ever doing the above checks.
+
+        Test: accessibility/minimal-table-with-aria-is-data-table.html
+
+        * accessibility/AccessibilityTable.cpp:
+        (WebCore::AccessibilityTable::isDataTable):
+
 2017-05-03  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [Cairo] Handle extended colors in gradients
index 891587c..2f55b92 100644 (file)
@@ -154,6 +154,16 @@ bool AccessibilityTable::isDataTable() const
     if (!hasTagName(tableTag))
         return false;
     
+    // If the author has used ARIA to specify a valid column or row count, assume they
+    // want us to treat the table as a data table.
+    int ariaColumnCount = getAttribute(aria_colcountAttr).toInt();
+    if (ariaColumnCount == -1 || ariaColumnCount > 0)
+        return true;
+
+    int ariaRowCount = getAttribute(aria_rowcountAttr).toInt();
+    if (ariaRowCount == -1 || ariaRowCount > 0)
+        return true;
+
     RenderTable& table = downcast<RenderTable>(*m_renderer);
     // go through the cell's and check for tell-tale signs of "data" table status
     // cells have borders, or use attributes like headers, abbr, scope or axis
@@ -165,10 +175,6 @@ bool AccessibilityTable::isDataTable() const
     int numCols = firstBody->numColumns();
     int numRows = firstBody->numRows();
     
-    // If there's only one cell, it's not a good AXTable candidate.
-    if (numRows == 1 && numCols == 1)
-        return false;
-
     // If there are at least 20 rows, we'll call it a data table.
     if (numRows >= 20)
         return true;
@@ -181,7 +187,8 @@ bool AccessibilityTable::isDataTable() const
     // Criteria: 
     //   1) must have at least one valid cell (and)
     //   2) at least half of cells have borders (or)
-    //   3) at least half of cells have different bg colors than the table, and there is cell spacing
+    //   3) at least half of cells have different bg colors than the table, and there is cell spacing (or)
+    //   4) the valid cell has an ARIA cell-related property
     unsigned validCellCount = 0;
     unsigned borderedCellCount = 0;
     unsigned backgroundDifferenceCellCount = 0;
@@ -227,6 +234,34 @@ bool AccessibilityTable::isDataTable() const
                     || !tableCellElement.axis().isEmpty() || !tableCellElement.scope().isEmpty())
                     return true;
             }
+
+            // If the author has used ARIA to specify a valid column or row index, assume they want us
+            // to treat the table as a data table.
+            int ariaColumnIndex = cellElement->attributeWithoutSynchronization(aria_colindexAttr).toInt();
+            if (ariaColumnIndex >= 1)
+                return true;
+
+            int ariaRowIndex = cellElement->attributeWithoutSynchronization(aria_rowindexAttr).toInt();
+            if (ariaRowIndex >= 1)
+                return true;
+
+            if (auto cellParentElement = cellElement->parentElement()) {
+                ariaRowIndex = cellParentElement->attributeWithoutSynchronization(aria_rowindexAttr).toInt();
+                if (ariaRowIndex >= 1)
+                    return true;
+            }
+
+            // If the author has used ARIA to specify a column or row span, we're supposed to ignore
+            // the value for the purposes of exposing the span. But assume they want us to treat the
+            // table as a data table.
+            int ariaColumnSpan = cellElement->attributeWithoutSynchronization(aria_colspanAttr).toInt();
+            if (ariaColumnSpan >= 1)
+                return true;
+
+            int ariaRowSpan = cellElement->attributeWithoutSynchronization(aria_rowspanAttr).toInt();
+            if (ariaRowSpan >= 1)
+                return true;
+
             const RenderStyle& renderStyle = cell->style();
 
             // If the empty-cells style is set, we'll call it a data table.