@qualweb/util
Version:
Utilities module for qualweb
276 lines (275 loc) • 10.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const constants_1 = require("./constants");
const getAccessibleNameSVGRecursion_1 = __importDefault(require("./getAccessibleNameSVGRecursion"));
function getAccessibleNameRecursion(element, recursion, isWidget) {
let AName, alt, value, placeholder;
const name = element.getElementTagName();
const allowNameFromContent = window.AccessibilityUtils.allowsNameFromContent(element);
let ariaLabelBy = element.getElementAttribute('aria-labelledby');
const id = element.getElementAttribute('id');
if (ariaLabelBy !== null && !verifyAriaLabel(ariaLabelBy, id)) {
ariaLabelBy = '';
}
const ariaLabel = element.getElementAttribute('aria-label');
const attrType = element.getElementAttribute('type');
const title = element.getElementAttribute('title');
const role = window.AccessibilityUtils.getElementRoleAName(element, '');
const referencedByAriaLabel = window.AccessibilityUtils.isElementReferencedByAriaLabel(element);
if (name === 'svg') {
AName = (0, getAccessibleNameSVGRecursion_1.default)(element, recursion);
}
else if (ariaLabelBy && ariaLabelBy !== '' && !(referencedByAriaLabel && recursion)) {
try {
AName = getAccessibleNameFromAriaLabelledBy(element, ariaLabelBy);
}
catch (e) {
AName = '';
}
}
else if (ariaLabel && ariaLabel.trim() !== '') {
AName = ariaLabel;
}
else if (isWidget && window.AccessibilityUtils.isElementControl(element)) {
AName = getFirstNotUndefined(window.AccessibilityUtils.getValueFromEmbeddedControl(element), title);
}
else if (name === 'area' || (name === 'input' && attrType === 'image')) {
alt = element.getElementAttribute('alt');
AName = getFirstNotUndefined(alt, title);
}
else if (name === 'img') {
alt = element.getElementAttribute('alt');
AName = getFirstNotUndefined(alt, title);
}
else if (name === 'input' && (attrType === 'button' || attrType === 'submit' || attrType === 'reset')) {
value = element.getElementAttribute('value');
AName = getFirstNotUndefined(value, window.AccessibilityUtils.getDefaultName(element), title);
}
else if (name === 'input' && (!attrType || constants_1.typesWithLabel.indexOf(attrType) >= 0)) {
placeholder = element.getElementAttribute('placeholder');
if (!recursion) {
AName = getFirstNotUndefined(getValueFromLabel(element, id), title, placeholder);
}
else {
AName = getFirstNotUndefined(title, placeholder);
}
}
else if (name && constants_1.formElements.indexOf(name) >= 0) {
if (!recursion) {
AName = getFirstNotUndefined(getValueFromLabel(element, id), title);
}
else {
AName = getFirstNotUndefined(title);
}
}
else if (name === 'textarea') {
placeholder = element.getElementAttribute('placeholder');
if (!recursion) {
AName = getFirstNotUndefined(getValueFromLabel(element, id), title, placeholder);
}
else {
AName = getFirstNotUndefined(getTextFromCss(element, isWidget), title, placeholder);
}
}
else if (name === 'figure') {
AName = getFirstNotUndefined(getValueFromSpecialLabel(element, 'figcaption'), title);
}
else if (name === 'table') {
AName = getFirstNotUndefined(getValueFromSpecialLabel(element, 'caption'), title);
}
else if (name === 'fieldset') {
AName = getFirstNotUndefined(getValueFromSpecialLabel(element, 'legend'), title);
}
else if (name === 'slot') {
AName = getAccessibleNameForSlot(element);
}
else if (name === 'noscript') {
AName = '';
}
else if (allowNameFromContent ||
(((role && allowNameFromContent) || !role || role === 'generic' || role === 'paragraph') && recursion) ||
name === 'label') {
AName = getFirstNotUndefined(getTextFromCss(element, isWidget), title);
}
else {
AName = getFirstNotUndefined(title);
}
return AName;
}
function getFirstNotUndefined(...args) {
let result;
let i = 0;
let arg;
let end = false;
while (i < args.length && !end) {
arg = args[i];
if (arg !== undefined && arg !== null) {
result = arg;
if (String(arg).trim() !== '') {
end = true;
}
}
i++;
}
return result;
}
function getValueFromSpecialLabel(element, label) {
const labelElement = element.getElement(label);
let accessNameFromLabel;
if (labelElement)
accessNameFromLabel = window.AccessibilityUtils.getAccessibleNameRecursion(labelElement, true, false);
return accessNameFromLabel;
}
function getValueFromLabel(element, id) {
const referencedByLabelList = new Array();
const referencedByLabel = window.qwPage.getElements(`label[for="${id}"]`, element);
if (referencedByLabel) {
referencedByLabelList.push(...referencedByLabel);
}
let parent = element.getElementParent();
let result, accessNameFromLabel;
const isWidget = window.AccessibilityUtils.isElementWidget(element);
while (parent && parent.getElementTagName() !== 'label') {
parent = parent.getElementParent();
}
if (parent && parent.getElementTagName() === 'label' && !isElementPresent(parent, referencedByLabelList)) {
referencedByLabelList.push(parent);
}
for (const label of referencedByLabelList !== null && referencedByLabelList !== void 0 ? referencedByLabelList : []) {
accessNameFromLabel = window.AccessibilityUtils.getAccessibleNameRecursion(label, true, isWidget);
if (accessNameFromLabel) {
if (result) {
result += accessNameFromLabel;
}
else {
result = accessNameFromLabel;
}
}
}
return result;
}
function isElementPresent(element, listElement) {
let result = false;
let i = 0;
const elementSelector = element.getElementSelector();
while (i < listElement.length && !result) {
result = elementSelector === listElement[i].getElementSelector();
i++;
}
return result;
}
function getAccessibleNameFromAriaLabelledBy(element, ariaLabelId) {
const ListIdRefs = ariaLabelId.split(' ');
let result;
let accessNameFromId;
const isWidget = window.AccessibilityUtils.isElementWidget(element);
const elementID = element.getElementAttribute('id');
let elem;
for (const id of ListIdRefs) {
if (id !== '')
elem = window.qwPage.getElementByID(id);
if (elem)
accessNameFromId = window.AccessibilityUtils.getAccessibleNameRecursion(elem, true, isWidget && elementID !== id);
if (accessNameFromId) {
if (result) {
result += accessNameFromId.trim() + ' ';
}
else {
result = accessNameFromId.trim() + ' ';
}
elem = null;
accessNameFromId = undefined;
}
}
return result ? result.trim() : result;
}
function getTextFromCss(element, isWidget) {
const before = cleanSVGAndNoneCode(element.getElementStyleProperty('content', ':before'));
const after = cleanSVGAndNoneCode(element.getElementStyleProperty('content', ':after'));
const aNameList = getAccessibleNameFromChildren(element, isWidget);
const textValue = getConcatenatedText(element, aNameList);
return before.replace(/["']/g, '') + textValue + after.replace(/["']/g, '');
}
function getConcatenatedText(element, aNames) {
return element.concatANames(aNames);
}
function cleanSVGAndNoneCode(text) {
if (!text || text === 'none' || text.includes('url(')) {
text = '';
}
return text;
}
function getAccessibleNameFromChildren(element, isWidget) {
if (!isWidget) {
isWidget = window.AccessibilityUtils.isElementWidget(element);
}
let aName;
const children = element.getElementChildren();
const elementAnames = new Array();
if (children) {
for (const child of children) {
const role = window.AccessibilityUtils.getElementRoleAName(child, '');
if (!window.DomUtils.isElementHidden(child) && role !== 'presentation' && role !== 'none') {
aName = window.AccessibilityUtils.getAccessibleNameRecursion(child, true, isWidget);
if (aName) {
elementAnames.push(aName);
}
else {
elementAnames.push('');
}
}
else {
elementAnames.push('');
}
}
}
return elementAnames;
}
function getAccessibleNameFromShadowChildren(element) {
const children = element.getShadowElements('*');
let finalAName = '';
children === null || children === void 0 ? void 0 : children.forEach((element) => {
const aName = window.AccessibilityUtils.getAccessibleName(element);
if (aName)
finalAName += aName;
});
return finalAName;
}
function getAccessibleNameForSlot(slot) {
let elements = slot.getSlotElements();
let finalAName = '';
elements === null || elements === void 0 ? void 0 : elements.forEach((element) => {
let aName = window.AccessibilityUtils.getAccessibleName(element);
if (aName) {
finalAName += aName;
}
else if (element.isShadowRoot()) {
aName = getAccessibleNameFromShadowChildren(element);
if (aName) {
finalAName += aName;
}
}
});
let nodes = slot.getSlotNodes();
nodes === null || nodes === void 0 ? void 0 : nodes.forEach((node) => {
let aName = node.textContent;
if (aName) {
finalAName += aName;
}
});
return finalAName;
}
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 = getAccessibleNameRecursion;