Библиотека Aria-query предоставляет структурированные данные о стандартных ARIA-ролях, свойствах и состояниях для использования в приложениях на JavaScript. Она служит основой для проверки доступности, автоматизированного тестирования и построения инструментов, таких как DevTools расширения. В отличие от ручного перечисления ролей и атрибутов, Aria-query предлагает готовую модель объектов, которая отражает спецификацию WAI-ARIA 1.2.
Главный модуль библиотеки экспортирует три ключевых объекта:
Каждый объект представлен в виде Map, что обеспечивает
быстрый доступ и удобную фильтрацию.
import { roles } from 'aria-query';
for (const [roleName, roleDefinition] of roles) {
console.log(roleName, roleDefinition);
}
Ключевые моменты:
roleDefinition включает:
abstract – логическое значение, показывающее, является
ли роль абстрактной;baseConcepts – список HTML-элементов, с которыми роль
ассоциирована по умолчанию;props – свойства роли и их типы (boolean,
string, tokenlist и др.);requiredProps – обязательные свойства для корректного
использования роли.const buttonRole = roles.get('button');
console.log(buttonRole.props.has('aria-pressed')); // true или false
Это позволяет расширениям DevTools проверять, корректно ли применены ARIA-атрибуты к элементам на странице.
elementRoles позволяет определить, какие роли по умолчанию применяются к HTML-элементам:
import { elementRoles } from 'aria-query';
const rolesForDiv = elementRoles.get('div');
console.log([...rolesForDiv]); // Set { 'generic', 'region' }
Это важно при создании расширений для DevTools, когда нужно динамически анализировать DOM и выдавать рекомендации по улучшению доступности.
ariaAttributes предоставляет данные обо всех стандартизованных ARIA-атрибутах:
import { ariaAttributes } from 'aria-query';
for (const [attrName, attrDefinition] of ariaAttributes) {
console.log(attrName, attrDefinition.type);
}
type описывает допустимый формат (boolean,
tristate, integer, string,
idref, idreflist, token,
tokenlist).Aria-query поддерживает удобный поиск и фильтрацию по различным критериям:
// Найти все роли, поддерживающие aria-checked
const checkableRoles = [...roles].filter(([name, def]) =>
def.props.has('aria-checked')
).map(([name]) => name);
console.log(checkableRoles); // ['checkbox', 'menuitemcheckbox', ...]
Использование Aria-query в расширениях позволяет:
Пример проверки элемента в расширении:
import { roles, elementRoles, ariaAttributes } from 'aria-query';
function checkAria(element) {
const tagName = element.tagName.toLowerCase();
const defaultRoles = elementRoles.get(tagName) || new Set();
const ariaRole = element.getAttribute('role');
if (ariaRole && !roles.has(ariaRole)) {
console.warn(`Неверная роль: ${ariaRole}`);
}
for (const [attr, def] of ariaAttributes) {
if (element.hasAttribute(attr)) {
// проверка типа значения
const value = element.getAttribute(attr);
if (def.type === 'boolean' && !['true', 'false'].includes(value)) {
console.warn(`Неверное значение ${attr}: ${value}`);
}
}
}
}
Aria-query отлично сочетается с DevTools API:
chrome.devtools.inspectedWindow.eval.Использование Map объектов из Aria-query обеспечивает
высокую производительность при анализе больших
страниц.
Эта библиотека формирует основу для построения инструментов анализа ARIA, превращая сложную спецификацию в удобные для программной обработки структуры. Именно это делает Aria-query ключевым компонентом при разработке DevTools расширений для проверки и улучшения доступности веб-приложений.