@qualweb/util
Version:
Utilities module for qualweb
188 lines (187 loc) • 7.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const implicitRoles_1 = require("./implicitRoles");
function getImplicitRole(element, accessibleName) {
const name = element.getElementTagName();
let attributes;
let role = null;
if (name) {
const roleValues = implicitRoles_1.implicitRoles[name.toLocaleLowerCase()];
if (roleValues !== undefined) {
for (const roleValue of roleValues) {
const special = roleValue['special'];
attributes = roleValue['attributes'];
if (attributes.length === 0 || isInList(attributes, element)) {
if (!special) {
role = roleValue['role'];
}
else {
const heading = new RegExp('h[1-6]');
if (name === 'footer' || name === 'header') {
role = getRoleHeaderFooter(element, roleValue);
}
else if (name === 'form' || name === 'section') {
if (accessibleName !== undefined) {
role = roleValue['role'];
}
}
else if (heading.test(name)) {
role = getRoleHeading(element, roleValue);
}
else if (name === 'img') {
role = getRoleImg(element, roleValue);
}
else if (name === 'a') {
role = getRoleA(element, roleValue);
}
else if (name === 'input') {
role = getRoleInput(element, roleValue);
}
else if (name === 'li') {
role = getRoleLi(element, roleValue);
}
else if (name === 'option') {
role = getRoleOption(element, roleValue);
}
else if (name === 'select') {
role = getRoleSelect(element, roleValue);
}
else if (name === 'td') {
if (window.DomUtils.isElementADescendantOfExplicitRole(element, ['table'], [])) {
role = roleValue['role'];
}
else if (window.DomUtils.isElementADescendantOfExplicitRole(element, ['grid', 'treegrid'], [])) {
role = 'gridcell';
}
}
else if (name === 'th') {
if (window.DomUtils.isElementADescendantOfExplicitRole(element, ['table', 'grid', 'treegrid'], [])) {
role = roleValue['role'];
}
}
else if (name === 'area') {
if (attributes.length === 0) {
role = 'generic';
}
else if (isInList(attributes, element)) {
role = roleValue['role'];
}
}
}
}
}
}
}
return role;
}
function getRoleHeading(element, roleValue) {
const ariaLevel = element.getElementAttribute('aria-level');
if (ariaLevel === null || parseInt(ariaLevel) > 0) {
return roleValue.role;
}
return null;
}
function getRoleSelect(element, roleValue) {
const size = element.getElementAttribute('size');
const multiple = element.getElementAttribute('multiple');
let role;
if (multiple !== null && size !== null && parseInt(size, 10) > 1) {
role = 'listbox';
}
else {
role = roleValue.role;
}
return role;
}
function getRoleHeaderFooter(element, roleValue) {
let role;
if (!window.DomUtils.isElementADescendantOfExplicitRole(element, ['article', 'aside', 'main', 'nav', 'section'], ['article', 'complementary', 'main', 'navigation', 'region'])) {
role = roleValue['role'];
}
else {
role = 'generic';
}
return role;
}
function getRoleInput(element, roleValue) {
const list = element.getElementAttribute('list');
const type = element.getElementAttribute('type');
let role;
if (list !== null) {
role = roleValue['role'];
}
else if (type === 'search') {
role = 'searchbox';
}
else {
role = 'textbox';
}
return role;
}
function getRoleOption(element, roleValue) {
const parent = element.getElementParent();
let parentName;
if (parent !== null)
parentName = parent.getElementTagName();
if (parentName === 'datalist') {
return roleValue.role;
}
return null;
}
function getRoleImg(element, roleValue) {
const alt = element.getElementAttribute('alt');
const ariaLabelledBy = element.getElementAttribute('aria-labelledby');
const id = element.getElementAttribute('id');
let role = '';
if (alt !== '' || (ariaLabelledBy !== null && verifyAriaLabel(ariaLabelledBy, id))) {
role = roleValue.role;
}
else if (element.elementHasAttribute('alt') &&
!(window.AccessibilityUtils.isElementFocusable(element) ||
window.AccessibilityUtils.elementHasGlobalARIAPropertyOrAttribute(element))) {
role = 'presentation';
}
return role;
}
function getRoleA(element, roleValue) {
let role;
if (element.elementHasAttribute('href')) {
role = roleValue['role'];
}
else {
role = 'generic';
}
return role;
}
function getRoleLi(element, roleValue) {
const parent = element.getElementParent();
const parentNames = ['ol', 'ul', 'menu'];
const parentName = parent === null || parent === void 0 ? void 0 : parent.getElementTagName();
if (parentName && parentNames.includes(parentName)) {
return roleValue.role;
}
return null;
}
function isInList(attributes, element) {
let result;
for (let i = 0; i < attributes.length; i++) {
const attribute = attributes[i];
const key = attribute[0];
const value = attribute[1];
const roleSpecificATT = element.getElementAttribute(key);
if (roleSpecificATT === value || (value === '' && roleSpecificATT !== null))
result = true;
}
return result;
}
function verifyAriaLabel(ariaLabelBy, elementID) {
const elementIds = ariaLabelBy.split(' ');
let result = false;
for (const id of elementIds) {
if (!result && id !== '' && elementID !== id) {
result = window.qwPage.getElementByID(id) !== null;
}
}
return result;
}
exports.default = getImplicitRole;