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