OAA WIDGET_15: Check that elements without 'aria-activedescendant' that have roles requiring a container have key event handlers
Details
- Check that elements without ‘aria-activedescendant’ that have roles requiring a container have key event handlers.
Rulesets
- WCAG 2.0 Requirement 2.1.1 Keyboard
- Status: Accepted
- Severity: Violation
- Priority: Priority 1
- IITAA 1.0 13.2 Ensure that significant interactions can be performed with both keyboard and mouse.
- Type:
- Severity: Violation
- Priority: Priority 1
- Status: Accepted
Markup References
- ARIA 1.0: [aria-activedescendant]
- ARIA 1.0: [role="columnheader"]
- ARIA 1.0: [role="gridcell"]
- ARIA 1.0: [role="listitem"]
- ARIA 1.0: [role="menuitem"]
- ARIA 1.0: [role="menuitemcheckbox"]
- ARIA 1.0: [role="menuitemradio"]
- ARIA 1.0: [role="option"]
- ARIA 1.0: [role="row"]
- ARIA 1.0: [role="rowgroup"]
- ARIA 1.0: [role="rowheader"]
- ARIA 1.0: [role="treeitem"]
Validation Code
Message
Widgets that are not disabled and does not have the 'aria-activedescendant' attribute, must have at least an keyboard event on the element or a child role element.
Dependencies
None
Context
*[@aria-activedescendant]
Parameters
None
Code
function (ruleContext) {
var passed = true;
var role = OpenAjax.a11y.xbrowser.hasAttribute(ruleContext, 'role') ? ruleContext.getAttribute("role") : '';
if (xbrowser.indexOf(OpenAjax.a11y.aria.containers, role) >= 0) {
var disabled = OpenAjax.a11y.xbrowser.hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : '';
if (disabled != 'true' && !OpenAjax.a11y.xbrowser.hasAttribute(ruleContext, 'aria-activedescendant')) {
var events = util.getEvents(ruleContext);
passed = (OpenAjax.a11y.xbrowser.indexOf(events, "keydown") >= 0 ||
OpenAjax.a11y.xbrowser.indexOf(events, "keypress") >= 0);
if (!passed) {
var xp="child::*[@role=";
var reqChildren = OpenAjax.a11y.aria.designPatterns[role].reqChildren;
if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */
for (var i=0; i< reqChildren.length; i++) xp += "'" + reqChildren[i] + "' |";
xp = xp.substring(0,xp.length-1) + ']';
var xpathResult = OpenAjax.a11y.xpath.evaluate(xp, ruleContext, util.defaultNSResolver, OpenAjax.a11y.xpath.XPathResult.ANY_TYPE, null);
var r = xpathResult.iterateNext();
while (r && !passed) {
var events = util.getEvents(r);
passed = (OpenAjax.a11y.xbrowser.indexOf(events, "keydown") >= 0 ||
OpenAjax.a11y.xbrowser.indexOf(events, "keypress") >= 0);
r = xpathResult.iterateNext();
}
}
}
}
}
return new ValidationResult(passed, [ruleContext], 'role', '', []);
}
>