@qualweb/act-rules 0.7.0-alpha2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -76
- package/dist/ACTRulesModule.d.ts +11 -0
- package/dist/ACTRulesModule.d.ts.map +1 -0
- package/dist/ACTRulesModule.js +65 -0
- package/dist/ACTRulesRunner.d.ts +14 -0
- package/dist/ACTRulesRunner.d.ts.map +1 -0
- package/dist/ACTRulesRunner.js +44 -0
- package/dist/__webpack/act.bundle.js +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/lib/ACTRulesTester.object.d.ts +15 -0
- package/dist/lib/ACTRulesTester.object.d.ts.map +1 -0
- package/dist/lib/ACTRulesTester.object.js +150 -0
- package/dist/lib/AtomicRule.object.d.ts +7 -0
- package/dist/lib/AtomicRule.object.d.ts.map +1 -0
- package/dist/lib/AtomicRule.object.js +7 -0
- package/dist/lib/CompositeRule.object.d.ts +13 -0
- package/dist/lib/CompositeRule.object.d.ts.map +1 -0
- package/dist/lib/CompositeRule.object.js +80 -0
- package/dist/lib/Rule.object.d.ts +19 -0
- package/dist/lib/Rule.object.d.ts.map +1 -0
- package/dist/lib/Rule.object.js +76 -0
- package/dist/lib/mapping.d.ts +36 -0
- package/dist/lib/mapping.d.ts.map +1 -0
- package/dist/lib/mapping.js +38 -0
- package/dist/lib/mappingComposite.d.ts +39 -0
- package/dist/lib/mappingComposite.d.ts.map +1 -0
- package/dist/lib/mappingComposite.js +23 -0
- package/dist/lib/rules.json +1523 -0
- package/dist/lib/types.d.ts +15 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/rules/QW-ACT-R1.d.ts +7 -0
- package/dist/rules/QW-ACT-R1.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R1.js +49 -0
- package/dist/rules/QW-ACT-R10.d.ts +8 -0
- package/dist/rules/QW-ACT-R10.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R10.js +98 -0
- package/dist/rules/QW-ACT-R11.d.ts +7 -0
- package/dist/rules/QW-ACT-R11.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R11.js +40 -0
- package/dist/rules/QW-ACT-R12.d.ts +7 -0
- package/dist/rules/QW-ACT-R12.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R12.js +40 -0
- package/dist/rules/QW-ACT-R13.d.ts +9 -0
- package/dist/rules/QW-ACT-R13.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R13.js +76 -0
- package/dist/rules/QW-ACT-R14.d.ts +7 -0
- package/dist/rules/QW-ACT-R14.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R14.js +73 -0
- package/dist/rules/QW-ACT-R15.d.ts +6 -0
- package/dist/rules/QW-ACT-R15.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R15.js +26 -0
- package/dist/rules/QW-ACT-R16.d.ts +7 -0
- package/dist/rules/QW-ACT-R16.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R16.js +52 -0
- package/dist/rules/QW-ACT-R17.d.ts +7 -0
- package/dist/rules/QW-ACT-R17.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R17.js +52 -0
- package/dist/rules/QW-ACT-R19.d.ts +7 -0
- package/dist/rules/QW-ACT-R19.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R19.js +42 -0
- package/dist/rules/QW-ACT-R2.d.ts +7 -0
- package/dist/rules/QW-ACT-R2.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R2.js +40 -0
- package/dist/rules/QW-ACT-R20.d.ts +7 -0
- package/dist/rules/QW-ACT-R20.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R20.js +39 -0
- package/dist/rules/QW-ACT-R21.d.ts +8 -0
- package/dist/rules/QW-ACT-R21.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R21.js +50 -0
- package/dist/rules/QW-ACT-R22.d.ts +9 -0
- package/dist/rules/QW-ACT-R22.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R22.js +69 -0
- package/dist/rules/QW-ACT-R23.d.ts +6 -0
- package/dist/rules/QW-ACT-R23.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R23.js +26 -0
- package/dist/rules/QW-ACT-R24.d.ts +12 -0
- package/dist/rules/QW-ACT-R24.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R24.js +298 -0
- package/dist/rules/QW-ACT-R25.d.ts +7 -0
- package/dist/rules/QW-ACT-R25.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R25.js +67 -0
- package/dist/rules/QW-ACT-R26.d.ts +6 -0
- package/dist/rules/QW-ACT-R26.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R26.js +26 -0
- package/dist/rules/QW-ACT-R27.d.ts +7 -0
- package/dist/rules/QW-ACT-R27.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R27.js +55 -0
- package/dist/rules/QW-ACT-R28.d.ts +7 -0
- package/dist/rules/QW-ACT-R28.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R28.js +83 -0
- package/dist/rules/QW-ACT-R29.d.ts +6 -0
- package/dist/rules/QW-ACT-R29.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R29.js +26 -0
- package/dist/rules/QW-ACT-R30.d.ts +9 -0
- package/dist/rules/QW-ACT-R30.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R30.js +69 -0
- package/dist/rules/QW-ACT-R31.d.ts +6 -0
- package/dist/rules/QW-ACT-R31.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R31.js +26 -0
- package/dist/rules/QW-ACT-R32.d.ts +6 -0
- package/dist/rules/QW-ACT-R32.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R32.js +26 -0
- package/dist/rules/QW-ACT-R33.d.ts +8 -0
- package/dist/rules/QW-ACT-R33.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R33.js +89 -0
- package/dist/rules/QW-ACT-R34.d.ts +7 -0
- package/dist/rules/QW-ACT-R34.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R34.js +112 -0
- package/dist/rules/QW-ACT-R35.d.ts +7 -0
- package/dist/rules/QW-ACT-R35.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R35.js +40 -0
- package/dist/rules/QW-ACT-R36.d.ts +7 -0
- package/dist/rules/QW-ACT-R36.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R36.js +108 -0
- package/dist/rules/QW-ACT-R37.d.ts +23 -0
- package/dist/rules/QW-ACT-R37.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R37.js +358 -0
- package/dist/rules/QW-ACT-R38.d.ts +9 -0
- package/dist/rules/QW-ACT-R38.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R38.js +100 -0
- package/dist/rules/QW-ACT-R39.d.ts +8 -0
- package/dist/rules/QW-ACT-R39.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R39.js +155 -0
- package/dist/rules/QW-ACT-R4.d.ts +8 -0
- package/dist/rules/QW-ACT-R4.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R4.js +85 -0
- package/dist/rules/QW-ACT-R40.d.ts +7 -0
- package/dist/rules/QW-ACT-R40.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R40.js +58 -0
- package/dist/rules/QW-ACT-R41.d.ts +7 -0
- package/dist/rules/QW-ACT-R41.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R41.js +42 -0
- package/dist/rules/QW-ACT-R42.d.ts +7 -0
- package/dist/rules/QW-ACT-R42.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R42.js +40 -0
- package/dist/rules/QW-ACT-R43.d.ts +8 -0
- package/dist/rules/QW-ACT-R43.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R43.js +98 -0
- package/dist/rules/QW-ACT-R44.d.ts +8 -0
- package/dist/rules/QW-ACT-R44.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R44.js +92 -0
- package/dist/rules/QW-ACT-R48.d.ts +7 -0
- package/dist/rules/QW-ACT-R48.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R48.js +38 -0
- package/dist/rules/QW-ACT-R49.d.ts +8 -0
- package/dist/rules/QW-ACT-R49.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R49.js +81 -0
- package/dist/rules/QW-ACT-R5.d.ts +8 -0
- package/dist/rules/QW-ACT-R5.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R5.js +44 -0
- package/dist/rules/QW-ACT-R50.d.ts +8 -0
- package/dist/rules/QW-ACT-R50.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R50.js +72 -0
- package/dist/rules/QW-ACT-R51.d.ts +7 -0
- package/dist/rules/QW-ACT-R51.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R51.js +41 -0
- package/dist/rules/QW-ACT-R53.d.ts +7 -0
- package/dist/rules/QW-ACT-R53.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R53.js +41 -0
- package/dist/rules/QW-ACT-R54.d.ts +7 -0
- package/dist/rules/QW-ACT-R54.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R54.js +41 -0
- package/dist/rules/QW-ACT-R55.d.ts +7 -0
- package/dist/rules/QW-ACT-R55.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R55.js +41 -0
- package/dist/rules/QW-ACT-R56.d.ts +7 -0
- package/dist/rules/QW-ACT-R56.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R56.js +41 -0
- package/dist/rules/QW-ACT-R58.d.ts +7 -0
- package/dist/rules/QW-ACT-R58.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R58.js +33 -0
- package/dist/rules/QW-ACT-R59.d.ts +7 -0
- package/dist/rules/QW-ACT-R59.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R59.js +33 -0
- package/dist/rules/QW-ACT-R6.d.ts +7 -0
- package/dist/rules/QW-ACT-R6.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R6.js +40 -0
- package/dist/rules/QW-ACT-R60.d.ts +7 -0
- package/dist/rules/QW-ACT-R60.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R60.js +41 -0
- package/dist/rules/QW-ACT-R61.d.ts +7 -0
- package/dist/rules/QW-ACT-R61.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R61.js +41 -0
- package/dist/rules/QW-ACT-R62.d.ts +7 -0
- package/dist/rules/QW-ACT-R62.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R62.js +37 -0
- package/dist/rules/QW-ACT-R63.d.ts +8 -0
- package/dist/rules/QW-ACT-R63.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R63.js +60 -0
- package/dist/rules/QW-ACT-R64.d.ts +8 -0
- package/dist/rules/QW-ACT-R64.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R64.js +60 -0
- package/dist/rules/QW-ACT-R65.d.ts +7 -0
- package/dist/rules/QW-ACT-R65.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R65.js +58 -0
- package/dist/rules/QW-ACT-R66.d.ts +7 -0
- package/dist/rules/QW-ACT-R66.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R66.js +40 -0
- package/dist/rules/QW-ACT-R67.d.ts +12 -0
- package/dist/rules/QW-ACT-R67.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R67.js +94 -0
- package/dist/rules/QW-ACT-R68.d.ts +14 -0
- package/dist/rules/QW-ACT-R68.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R68.js +117 -0
- package/dist/rules/QW-ACT-R69.d.ts +12 -0
- package/dist/rules/QW-ACT-R69.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R69.js +94 -0
- package/dist/rules/QW-ACT-R7.d.ts +14 -0
- package/dist/rules/QW-ACT-R7.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R7.js +167 -0
- package/dist/rules/QW-ACT-R70.d.ts +7 -0
- package/dist/rules/QW-ACT-R70.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R70.js +52 -0
- package/dist/rules/QW-ACT-R71.d.ts +8 -0
- package/dist/rules/QW-ACT-R71.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R71.js +81 -0
- package/dist/rules/QW-ACT-R73.d.ts +8 -0
- package/dist/rules/QW-ACT-R73.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R73.js +60 -0
- package/dist/rules/QW-ACT-R74.d.ts +8 -0
- package/dist/rules/QW-ACT-R74.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R74.js +80 -0
- package/dist/rules/QW-ACT-R75.d.ts +6 -0
- package/dist/rules/QW-ACT-R75.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R75.js +27 -0
- package/dist/rules/QW-ACT-R76.d.ts +23 -0
- package/dist/rules/QW-ACT-R76.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R76.js +336 -0
- package/dist/rules/QW-ACT-R77.d.ts +7 -0
- package/dist/rules/QW-ACT-R77.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R77.js +53 -0
- package/dist/rules/QW-ACT-R9.d.ts +7 -0
- package/dist/rules/QW-ACT-R9.d.ts.map +1 -0
- package/dist/rules/QW-ACT-R9.js +87 -0
- package/dist/rules/index.d.ts +69 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +84 -0
- package/package.json +39 -32
- package/LICENSE +0 -15
- package/dist/act.bundle.js +0 -1
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.QW_ACT_R37 = void 0;
|
|
13
|
+
const applicability_1 = require("@qualweb/util/applicability");
|
|
14
|
+
const evaluation_1 = require("@qualweb/core/evaluation");
|
|
15
|
+
const AtomicRule_object_1 = require("../lib/AtomicRule.object");
|
|
16
|
+
class QW_ACT_R37 extends AtomicRule_object_1.AtomicRule {
|
|
17
|
+
execute(element) {
|
|
18
|
+
const visible = window.DomUtils.isElementVisible(element);
|
|
19
|
+
if (!visible) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const hasTextNode = element.hasTextNode();
|
|
23
|
+
const elementText = element.getElementOwnText();
|
|
24
|
+
if (!hasTextNode && elementText.trim() === '') {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const isHTML = element.isElementHTMLElement();
|
|
28
|
+
if (!isHTML) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const disabledWidgets = window.disabledWidgets;
|
|
32
|
+
const elementSelectors = element.getElementSelector();
|
|
33
|
+
for (const disableWidget of disabledWidgets || []) {
|
|
34
|
+
const selectors = window.AccessibilityUtils.getAccessibleNameSelector(disableWidget);
|
|
35
|
+
if (disableWidget && selectors && selectors.includes(elementSelectors)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (disableWidget.getElementSelector() === elementSelectors) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const role = window.AccessibilityUtils.getElementRole(element);
|
|
43
|
+
if (role === 'group') {
|
|
44
|
+
const disable = element.getElementAttribute('disabled') !== null;
|
|
45
|
+
const ariaDisable = element.getElementAttribute('aria-disabled') !== null;
|
|
46
|
+
if (disable || ariaDisable) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const test = new evaluation_1.Test();
|
|
51
|
+
const fgColor = element.getElementStyleProperty('color', null);
|
|
52
|
+
let bgColor = this.getBackground(element);
|
|
53
|
+
const opacity = parseFloat(element.getElementStyleProperty('opacity', null));
|
|
54
|
+
const fontSize = element.getElementStyleProperty('font-size', null);
|
|
55
|
+
const fontWeight = element.getElementStyleProperty('font-weight', null);
|
|
56
|
+
const fontFamily = element.getElementStyleProperty('font-family', null);
|
|
57
|
+
const fontStyle = element.getElementStyleProperty('font-style', null);
|
|
58
|
+
const textShadow = element.getElementStyleProperty('text-shadow', null);
|
|
59
|
+
if (textShadow.trim() !== 'none') {
|
|
60
|
+
const properties = textShadow.trim().split(' ');
|
|
61
|
+
if (properties.length === 6) {
|
|
62
|
+
const vs = parseInt(properties[3], 0);
|
|
63
|
+
const hs = parseInt(properties[4], 0);
|
|
64
|
+
const blur = parseInt(properties[5], 0);
|
|
65
|
+
const validateTextShadow = vs === 0 && hs === 0 && blur > 0 && blur <= 15;
|
|
66
|
+
if (validateTextShadow) {
|
|
67
|
+
test.verdict = evaluation_1.Verdict.WARNING;
|
|
68
|
+
test.resultCode = 'W1';
|
|
69
|
+
test.addElement(element);
|
|
70
|
+
this.addTestResult(test);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (this.isImage(bgColor)) {
|
|
76
|
+
test.verdict = evaluation_1.Verdict.WARNING;
|
|
77
|
+
test.resultCode = 'W2';
|
|
78
|
+
test.addElement(element);
|
|
79
|
+
this.addTestResult(test);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const regexGradient = /((\w-?)*gradient.*)/gm;
|
|
83
|
+
let regexGradientMatches = bgColor.match(regexGradient);
|
|
84
|
+
if (regexGradientMatches) {
|
|
85
|
+
if (this.isHumanLanguage(elementText)) {
|
|
86
|
+
const parsedGradientString = regexGradientMatches[0];
|
|
87
|
+
this.evaluateGradient(test, element, parsedGradientString, fgColor, opacity, fontSize, fontWeight, fontStyle, fontFamily, elementText);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
test.verdict = evaluation_1.Verdict.PASSED;
|
|
91
|
+
test.resultCode = 'P2';
|
|
92
|
+
test.addElement(element);
|
|
93
|
+
this.addTestResult(test);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
let parsedBG = this.parseRGBString(bgColor, opacity);
|
|
98
|
+
let elementAux = element;
|
|
99
|
+
let opacityAUX;
|
|
100
|
+
while (parsedBG === undefined ||
|
|
101
|
+
(parsedBG.red === 0 && parsedBG.green === 0 && parsedBG.blue === 0 && parsedBG.alpha === 0)) {
|
|
102
|
+
const parent = elementAux.getElementParent();
|
|
103
|
+
if (parent) {
|
|
104
|
+
bgColor = this.getBackground(parent);
|
|
105
|
+
if (this.isImage(bgColor)) {
|
|
106
|
+
test.verdict = evaluation_1.Verdict.WARNING;
|
|
107
|
+
test.resultCode = 'W2';
|
|
108
|
+
test.addElement(element);
|
|
109
|
+
this.addTestResult(test);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
regexGradientMatches = bgColor.match(regexGradient);
|
|
114
|
+
if (regexGradientMatches) {
|
|
115
|
+
const parsedGradientString = regexGradientMatches[0];
|
|
116
|
+
if (this.evaluateGradient(test, element, parsedGradientString, fgColor, opacity, fontSize, fontWeight, fontStyle, fontFamily, elementText)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
opacityAUX = parseFloat(parent.getElementStyleProperty('opacity', null));
|
|
122
|
+
parsedBG = this.parseRGBString(parent.getElementStyleProperty('background', null), opacityAUX);
|
|
123
|
+
elementAux = parent;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (parsedBG === undefined ||
|
|
132
|
+
(parsedBG.red === 0 && parsedBG.green === 0 && parsedBG.blue === 0 && parsedBG.alpha === 0)) {
|
|
133
|
+
parsedBG = { red: 255, green: 255, blue: 255, alpha: 1 };
|
|
134
|
+
}
|
|
135
|
+
let secondElement = elementAux;
|
|
136
|
+
if (parsedBG.alpha !== 1) {
|
|
137
|
+
let secondOpacity = opacityAUX;
|
|
138
|
+
let parsedSecondBG = parsedBG;
|
|
139
|
+
while (parsedSecondBG && parsedSecondBG.alpha !== 1) {
|
|
140
|
+
const parent = secondElement.getElementParent();
|
|
141
|
+
if (!parent) {
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
secondOpacity = parseFloat(parent.getElementStyleProperty('opacity', null));
|
|
146
|
+
parsedSecondBG = this.parseRGBString(parent.getElementStyleProperty('background', null), secondOpacity);
|
|
147
|
+
secondElement = parent;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (parsedSecondBG && parsedSecondBG.alpha === 1) {
|
|
151
|
+
const outputRed = Math.round(parsedBG.red * parsedBG.alpha + parsedSecondBG.red * (1.0 - parsedBG.alpha));
|
|
152
|
+
const outputGreen = Math.round(parsedBG.green * parsedBG.alpha + parsedSecondBG.green * (1.0 - parsedBG.alpha));
|
|
153
|
+
const outputBlue = Math.round(parsedBG.blue * parsedBG.alpha + parsedSecondBG.blue * (1.0 - parsedBG.alpha));
|
|
154
|
+
parsedBG = { red: outputRed, green: outputGreen, blue: outputBlue, alpha: 1 };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const parsedFG = this.parseRGBString(fgColor, opacity);
|
|
158
|
+
if (!this.equals(parsedBG, parsedFG)) {
|
|
159
|
+
if (this.isHumanLanguage(elementText)) {
|
|
160
|
+
const contrastRatio = this.getContrast(parsedBG, parsedFG);
|
|
161
|
+
const isValid = this.hasValidContrastRatio(contrastRatio, fontSize, this.isBold(fontWeight));
|
|
162
|
+
if (isValid) {
|
|
163
|
+
test.verdict = evaluation_1.Verdict.PASSED;
|
|
164
|
+
test.resultCode = 'P1';
|
|
165
|
+
test.addElement(element);
|
|
166
|
+
this.addTestResult(test);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
test.verdict = evaluation_1.Verdict.FAILED;
|
|
170
|
+
test.resultCode = 'F1';
|
|
171
|
+
test.addElement(element);
|
|
172
|
+
this.addTestResult(test);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
test.verdict = evaluation_1.Verdict.PASSED;
|
|
177
|
+
test.resultCode = 'P2';
|
|
178
|
+
test.addElement(element);
|
|
179
|
+
this.addTestResult(test);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
getBackground(element) {
|
|
185
|
+
const backgroundImage = element.getElementStyleProperty('background-image', null);
|
|
186
|
+
if (backgroundImage === 'none') {
|
|
187
|
+
let bg = element.getElementStyleProperty('background', null);
|
|
188
|
+
if (bg === '') {
|
|
189
|
+
bg = element.getElementStyleProperty('background-color', null);
|
|
190
|
+
}
|
|
191
|
+
return bg;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
return backgroundImage;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
isImage(color) {
|
|
198
|
+
return (color.toLowerCase().includes('.jpeg') ||
|
|
199
|
+
color.toLowerCase().includes('.jpg') ||
|
|
200
|
+
color.toLowerCase().includes('.png') ||
|
|
201
|
+
color.toLowerCase().includes('.svg'));
|
|
202
|
+
}
|
|
203
|
+
evaluateGradient(test, element, parsedGradientString, fgColor, opacity, fontSize, fontWeight, fontStyle, fontFamily, elementText) {
|
|
204
|
+
if (parsedGradientString.startsWith('linear-gradient')) {
|
|
205
|
+
const gradientDirection = this.getGradientDirection(parsedGradientString);
|
|
206
|
+
if (gradientDirection === 'to do') {
|
|
207
|
+
const colors = this.parseGradientString(parsedGradientString, opacity);
|
|
208
|
+
let isValid = true;
|
|
209
|
+
let contrastRatio;
|
|
210
|
+
const textSize = this.getTextSize(fontFamily.toLowerCase().replace(/['"]+/g, ''), parseInt(fontSize.replace('px', '')), this.isBold(fontWeight), fontStyle.toLowerCase().includes('italic'), elementText);
|
|
211
|
+
if (textSize !== -1) {
|
|
212
|
+
const elementWidth = element.getElementStyleProperty('width', null);
|
|
213
|
+
const lastCharRatio = textSize / parseInt(elementWidth.replace('px', ''));
|
|
214
|
+
const lastCharBgColor = this.getColorInGradient(colors[0], colors[colors.length - 1], lastCharRatio);
|
|
215
|
+
contrastRatio = this.getContrast(colors[0], this.parseRGBString(fgColor, opacity));
|
|
216
|
+
isValid = isValid && this.hasValidContrastRatio(contrastRatio, fontSize, this.isBold(fontWeight));
|
|
217
|
+
contrastRatio = this.getContrast(lastCharBgColor, this.parseRGBString(fgColor, opacity));
|
|
218
|
+
isValid = isValid && this.hasValidContrastRatio(contrastRatio, fontSize, this.isBold(fontWeight));
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
for (const color of colors) {
|
|
222
|
+
contrastRatio = this.getContrast(color, this.parseRGBString(fgColor, opacity));
|
|
223
|
+
isValid = isValid && this.hasValidContrastRatio(contrastRatio, fontSize, this.isBold(fontWeight));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (isValid) {
|
|
227
|
+
test.verdict = evaluation_1.Verdict.PASSED;
|
|
228
|
+
test.resultCode = 'P3';
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
test.verdict = evaluation_1.Verdict.FAILED;
|
|
232
|
+
test.resultCode = 'F2';
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else if (gradientDirection === 'to left' || gradientDirection === 'to right') {
|
|
236
|
+
test.verdict = evaluation_1.Verdict.WARNING;
|
|
237
|
+
test.resultCode = 'W3';
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
test.verdict = evaluation_1.Verdict.WARNING;
|
|
241
|
+
test.resultCode = 'W3';
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
test.resultCode = 'W3';
|
|
246
|
+
}
|
|
247
|
+
test.addElement(element);
|
|
248
|
+
this.addTestResult(test);
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
isHumanLanguage(text) {
|
|
252
|
+
return window.DomUtils.isHumanLanguage(text);
|
|
253
|
+
}
|
|
254
|
+
equals(color1, color2) {
|
|
255
|
+
return (color1.red === color2.red &&
|
|
256
|
+
color1.green === color2.green &&
|
|
257
|
+
color1.blue === color2.blue &&
|
|
258
|
+
color1.alpha === color2.alpha);
|
|
259
|
+
}
|
|
260
|
+
getGradientDirection(gradient) {
|
|
261
|
+
const direction = gradient.replace('linear-gradient(', '').split(',')[0];
|
|
262
|
+
if (direction) {
|
|
263
|
+
if (direction === '90deg')
|
|
264
|
+
return 'to right';
|
|
265
|
+
if (direction === '-90deg')
|
|
266
|
+
return 'to left';
|
|
267
|
+
return direction;
|
|
268
|
+
}
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
parseGradientString(gradient, opacity) {
|
|
272
|
+
const regex = /rgb(a?)\((\d+), (\d+), (\d+)+(, +(\d)+)?\)/gm;
|
|
273
|
+
const colorsMatch = gradient.match(regex);
|
|
274
|
+
const colors = [];
|
|
275
|
+
for (const stringColor of colorsMatch || []) {
|
|
276
|
+
colors.push(this.parseRGBString(stringColor, opacity));
|
|
277
|
+
}
|
|
278
|
+
return colors;
|
|
279
|
+
}
|
|
280
|
+
parseRGBString(colorString, opacity) {
|
|
281
|
+
const rgbRegex = /^rgb\((\d+), (\d+), (\d+)\)/;
|
|
282
|
+
const rgbaRegex = /^rgba\((\d+), (\d+), (\d+), (\d*(\.\d+)?)\)/;
|
|
283
|
+
if (colorString === 'transparent') {
|
|
284
|
+
return { red: 0, green: 0, blue: 0, alpha: 0 };
|
|
285
|
+
}
|
|
286
|
+
let match = colorString.match(rgbRegex);
|
|
287
|
+
if (match) {
|
|
288
|
+
return {
|
|
289
|
+
red: parseInt(match[1], 10),
|
|
290
|
+
green: parseInt(match[2], 10),
|
|
291
|
+
blue: parseInt(match[3], 10),
|
|
292
|
+
alpha: opacity
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
match = colorString.match(rgbaRegex);
|
|
296
|
+
if (match) {
|
|
297
|
+
return {
|
|
298
|
+
red: parseInt(match[1], 10),
|
|
299
|
+
green: parseInt(match[2], 10),
|
|
300
|
+
blue: parseInt(match[3], 10),
|
|
301
|
+
alpha: Math.round(parseFloat(match[4]) * 100) / 100
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
getRelativeLuminance(red, green, blue) {
|
|
306
|
+
const rSRGB = red / 255;
|
|
307
|
+
const gSRGB = green / 255;
|
|
308
|
+
const bSRGB = blue / 255;
|
|
309
|
+
const r = rSRGB <= 0.03928 ? rSRGB / 12.92 : Math.pow((rSRGB + 0.055) / 1.055, 2.4);
|
|
310
|
+
const g = gSRGB <= 0.03928 ? gSRGB / 12.92 : Math.pow((gSRGB + 0.055) / 1.055, 2.4);
|
|
311
|
+
const b = bSRGB <= 0.03928 ? bSRGB / 12.92 : Math.pow((bSRGB + 0.055) / 1.055, 2.4);
|
|
312
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
313
|
+
}
|
|
314
|
+
flattenColors(fgColor, bgColor) {
|
|
315
|
+
const fgAlpha = fgColor['alpha'];
|
|
316
|
+
const red = (1 - fgAlpha) * bgColor['red'] + fgAlpha * fgColor['red'];
|
|
317
|
+
const green = (1 - fgAlpha) * bgColor['green'] + fgAlpha * fgColor['green'];
|
|
318
|
+
const blue = (1 - fgAlpha) * bgColor['blue'] + fgAlpha * fgColor['blue'];
|
|
319
|
+
const alpha = fgColor['alpha'] + bgColor['alpha'] * (1 - fgColor['alpha']);
|
|
320
|
+
return { red: red, green: green, blue: blue, alpha: alpha };
|
|
321
|
+
}
|
|
322
|
+
isBold(fontWeight) {
|
|
323
|
+
return !!fontWeight && ['bold', 'bolder', '700', '800', '900'].includes(fontWeight);
|
|
324
|
+
}
|
|
325
|
+
getContrast(bgColor, fgColor) {
|
|
326
|
+
if (fgColor.alpha < 1) {
|
|
327
|
+
fgColor = this.flattenColors(fgColor, bgColor);
|
|
328
|
+
}
|
|
329
|
+
const bL = this.getRelativeLuminance(bgColor['red'], bgColor['green'], bgColor['blue']);
|
|
330
|
+
const fL = this.getRelativeLuminance(fgColor['red'], fgColor['green'], fgColor['blue']);
|
|
331
|
+
return (Math.max(fL, bL) + 0.05) / (Math.min(fL, bL) + 0.05);
|
|
332
|
+
}
|
|
333
|
+
hasValidContrastRatio(contrast, fontSize, isBold) {
|
|
334
|
+
const isSmallFont = (isBold && parseFloat(fontSize) < 18.6667) || (!isBold && parseFloat(fontSize) < 24);
|
|
335
|
+
const expectedContrastRatio = isSmallFont ? 4.5 : 3;
|
|
336
|
+
return contrast >= expectedContrastRatio;
|
|
337
|
+
}
|
|
338
|
+
getTextSize(font, fontSize, bold, italic, text) {
|
|
339
|
+
return window.DomUtils.getTextSize(font, fontSize, bold, italic, text);
|
|
340
|
+
}
|
|
341
|
+
getColorInGradient(fromColor, toColor, ratio) {
|
|
342
|
+
const red = fromColor['red'] + (toColor['red'] - fromColor['red']) * ratio;
|
|
343
|
+
const green = fromColor['green'] + (toColor['green'] - fromColor['green']) * ratio;
|
|
344
|
+
const blue = fromColor['blue'] + (toColor['blue'] - fromColor['blue']) * ratio;
|
|
345
|
+
return { red: red, green: green, blue: blue, alpha: 1 };
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.QW_ACT_R37 = QW_ACT_R37;
|
|
349
|
+
__decorate([
|
|
350
|
+
applicability_1.ElementExists,
|
|
351
|
+
applicability_1.ElementIsHTMLElement,
|
|
352
|
+
(0, applicability_1.ElementIsNot)(['html', 'head', 'body', 'script', 'style', 'meta']),
|
|
353
|
+
applicability_1.ElementIsVisible,
|
|
354
|
+
applicability_1.ElementHasText,
|
|
355
|
+
__metadata("design:type", Function),
|
|
356
|
+
__metadata("design:paramtypes", [Function]),
|
|
357
|
+
__metadata("design:returntype", void 0)
|
|
358
|
+
], QW_ACT_R37.prototype, "execute", null);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { QWElement } from '@qualweb/qw-element';
|
|
2
|
+
import { AtomicRule } from '../lib/AtomicRule.object';
|
|
3
|
+
declare class QW_ACT_R38 extends AtomicRule {
|
|
4
|
+
execute(element: QWElement): void;
|
|
5
|
+
private checkOwnedElementsRole;
|
|
6
|
+
private isElementADescendantOfAriaBusy;
|
|
7
|
+
}
|
|
8
|
+
export { QW_ACT_R38 };
|
|
9
|
+
//# sourceMappingURL=QW-ACT-R38.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QW-ACT-R38.d.ts","sourceRoot":"","sources":["../../src/rules/QW-ACT-R38.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,cAAM,UAAW,SAAQ,UAAU;IAQjC,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI;IA2BjC,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,8BAA8B;CAkBvC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.QW_ACT_R38 = void 0;
|
|
13
|
+
const applicability_1 = require("@qualweb/util/applicability");
|
|
14
|
+
const evaluation_1 = require("@qualweb/core/evaluation");
|
|
15
|
+
const AtomicRule_object_1 = require("../lib/AtomicRule.object");
|
|
16
|
+
class QW_ACT_R38 extends AtomicRule_object_1.AtomicRule {
|
|
17
|
+
execute(element) {
|
|
18
|
+
const rolesJSON = window.AccessibilityUtils.roles;
|
|
19
|
+
const test = new evaluation_1.Test();
|
|
20
|
+
const explicitRole = element.getElementAttribute('role');
|
|
21
|
+
const implicitRole = window.AccessibilityUtils.getImplicitRole(element, '');
|
|
22
|
+
const ariaBusy = this.isElementADescendantOfAriaBusy(element) || element.getElementAttribute('aria-busy');
|
|
23
|
+
if (explicitRole !== null && explicitRole !== implicitRole && explicitRole !== 'combobox' && !ariaBusy) {
|
|
24
|
+
const result = this.checkOwnedElementsRole(rolesJSON[explicitRole]['requiredOwnedElements'], window.AccessibilityUtils.getOwnedElements(element));
|
|
25
|
+
if (result) {
|
|
26
|
+
test.verdict = evaluation_1.Verdict.PASSED;
|
|
27
|
+
test.resultCode = 'P1';
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
test.verdict = evaluation_1.Verdict.FAILED;
|
|
31
|
+
test.resultCode = 'F1';
|
|
32
|
+
}
|
|
33
|
+
test.addElement(element);
|
|
34
|
+
this.addTestResult(test);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
checkOwnedElementsRole(ownedRoles, elements) {
|
|
38
|
+
if ((ownedRoles === null || ownedRoles === void 0 ? void 0 : ownedRoles.length) === 0)
|
|
39
|
+
return true;
|
|
40
|
+
const rolesJSON = window.AccessibilityUtils.roles;
|
|
41
|
+
let onlyOwnedRoles = true;
|
|
42
|
+
let hasOneOwnedRole = false;
|
|
43
|
+
let i = 0;
|
|
44
|
+
let hasOwnedRole, currentElement;
|
|
45
|
+
while (i < elements.length) {
|
|
46
|
+
hasOwnedRole = false;
|
|
47
|
+
currentElement = elements[i];
|
|
48
|
+
const role = window.AccessibilityUtils.getElementRole(currentElement);
|
|
49
|
+
if (!role || role === 'none') {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
if (role.includes('group')) {
|
|
53
|
+
const roles = rolesJSON[role]['requiredOwnedElements'];
|
|
54
|
+
if (roles) {
|
|
55
|
+
roles.push(...(ownedRoles !== null && ownedRoles !== void 0 ? ownedRoles : []));
|
|
56
|
+
hasOwnedRole =
|
|
57
|
+
(ownedRoles === null || ownedRoles === void 0 ? void 0 : ownedRoles.includes(role)) &&
|
|
58
|
+
this.checkOwnedElementsRole(roles, window.AccessibilityUtils.getOwnedElements(currentElement));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
hasOwnedRole =
|
|
63
|
+
(ownedRoles === null || ownedRoles === void 0 ? void 0 : ownedRoles.includes(role)) &&
|
|
64
|
+
this.checkOwnedElementsRole(rolesJSON[role]['requiredOwnedElements'], window.AccessibilityUtils.getOwnedElements(currentElement));
|
|
65
|
+
}
|
|
66
|
+
onlyOwnedRoles = onlyOwnedRoles && !!hasOwnedRole;
|
|
67
|
+
if (!hasOneOwnedRole)
|
|
68
|
+
hasOneOwnedRole = !!hasOwnedRole;
|
|
69
|
+
i++;
|
|
70
|
+
}
|
|
71
|
+
return hasOneOwnedRole && onlyOwnedRoles;
|
|
72
|
+
}
|
|
73
|
+
isElementADescendantOfAriaBusy(element) {
|
|
74
|
+
const parent = element.getElementParent();
|
|
75
|
+
let result = false;
|
|
76
|
+
if (parent !== null) {
|
|
77
|
+
const inAt = window.AccessibilityUtils.isElementInAT(parent);
|
|
78
|
+
if (inAt) {
|
|
79
|
+
result = !!parent.getElementAttribute('aria-busy');
|
|
80
|
+
}
|
|
81
|
+
if (!result) {
|
|
82
|
+
return this.isElementADescendantOfAriaBusy(parent);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.QW_ACT_R38 = QW_ACT_R38;
|
|
94
|
+
__decorate([
|
|
95
|
+
applicability_1.ElementExists,
|
|
96
|
+
applicability_1.ElementIsInAccessibilityTree,
|
|
97
|
+
__metadata("design:type", Function),
|
|
98
|
+
__metadata("design:paramtypes", [Function]),
|
|
99
|
+
__metadata("design:returntype", void 0)
|
|
100
|
+
], QW_ACT_R38.prototype, "execute", null);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { QWElement } from '@qualweb/qw-element';
|
|
2
|
+
import { AtomicRule } from '../lib/AtomicRule.object';
|
|
3
|
+
declare class QW_ACT_R39 extends AtomicRule {
|
|
4
|
+
private readonly cellRoles;
|
|
5
|
+
execute(element: QWElement): void;
|
|
6
|
+
}
|
|
7
|
+
export { QW_ACT_R39 };
|
|
8
|
+
//# sourceMappingURL=QW-ACT-R39.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QW-ACT-R39.d.ts","sourceRoot":"","sources":["../../src/rules/QW-ACT-R39.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQrD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,cAAM,UAAW,SAAQ,UAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqD;IAM/E,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI;CAoGlC;AAgDD,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.QW_ACT_R39 = void 0;
|
|
13
|
+
const applicability_1 = require("@qualweb/util/applicability");
|
|
14
|
+
const evaluation_1 = require("@qualweb/core/evaluation");
|
|
15
|
+
const AtomicRule_object_1 = require("../lib/AtomicRule.object");
|
|
16
|
+
class QW_ACT_R39 extends AtomicRule_object_1.AtomicRule {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.cellRoles = ['cell', 'gridcell', 'rowheader', 'columnheader'];
|
|
20
|
+
}
|
|
21
|
+
execute(element) {
|
|
22
|
+
const ancestorTableOrGrid = getFirstAncestorElementByNameOrRoles(element, [], ['grid', 'table']);
|
|
23
|
+
if (ancestorTableOrGrid !== null) {
|
|
24
|
+
const isAncestorTableOrGridInAT = window.AccessibilityUtils.isElementInAT(ancestorTableOrGrid);
|
|
25
|
+
if (isAncestorTableOrGridInAT) {
|
|
26
|
+
const rowElements = ancestorTableOrGrid.getElements('tr, [role="row"]');
|
|
27
|
+
const elementParent = element.getElementParent();
|
|
28
|
+
const colspan = element.getElementAttribute('colspan');
|
|
29
|
+
const headerElementIndex = getElementIndexOfParentChildren(element);
|
|
30
|
+
const headerElementId = element.getElementAttribute('id');
|
|
31
|
+
let found = false;
|
|
32
|
+
let index = 0;
|
|
33
|
+
while (!found && index < rowElements.length) {
|
|
34
|
+
if (elementParent && rowElements[index].getElementSelector() !== elementParent.getElementSelector()) {
|
|
35
|
+
const rowChildrenElements = rowElements[index].getElementChildren();
|
|
36
|
+
if (rowChildrenElements.length > headerElementIndex) {
|
|
37
|
+
const cellIndexElements = [rowChildrenElements[headerElementIndex]];
|
|
38
|
+
if (colspan) {
|
|
39
|
+
let i = headerElementIndex + 1;
|
|
40
|
+
for (i; i < headerElementIndex + parseInt(colspan) && i < rowChildrenElements.length; i++) {
|
|
41
|
+
cellIndexElements.push(rowChildrenElements[i]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
for (const cellIndexElement of cellIndexElements !== null && cellIndexElements !== void 0 ? cellIndexElements : []) {
|
|
45
|
+
const cellIndexElementRole = cellIndexElement
|
|
46
|
+
? window.AccessibilityUtils.getElementRole(cellIndexElement)
|
|
47
|
+
: null;
|
|
48
|
+
const cellHeadersAttribute = cellIndexElement ? cellIndexElement.getElementAttribute('headers') : null;
|
|
49
|
+
found =
|
|
50
|
+
!!cellIndexElementRole &&
|
|
51
|
+
this.cellRoles.includes(cellIndexElementRole) &&
|
|
52
|
+
(cellHeadersAttribute
|
|
53
|
+
? headerElementId
|
|
54
|
+
? cellHeadersAttribute.includes(headerElementId)
|
|
55
|
+
: false
|
|
56
|
+
: true);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
for (const cellElement of rowChildrenElements) {
|
|
61
|
+
if (!found) {
|
|
62
|
+
const cellElementRole = window.AccessibilityUtils.getElementRole(cellElement);
|
|
63
|
+
const cellColspanAttribute = cellElement.getElementAttribute('colspan');
|
|
64
|
+
const cellElementIndex = getElementIndexOfParentChildren(cellElement);
|
|
65
|
+
const headers = cellElement.getElementAttribute('headers');
|
|
66
|
+
found =
|
|
67
|
+
!!cellElementRole &&
|
|
68
|
+
this.cellRoles.includes(cellElementRole) &&
|
|
69
|
+
((!!headerElementId && !!headers && headers.includes(headerElementId)) ||
|
|
70
|
+
(cellColspanAttribute
|
|
71
|
+
? cellElementIndex + +cellColspanAttribute - 1 <= headerElementIndex
|
|
72
|
+
: false));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const elements = rowElements[index].getElements("td,[role='cell'],[role='gridcell']");
|
|
79
|
+
for (const cellElement of elements) {
|
|
80
|
+
if (!found) {
|
|
81
|
+
const cellElementRole = window.AccessibilityUtils.getElementRole(cellElement);
|
|
82
|
+
const headers = cellElement.getElementAttribute('headers');
|
|
83
|
+
found =
|
|
84
|
+
!!cellElementRole &&
|
|
85
|
+
this.cellRoles.includes(cellElementRole) &&
|
|
86
|
+
(!headers || (!!headerElementId && !!headers && headers.includes(headerElementId)));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
index++;
|
|
91
|
+
}
|
|
92
|
+
const test = new evaluation_1.Test();
|
|
93
|
+
if (found) {
|
|
94
|
+
test.verdict = evaluation_1.Verdict.PASSED;
|
|
95
|
+
test.resultCode = 'P1';
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
test.verdict = evaluation_1.Verdict.FAILED;
|
|
99
|
+
test.resultCode = 'F1';
|
|
100
|
+
}
|
|
101
|
+
test.addElement(element);
|
|
102
|
+
this.addTestResult(test);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.QW_ACT_R39 = QW_ACT_R39;
|
|
108
|
+
__decorate([
|
|
109
|
+
applicability_1.ElementExists,
|
|
110
|
+
applicability_1.ElementIsInAccessibilityTree,
|
|
111
|
+
applicability_1.ElementIsVisible,
|
|
112
|
+
(0, applicability_1.ElementHasOneOfTheFollowingRoles)(['columnheader', 'rowheader']),
|
|
113
|
+
__metadata("design:type", Function),
|
|
114
|
+
__metadata("design:paramtypes", [Function]),
|
|
115
|
+
__metadata("design:returntype", void 0)
|
|
116
|
+
], QW_ACT_R39.prototype, "execute", null);
|
|
117
|
+
function getFirstAncestorElementByNameOrRoles(element, names, roles) {
|
|
118
|
+
const parent = element.getElementParent();
|
|
119
|
+
let sameRole = false;
|
|
120
|
+
let sameName = false;
|
|
121
|
+
if (parent !== null) {
|
|
122
|
+
const parentName = parent.getElementTagName();
|
|
123
|
+
const parentRole = window.AccessibilityUtils.getElementRole(parent);
|
|
124
|
+
if (parentName !== null) {
|
|
125
|
+
sameName = names.includes(parentName);
|
|
126
|
+
}
|
|
127
|
+
if (parentRole !== null) {
|
|
128
|
+
sameRole = roles.includes(parentRole);
|
|
129
|
+
}
|
|
130
|
+
if (sameName || sameRole) {
|
|
131
|
+
return parent;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
return getFirstAncestorElementByNameOrRoles(parent, names, roles);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function getElementIndexOfParentChildren(element) {
|
|
142
|
+
let elementIndex = 0;
|
|
143
|
+
let foundIndex = false;
|
|
144
|
+
const elementParent = element.getElementParent();
|
|
145
|
+
const elementParentChildren = elementParent ? elementParent.getElementChildren() : null;
|
|
146
|
+
while (elementParentChildren && !foundIndex && elementIndex < elementParentChildren.length) {
|
|
147
|
+
if (elementParentChildren[elementIndex].getElementSelector() !== element.getElementSelector()) {
|
|
148
|
+
elementIndex++;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
foundIndex = true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return elementIndex++;
|
|
155
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { QWElement } from '@qualweb/qw-element';
|
|
2
|
+
import { AtomicRule } from '../lib/AtomicRule.object';
|
|
3
|
+
declare class QW_ACT_R4 extends AtomicRule {
|
|
4
|
+
execute(element: QWElement): void;
|
|
5
|
+
private checkIfIsNumber;
|
|
6
|
+
}
|
|
7
|
+
export { QW_ACT_R4 };
|
|
8
|
+
//# sourceMappingURL=QW-ACT-R4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QW-ACT-R4.d.ts","sourceRoot":"","sources":["../../src/rules/QW-ACT-R4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,cAAM,SAAU,SAAQ,UAAU;IAMhC,OAAO,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI;IA4DjC,OAAO,CAAC,eAAe;CAWxB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|