@qualweb/act-rules
Version:
ACT rules module for qualweb web accessibility evaluator
156 lines (155 loc) • 8.3 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.QW_ACT_R39 = void 0;
const applicability_1 = require("@qualweb/util/applicability");
const evaluation_1 = require("@qualweb/core/evaluation");
const AtomicRule_object_1 = require("../lib/AtomicRule.object");
class QW_ACT_R39 extends AtomicRule_object_1.AtomicRule {
constructor() {
super(...arguments);
this.cellRoles = ['cell', 'gridcell', 'rowheader', 'columnheader'];
}
execute(element) {
const ancestorTableOrGrid = getFirstAncestorElementByNameOrRoles(element, [], ['grid', 'table']);
if (ancestorTableOrGrid !== null) {
const isAncestorTableOrGridInAT = window.AccessibilityUtils.isElementInAT(ancestorTableOrGrid);
if (isAncestorTableOrGridInAT) {
const rowElements = ancestorTableOrGrid.getElements('tr, [role="row"]');
const elementParent = element.getElementParent();
const colspan = element.getElementAttribute('colspan');
const headerElementIndex = getElementIndexOfParentChildren(element);
const headerElementId = element.getElementAttribute('id');
let found = false;
let index = 0;
while (!found && index < rowElements.length) {
if (elementParent && rowElements[index].getElementSelector() !== elementParent.getElementSelector()) {
const rowChildrenElements = rowElements[index].getElementChildren();
if (rowChildrenElements.length > headerElementIndex) {
const cellIndexElements = [rowChildrenElements[headerElementIndex]];
if (colspan) {
let i = headerElementIndex + 1;
for (i; i < headerElementIndex + parseInt(colspan) && i < rowChildrenElements.length; i++) {
cellIndexElements.push(rowChildrenElements[i]);
}
}
for (const cellIndexElement of cellIndexElements !== null && cellIndexElements !== void 0 ? cellIndexElements : []) {
const cellIndexElementRole = cellIndexElement
? window.AccessibilityUtils.getElementRole(cellIndexElement)
: null;
const cellHeadersAttribute = cellIndexElement ? cellIndexElement.getElementAttribute('headers') : null;
found =
!!cellIndexElementRole &&
this.cellRoles.includes(cellIndexElementRole) &&
(cellHeadersAttribute
? headerElementId
? cellHeadersAttribute.includes(headerElementId)
: false
: true);
}
}
else {
for (const cellElement of rowChildrenElements) {
if (!found) {
const cellElementRole = window.AccessibilityUtils.getElementRole(cellElement);
const cellColspanAttribute = cellElement.getElementAttribute('colspan');
const cellElementIndex = getElementIndexOfParentChildren(cellElement);
const headers = cellElement.getElementAttribute('headers');
found =
!!cellElementRole &&
this.cellRoles.includes(cellElementRole) &&
((!!headerElementId && !!headers && headers.includes(headerElementId)) ||
(cellColspanAttribute
? cellElementIndex + +cellColspanAttribute - 1 <= headerElementIndex
: false));
}
}
}
}
else {
const elements = rowElements[index].getElements("td,[role='cell'],[role='gridcell']");
for (const cellElement of elements) {
if (!found) {
const cellElementRole = window.AccessibilityUtils.getElementRole(cellElement);
const headers = cellElement.getElementAttribute('headers');
found =
!!cellElementRole &&
this.cellRoles.includes(cellElementRole) &&
(!headers || (!!headerElementId && !!headers && headers.includes(headerElementId)));
}
}
}
index++;
}
const test = new evaluation_1.Test();
if (found) {
test.verdict = evaluation_1.Verdict.PASSED;
test.resultCode = 'P1';
}
else {
test.verdict = evaluation_1.Verdict.FAILED;
test.resultCode = 'F1';
}
test.addElement(element);
this.addTestResult(test);
}
}
}
}
exports.QW_ACT_R39 = QW_ACT_R39;
__decorate([
applicability_1.ElementExists,
applicability_1.ElementIsInAccessibilityTree,
applicability_1.ElementIsVisible,
(0, applicability_1.ElementHasOneOfTheFollowingRoles)(['columnheader', 'rowheader']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Function]),
__metadata("design:returntype", void 0)
], QW_ACT_R39.prototype, "execute", null);
function getFirstAncestorElementByNameOrRoles(element, names, roles) {
const parent = element.getElementParent();
let sameRole = false;
let sameName = false;
if (parent !== null) {
const parentName = parent.getElementTagName();
const parentRole = window.AccessibilityUtils.getElementRole(parent);
if (parentName !== null) {
sameName = names.includes(parentName);
}
if (parentRole !== null) {
sameRole = roles.includes(parentRole);
}
if (sameName || sameRole) {
return parent;
}
else {
return getFirstAncestorElementByNameOrRoles(parent, names, roles);
}
}
else {
return null;
}
}
function getElementIndexOfParentChildren(element) {
let elementIndex = 0;
let foundIndex = false;
const elementParent = element.getElementParent();
const elementParentChildren = elementParent ? elementParent.getElementChildren() : null;
while (elementParentChildren && !foundIndex && elementIndex < elementParentChildren.length) {
if (elementParentChildren[elementIndex].getElementSelector() !== element.getElementSelector()) {
elementIndex++;
}
else {
foundIndex = true;
}
}
return elementIndex++;
}