aria-api

access ARIA information from JavaScript
git clone https://git.ce9e.org/aria-api.git

commit
4dec67073ca62c798145c3c552d73436ec68d937
parent
2026d28a7242ee4a33a29b3d0a0379492973c27a
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-06-07 13:05
support token list in role attribute

Diffstat

M lib/attrs.js 28 ++++++++++++++++------------
M test/test-role.js 12 ++++++++++++

2 files changed, 28 insertions, 12 deletions


diff --git a/lib/attrs.js b/lib/attrs.js

@@ -3,22 +3,26 @@ var constants = require('./constants.js');
    3     3 // candidates can be passed for performance optimization
    4     4 var getRole = function(el, candidates) {
    5     5 	if (el.hasAttribute('role')) {
    6    -1 		var role = el.getAttribute('role');
    7    -1 		if (!candidates || candidates.includes(role)) {
    8    -1 			return role;
    9    -1 		} else {
   10    -1 			return;
   -1     6 		var roles = el.getAttribute('role').split(/\s+/);
   -1     7 		if (roles.length > 1 && candidates) {
   -1     8 			return [roles, candidates];
   11     9 		}
   12    -1 	}
   13    -1 	var roles = candidates ? candidates : Object.keys(constants.roles);
   14    -1 	for (var role of roles) {
   15    -1 		var r = constants.roles[role];
   16    -1 		if (r) {
   17    -1 			var selector = (r.selectors || []).join(',');
   18    -1 			if (selector && el.matches(selector)) {
   -1    10 		for (var role of roles) {
   -1    11 			if (!candidates || candidates.includes(role)) {
   19    12 				return role;
   20    13 			}
   21    14 		}
   -1    15 	} else {
   -1    16 		var roles = candidates ? candidates : Object.keys(constants.roles);
   -1    17 		for (var role of roles) {
   -1    18 			var r = constants.roles[role];
   -1    19 			if (r) {
   -1    20 				var selector = (r.selectors || []).join(',');
   -1    21 				if (selector && el.matches(selector)) {
   -1    22 					return role;
   -1    23 				}
   -1    24 			}
   -1    25 		}
   22    26 	}
   23    27 };
   24    28 

diff --git a/test/test-role.js b/test/test-role.js

@@ -62,6 +62,12 @@ describe('query', () => {
   62    62 				'contentinfo',
   63    63 			]);
   64    64 		});
   -1    65 
   -1    66 		it('returns the first if there is more than one explicit role', () => {
   -1    67 			testbed.innerHTML = '<span role="generic link">';
   -1    68 			var actual = aria.getRole(testbed.children[0]);
   -1    69 			expect(actual).toEqual('generic');
   -1    70 		});
   65    71 	});
   66    72 
   67    73 	describe('closest', () => {
@@ -104,5 +110,11 @@ describe('query', () => {
  104   110 			var actual = aria.querySelectorAll(testbed, 'none');
  105   111 			expect(actual.length).toEqual(2);
  106   112 		});
   -1   113 
   -1   114 		it('matches all explicitly given roles', () => {
   -1   115 			testbed.innerHTML = '<span role="generic link">';
   -1   116 			var actual = aria.querySelectorAll(testbed, 'link');
   -1   117 			expect(actual.length).toEqual(1);
   -1   118 		}
  107   119 	});
  108   120 });