Title: [152522] trunk
Revision
152522
Author
[email protected]
Date
2013-07-09 17:39:45 -0700 (Tue, 09 Jul 2013)

Log Message

@readonly and @aria-readonly="false" are not exposed correctly to accessibility
https://bugs.webkit.org/show_bug.cgi?id=118475

Patch by James Craig <[email protected]> on 2013-07-09
Reviewed by Chris Fleizach.

Source/WebCore:

Account for implicit and explicit @readonly/@aria-readonly mismatches. Updated existing test coverage.

* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::canSetValueAttribute):

LayoutTests:

Updated existing test to account for implicit and explicit @readonly/@aria-readonly mismatches.

* accessibility/aria-readonly-expected.txt:
* accessibility/aria-readonly.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (152521 => 152522)


--- trunk/LayoutTests/ChangeLog	2013-07-09 23:18:55 UTC (rev 152521)
+++ trunk/LayoutTests/ChangeLog	2013-07-10 00:39:45 UTC (rev 152522)
@@ -1,3 +1,15 @@
+2013-07-09  James Craig  <[email protected]>
+
+        @readonly and @aria-readonly="false" are not exposed correctly to accessibility
+        https://bugs.webkit.org/show_bug.cgi?id=118475
+
+        Reviewed by Chris Fleizach.
+
+        Updated existing test to account for implicit and explicit @readonly/@aria-readonly mismatches. 
+
+        * accessibility/aria-readonly-expected.txt:
+        * accessibility/aria-readonly.html:
+
 2013-07-09  Mark Lam  <[email protected]>
 
         Fix 30% JSBench regression (caused by adding column numbers to stack traces).

Modified: trunk/LayoutTests/accessibility/aria-readonly-expected.txt (152521 => 152522)


--- trunk/LayoutTests/accessibility/aria-readonly-expected.txt	2013-07-09 23:18:55 UTC (rev 152521)
+++ trunk/LayoutTests/accessibility/aria-readonly-expected.txt	2013-07-10 00:39:45 UTC (rev 152522)
@@ -1,17 +1,46 @@
-     
-This tests that the AXValue property is correctly reported for native and non-native text boxes.
+              
+This tests that the readonly state of the AXValue property is correctly reported for native and non-native elements.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
+Elements to test: 35
+
+PASS htmlEditableDivIsWritable is true
+PASS htmlEditableDiv2IsWritable is false
+PASS htmlEditableDiv3IsWritable is true
+PASS htmlEditableDiv4IsWritable is true
+PASS htmlEditableDiv5IsWritable is false
+PASS htmlEditableDiv6IsWritable is true
+PASS htmlNonEditableDivIsWritable is false
+PASS htmlNonEditableDiv2IsWritable is false
+PASS htmlNonEditableDiv3IsWritable is true
 PASS ariaTextBoxIsWritable is true
 PASS ariaReadOnlyAriaTextBoxIsWritable is false
-PASS ariaReadOnlyTextFieldIsWritable is false
-PASS ariaNonReadOnlyTextFieldIsWritable is true
 PASS htmlReadOnlyTextFieldIsWritable is false
+PASS htmlReadOnlyTextField2IsWritable is false
+PASS htmlReadOnlyTextField3IsWritable is false
+PASS htmlReadOnlyTextField4IsWritable is false
+PASS htmlReadOnlyTextAreaIsWritable is false
+PASS htmlReadOnlyTextArea2IsWritable is false
+PASS htmlReadOnlyTextArea3IsWritable is false
+PASS htmlReadOnlyTextArea3IsWritable is false
 PASS textFieldIsWritable is true
-PASS htmlReadOnlyTextAreaIsWritable is false
+PASS ariaReadOnlyTextFieldIsWritable is true
+PASS ariaNonReadOnlyTextFieldIsWritable is true
 PASS textAreaIsWritable is true
+PASS textArea2IsWritable is true
+PASS textArea3IsWritable is true
+PASS ariaGridCellIsWritable is false
+PASS ariaGridCell2IsWritable is true
+PASS ariaColumnHeaderIsWritable is false
+PASS ariaColumnHeader2IsWritable is true
+PASS ariaRowHeaderIsWritable is false
+PASS ariaRowHeader2IsWritable is true
+PASS ariaGridIsWritable is false
+PASS ariaGrid2IsWritable is true
+PASS ariaTreeGridIsWritable is false
+PASS ariaTreeGrid2IsWritable is true
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/accessibility/aria-readonly.html (152521 => 152522)


--- trunk/LayoutTests/accessibility/aria-readonly.html	2013-07-09 23:18:55 UTC (rev 152521)
+++ trunk/LayoutTests/accessibility/aria-readonly.html	2013-07-10 00:39:45 UTC (rev 152522)
@@ -4,61 +4,80 @@
 <script src=""
 </head>
 <body id="body">
-<div role="textbox" aria-readonly="false" aria-multiline="false" id="ariaTextBox" tabindex="0"></div>
-<div role="textbox" aria-readonly="true" id="ariaReadOnlyAriaTextBox" tabindex="0"></div>
-<input type="text" aria-readonly="true" id="ariaReadOnlyTextField" size=20>
-<input type="text" aria-readonly="false" id="ariaNonReadOnlyTextField" size=20>
-<input type="text" readonly="readonly" id="htmlReadOnlyTextField" size=20>
-<input type="text" id="textField" size=20>
-<textarea rows="2" cols="20" readonly="readonly" id="htmlReadOnlyTextArea"></textarea>
-<textarea rows="2" cols="20" id="textArea"></textarea>
+
+<!-- These reflect the native writable state, but can be overridden by @aria-readonly. -->
+<div contenteditable id="htmlEditableDiv" data-expectedwritable="true"></div>
+<div contenteditable id="htmlEditableDiv2" aria-readonly="true" data-expectedwritable="false"></div>
+<div contenteditable id="htmlEditableDiv3" aria-readonly="false" data-expectedwritable="true"></div>
+<div role="group" contenteditable id="htmlEditableDiv4" data-expectedwritable="true"></div>
+<div role="group" contenteditable id="htmlEditableDiv5" aria-readonly="true" data-expectedwritable="false"></div>
+<div role="group" contenteditable id="htmlEditableDiv6" aria-readonly="false" data-expectedwritable="true"></div>
+<div role="group" id="htmlNonEditableDiv" data-expectedwritable="false"></div>
+<div role="group" id="htmlNonEditableDiv2" aria-readonly="true" data-expectedwritable="false"></div>
+<div role="group" id="htmlNonEditableDiv3" aria-readonly="false" data-expectedwritable="true"></div>
+<div role="textbox" aria-readonly="false" aria-multiline="false" id="ariaTextBox" tabindex="0" data-expectedwritable="true"></div>
+<div role="textbox" aria-readonly="true" id="ariaReadOnlyAriaTextBox" tabindex="0" data-expectedwritable="false"></div>
+
+<!-- These are all readonly b/c the explicit boolean attr @readonly trumps @aria-readonly on native form elements. -->
+<input type="text" readonly="readonly" id="htmlReadOnlyTextField" size=20 data-expectedwritable="false">
+<input type="text" readonly id="htmlReadOnlyTextField2" size=20 data-expectedwritable="false">
+<input type="text" readonly="readonly" aria-readonly="false" id="htmlReadOnlyTextField3" size=20 data-expectedwritable="false">
+<input type="text" readonly aria-readonly="false" id="htmlReadOnlyTextField4" size=20 data-expectedwritable="false">
+<textarea rows="2" cols="20" readonly="readonly" id="htmlReadOnlyTextArea" data-expectedwritable="false"></textarea>
+<textarea rows="2" cols="20" readonly id="htmlReadOnlyTextArea2" data-expectedwritable="false"></textarea>
+<textarea rows="2" cols="20" readonly aria-readonly="true" id="htmlReadOnlyTextArea3" data-expectedwritable="false"></textarea>
+<textarea rows="2" cols="20" readonly aria-readonly="false" id="htmlReadOnlyTextArea3" data-expectedwritable="false"></textarea>
+
+<!-- These are all writable b/c the implicit boolean attr @readonly is false, and trumps @aria-readonly on native form elements. -->
+<input type="text" id="textField" size=20 data-expectedwritable="true">
+<input type="text" aria-readonly="true" id="ariaReadOnlyTextField" size=20 data-expectedwritable="true">
+<input type="text" aria-readonly="false" id="ariaNonReadOnlyTextField" size=20 data-expectedwritable="true">
+<textarea rows="2" cols="20" id="textArea" data-expectedwritable="true"></textarea>
+<textarea rows="2" cols="20" id="textArea2" aria-readonly="true" data-expectedwritable="true"></textarea>
+<textarea rows="2" cols="20" id="textArea3" aria-readonly="false" data-expectedwritable="true"></textarea>
+
+
+<!-- aria-readonly is also allowed on gridcells and grids -->
+<div role="grid"><div role="row"><div role="gridcell" aria-readonly="true" id="ariaGridCell" tabindex="0" data-expectedwritable="false"></div></div></div>
+<div role="grid"><div role="row"><div role="gridcell" aria-readonly="false" id="ariaGridCell2" tabindex="0" data-expectedwritable="true"></div></div></div>
+<div role="grid"><div role="row"><div role="columnheader" aria-readonly="true" id="ariaColumnHeader" tabindex="0" data-expectedwritable="false"></div></div></div>
+<div role="grid"><div role="row"><div role="columnheader" aria-readonly="false" id="ariaColumnHeader2" tabindex="0" data-expectedwritable="true"></div></div></div>
+<div role="grid"><div role="row"><div role="rowheader" aria-readonly="true" id="ariaRowHeader" tabindex="0" data-expectedwritable="false"></div></div></div>
+<div role="grid"><div role="row"><div role="rowheader" aria-readonly="false" id="ariaRowHeader2" tabindex="0" data-expectedwritable="true"></div></div></div>
+<div role="grid" aria-readonly="true" id="ariaGrid" tabindex="0" data-expectedwritable="false"><div role="row"><div role="gridcell"></div></div></div>
+<div role="grid" aria-readonly="false" id="ariaGrid2" tabindex="0" data-expectedwritable="true"><div role="row"><div role="gridcell"></div></div></div>
+<div role="treegrid" aria-readonly="true" id="ariaTreeGrid" tabindex="0" data-expectedwritable="false"><div role="row"><div role="gridcell"></div></div></div>
+<div role="treegrid" aria-readonly="false" id="ariaTreeGrid2" tabindex="0" data-expectedwritable="true"><div role="row"><div role="gridcell"></div></div></div>
+
+
+
 <p id="description"></p>
 <div id="console"></div>
 
 <script>
 
-    description("This tests that the AXValue property is correctly reported for native and non-native text boxes.");
+    description("This tests that the readonly state of the AXValue property is correctly reported for native and non-native elements.");
 
     if (window.accessibilityController) {
-          document.getElementById("ariaTextBox").focus();
-          var ariaTextBox = accessibilityController.focusedElement;
-          var ariaTextBoxIsWritable = ariaTextBox.isAttributeSettable("AXValue");
-          shouldBe("ariaTextBoxIsWritable", "true");
 
-          document.getElementById("ariaReadOnlyAriaTextBox").focus();
-          var ariaReadOnlyAriaTextBox = accessibilityController.focusedElement;
-          var ariaReadOnlyAriaTextBoxIsWritable = ariaReadOnlyAriaTextBox.isAttributeSettable("AXValue");
-          shouldBe("ariaReadOnlyAriaTextBoxIsWritable", "false");
+        var result = document.getElementById('console');
+        var elements = document.querySelectorAll('[data-expectedwritable]');
+        result.innerText += "Elements to test: " + elements.length + "\n\n";
 
-          document.getElementById("ariaReadOnlyTextField").focus();
-          var ariaReadOnlyTextField = accessibilityController.focusedElement;
-          var ariaReadOnlyTextFieldIsWritable = ariaReadOnlyTextField.isAttributeSettable("AXValue");
-          shouldBe("ariaReadOnlyTextFieldIsWritable", "false");
+        for (var i = 0, c = elements.length; i < c; i++) {
+            var el = elements[i];
+            var id = el.id;
+            var axElement = accessibilityController.accessibleElementById(id);
+            var writable = axElement.isAttributeSettable("AXValue");
 
-          document.getElementById("ariaNonReadOnlyTextField").focus();
-          var ariaNonReadOnlyTextField = accessibilityController.focusedElement;
-          var ariaNonReadOnlyTextFieldIsWritable = ariaNonReadOnlyTextField.isAttributeSettable("AXValue");
-          shouldBe("ariaNonReadOnlyTextFieldIsWritable", "true");
+            // Test whether AXValue is writable.
+            var passed = el.getAttribute('data-expectedwritable') === writable.toString();
+            var output = (passed ? "PASS" : "FAIL") + " " + id + "IsWritable is " + writable;
+            if (!passed)
+                output += ", expected " + el.getAttribute("data-expectedwritable");
+            result.innerText += output + "\n";
+        }
 
-          document.getElementById("htmlReadOnlyTextField").focus();
-          var htmlReadOnlyTextField = accessibilityController.focusedElement;
-          var htmlReadOnlyTextFieldIsWritable = htmlReadOnlyTextField.isAttributeSettable("AXValue");
-          shouldBe("htmlReadOnlyTextFieldIsWritable", "false");
-
-          document.getElementById("textField").focus();
-          var textField = accessibilityController.focusedElement;
-          var textFieldIsWritable = textField.isAttributeSettable("AXValue");
-          shouldBe("textFieldIsWritable", "true");
-
-          document.getElementById("htmlReadOnlyTextArea").focus();
-          var htmlReadOnlyTextArea = accessibilityController.focusedElement;
-          var htmlReadOnlyTextAreaIsWritable = htmlReadOnlyTextArea.isAttributeSettable("AXValue");
-          shouldBe("htmlReadOnlyTextAreaIsWritable", "false");
-
-          document.getElementById("textArea").focus();
-          var textArea = accessibilityController.focusedElement;
-          var textAreaIsWritable = textArea.isAttributeSettable("AXValue");
-          shouldBe("textAreaIsWritable", "true");
     }
 
 </script>

Modified: trunk/Source/WebCore/ChangeLog (152521 => 152522)


--- trunk/Source/WebCore/ChangeLog	2013-07-09 23:18:55 UTC (rev 152521)
+++ trunk/Source/WebCore/ChangeLog	2013-07-10 00:39:45 UTC (rev 152522)
@@ -1,3 +1,15 @@
+2013-07-09  James Craig  <[email protected]>
+
+        @readonly and @aria-readonly="false" are not exposed correctly to accessibility
+        https://bugs.webkit.org/show_bug.cgi?id=118475
+
+        Reviewed by Chris Fleizach.
+
+        Account for implicit and explicit @readonly/@aria-readonly mismatches. Updated existing test coverage.
+
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::canSetValueAttribute):
+
 2013-07-09  Jer Noble  <[email protected]>
 
         Reviewed by Simon Fraser.

Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (152521 => 152522)


--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2013-07-09 23:18:55 UTC (rev 152521)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2013-07-10 00:39:45 UTC (rev 152522)
@@ -2705,8 +2705,17 @@
 
 bool AccessibilityRenderObject::canSetValueAttribute() const
 {
+
+    // In the event of a (Boolean)@readonly and (True/False/Undefined)@aria-readonly
+    // value mismatch, the host language native attribute value wins.    
+    if (isNativeTextControl())
+        return !isReadOnly();
+
     if (equalIgnoringCase(getAttribute(aria_readonlyAttr), "true"))
         return false;
+    
+    if (equalIgnoringCase(getAttribute(aria_readonlyAttr), "false"))
+        return true;
 
     if (isProgressIndicator() || isSlider())
         return true;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to