IITAA Rule 98: Check that elements without 'aria-activedescendant' that have roles requiring a container have key event handlers

Rule Mapping

Details

  • Check that elements without ‘aria-activedescendant’ that have roles requiring a container have key event handlers.

Markup References

Validation Code

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', '', []);
   }