@qualweb/act-rules 0.0.0-develop-20231124154536 → 0.0.0-develop-20241204125016

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.
Files changed (242) hide show
  1. package/README.md +109 -76
  2. package/dist/ACTRulesModule.d.ts +11 -0
  3. package/dist/ACTRulesModule.d.ts.map +1 -0
  4. package/dist/ACTRulesModule.js +65 -0
  5. package/dist/ACTRulesRunner.d.ts +14 -0
  6. package/dist/ACTRulesRunner.d.ts.map +1 -0
  7. package/dist/ACTRulesRunner.js +44 -0
  8. package/dist/__webpack/act.bundle.js +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +7 -0
  12. package/dist/lib/ACTRulesTester.object.d.ts +15 -0
  13. package/dist/lib/ACTRulesTester.object.d.ts.map +1 -0
  14. package/dist/lib/ACTRulesTester.object.js +150 -0
  15. package/dist/lib/AtomicRule.object.d.ts +7 -0
  16. package/dist/lib/AtomicRule.object.d.ts.map +1 -0
  17. package/dist/lib/AtomicRule.object.js +7 -0
  18. package/dist/lib/CompositeRule.object.d.ts +13 -0
  19. package/dist/lib/CompositeRule.object.d.ts.map +1 -0
  20. package/dist/lib/CompositeRule.object.js +80 -0
  21. package/dist/lib/Rule.object.d.ts +19 -0
  22. package/dist/lib/Rule.object.d.ts.map +1 -0
  23. package/dist/lib/Rule.object.js +76 -0
  24. package/dist/lib/mapping.d.ts +36 -0
  25. package/dist/lib/mapping.d.ts.map +1 -0
  26. package/dist/lib/mapping.js +38 -0
  27. package/dist/lib/mappingComposite.d.ts +39 -0
  28. package/dist/lib/mappingComposite.d.ts.map +1 -0
  29. package/dist/lib/mappingComposite.js +23 -0
  30. package/dist/lib/rules.json +1523 -0
  31. package/dist/lib/types.d.ts +15 -0
  32. package/dist/lib/types.d.ts.map +1 -0
  33. package/dist/lib/types.js +2 -0
  34. package/dist/rules/QW-ACT-R1.d.ts +7 -0
  35. package/dist/rules/QW-ACT-R1.d.ts.map +1 -0
  36. package/dist/rules/QW-ACT-R1.js +49 -0
  37. package/dist/rules/QW-ACT-R10.d.ts +8 -0
  38. package/dist/rules/QW-ACT-R10.d.ts.map +1 -0
  39. package/dist/rules/QW-ACT-R10.js +98 -0
  40. package/dist/rules/QW-ACT-R11.d.ts +7 -0
  41. package/dist/rules/QW-ACT-R11.d.ts.map +1 -0
  42. package/dist/rules/QW-ACT-R11.js +40 -0
  43. package/dist/rules/QW-ACT-R12.d.ts +7 -0
  44. package/dist/rules/QW-ACT-R12.d.ts.map +1 -0
  45. package/dist/rules/QW-ACT-R12.js +40 -0
  46. package/dist/rules/QW-ACT-R13.d.ts +9 -0
  47. package/dist/rules/QW-ACT-R13.d.ts.map +1 -0
  48. package/dist/rules/QW-ACT-R13.js +76 -0
  49. package/dist/rules/QW-ACT-R14.d.ts +7 -0
  50. package/dist/rules/QW-ACT-R14.d.ts.map +1 -0
  51. package/dist/rules/QW-ACT-R14.js +73 -0
  52. package/dist/rules/QW-ACT-R15.d.ts +6 -0
  53. package/dist/rules/QW-ACT-R15.d.ts.map +1 -0
  54. package/dist/rules/QW-ACT-R15.js +26 -0
  55. package/dist/rules/QW-ACT-R16.d.ts +7 -0
  56. package/dist/rules/QW-ACT-R16.d.ts.map +1 -0
  57. package/dist/rules/QW-ACT-R16.js +52 -0
  58. package/dist/rules/QW-ACT-R17.d.ts +7 -0
  59. package/dist/rules/QW-ACT-R17.d.ts.map +1 -0
  60. package/dist/rules/QW-ACT-R17.js +52 -0
  61. package/dist/rules/QW-ACT-R19.d.ts +7 -0
  62. package/dist/rules/QW-ACT-R19.d.ts.map +1 -0
  63. package/dist/rules/QW-ACT-R19.js +42 -0
  64. package/dist/rules/QW-ACT-R2.d.ts +7 -0
  65. package/dist/rules/QW-ACT-R2.d.ts.map +1 -0
  66. package/dist/rules/QW-ACT-R2.js +40 -0
  67. package/dist/rules/QW-ACT-R20.d.ts +7 -0
  68. package/dist/rules/QW-ACT-R20.d.ts.map +1 -0
  69. package/dist/rules/QW-ACT-R20.js +39 -0
  70. package/dist/rules/QW-ACT-R21.d.ts +8 -0
  71. package/dist/rules/QW-ACT-R21.d.ts.map +1 -0
  72. package/dist/rules/QW-ACT-R21.js +50 -0
  73. package/dist/rules/QW-ACT-R22.d.ts +9 -0
  74. package/dist/rules/QW-ACT-R22.d.ts.map +1 -0
  75. package/dist/rules/QW-ACT-R22.js +69 -0
  76. package/dist/rules/QW-ACT-R23.d.ts +6 -0
  77. package/dist/rules/QW-ACT-R23.d.ts.map +1 -0
  78. package/dist/rules/QW-ACT-R23.js +26 -0
  79. package/dist/rules/QW-ACT-R24.d.ts +12 -0
  80. package/dist/rules/QW-ACT-R24.d.ts.map +1 -0
  81. package/dist/rules/QW-ACT-R24.js +298 -0
  82. package/dist/rules/QW-ACT-R25.d.ts +7 -0
  83. package/dist/rules/QW-ACT-R25.d.ts.map +1 -0
  84. package/dist/rules/QW-ACT-R25.js +67 -0
  85. package/dist/rules/QW-ACT-R26.d.ts +6 -0
  86. package/dist/rules/QW-ACT-R26.d.ts.map +1 -0
  87. package/dist/rules/QW-ACT-R26.js +26 -0
  88. package/dist/rules/QW-ACT-R27.d.ts +7 -0
  89. package/dist/rules/QW-ACT-R27.d.ts.map +1 -0
  90. package/dist/rules/QW-ACT-R27.js +55 -0
  91. package/dist/rules/QW-ACT-R28.d.ts +7 -0
  92. package/dist/rules/QW-ACT-R28.d.ts.map +1 -0
  93. package/dist/rules/QW-ACT-R28.js +83 -0
  94. package/dist/rules/QW-ACT-R29.d.ts +6 -0
  95. package/dist/rules/QW-ACT-R29.d.ts.map +1 -0
  96. package/dist/rules/QW-ACT-R29.js +26 -0
  97. package/dist/rules/QW-ACT-R30.d.ts +9 -0
  98. package/dist/rules/QW-ACT-R30.d.ts.map +1 -0
  99. package/dist/rules/QW-ACT-R30.js +69 -0
  100. package/dist/rules/QW-ACT-R31.d.ts +6 -0
  101. package/dist/rules/QW-ACT-R31.d.ts.map +1 -0
  102. package/dist/rules/QW-ACT-R31.js +26 -0
  103. package/dist/rules/QW-ACT-R32.d.ts +6 -0
  104. package/dist/rules/QW-ACT-R32.d.ts.map +1 -0
  105. package/dist/rules/QW-ACT-R32.js +26 -0
  106. package/dist/rules/QW-ACT-R33.d.ts +8 -0
  107. package/dist/rules/QW-ACT-R33.d.ts.map +1 -0
  108. package/dist/rules/QW-ACT-R33.js +89 -0
  109. package/dist/rules/QW-ACT-R34.d.ts +7 -0
  110. package/dist/rules/QW-ACT-R34.d.ts.map +1 -0
  111. package/dist/rules/QW-ACT-R34.js +112 -0
  112. package/dist/rules/QW-ACT-R35.d.ts +7 -0
  113. package/dist/rules/QW-ACT-R35.d.ts.map +1 -0
  114. package/dist/rules/QW-ACT-R35.js +40 -0
  115. package/dist/rules/QW-ACT-R36.d.ts +7 -0
  116. package/dist/rules/QW-ACT-R36.d.ts.map +1 -0
  117. package/dist/rules/QW-ACT-R36.js +108 -0
  118. package/dist/rules/QW-ACT-R37.d.ts +23 -0
  119. package/dist/rules/QW-ACT-R37.d.ts.map +1 -0
  120. package/dist/rules/QW-ACT-R37.js +358 -0
  121. package/dist/rules/QW-ACT-R38.d.ts +9 -0
  122. package/dist/rules/QW-ACT-R38.d.ts.map +1 -0
  123. package/dist/rules/QW-ACT-R38.js +100 -0
  124. package/dist/rules/QW-ACT-R39.d.ts +8 -0
  125. package/dist/rules/QW-ACT-R39.d.ts.map +1 -0
  126. package/dist/rules/QW-ACT-R39.js +155 -0
  127. package/dist/rules/QW-ACT-R4.d.ts +8 -0
  128. package/dist/rules/QW-ACT-R4.d.ts.map +1 -0
  129. package/dist/rules/QW-ACT-R4.js +85 -0
  130. package/dist/rules/QW-ACT-R40.d.ts +7 -0
  131. package/dist/rules/QW-ACT-R40.d.ts.map +1 -0
  132. package/dist/rules/QW-ACT-R40.js +58 -0
  133. package/dist/rules/QW-ACT-R41.d.ts +7 -0
  134. package/dist/rules/QW-ACT-R41.d.ts.map +1 -0
  135. package/dist/rules/QW-ACT-R41.js +42 -0
  136. package/dist/rules/QW-ACT-R42.d.ts +7 -0
  137. package/dist/rules/QW-ACT-R42.d.ts.map +1 -0
  138. package/dist/rules/QW-ACT-R42.js +40 -0
  139. package/dist/rules/QW-ACT-R43.d.ts +8 -0
  140. package/dist/rules/QW-ACT-R43.d.ts.map +1 -0
  141. package/dist/rules/QW-ACT-R43.js +98 -0
  142. package/dist/rules/QW-ACT-R44.d.ts +8 -0
  143. package/dist/rules/QW-ACT-R44.d.ts.map +1 -0
  144. package/dist/rules/QW-ACT-R44.js +92 -0
  145. package/dist/rules/QW-ACT-R48.d.ts +7 -0
  146. package/dist/rules/QW-ACT-R48.d.ts.map +1 -0
  147. package/dist/rules/QW-ACT-R48.js +38 -0
  148. package/dist/rules/QW-ACT-R49.d.ts +8 -0
  149. package/dist/rules/QW-ACT-R49.d.ts.map +1 -0
  150. package/dist/rules/QW-ACT-R49.js +83 -0
  151. package/dist/rules/QW-ACT-R5.d.ts +8 -0
  152. package/dist/rules/QW-ACT-R5.d.ts.map +1 -0
  153. package/dist/rules/QW-ACT-R5.js +44 -0
  154. package/dist/rules/QW-ACT-R50.d.ts +8 -0
  155. package/dist/rules/QW-ACT-R50.d.ts.map +1 -0
  156. package/dist/rules/QW-ACT-R50.js +76 -0
  157. package/dist/rules/QW-ACT-R51.d.ts +7 -0
  158. package/dist/rules/QW-ACT-R51.d.ts.map +1 -0
  159. package/dist/rules/QW-ACT-R51.js +41 -0
  160. package/dist/rules/QW-ACT-R53.d.ts +7 -0
  161. package/dist/rules/QW-ACT-R53.d.ts.map +1 -0
  162. package/dist/rules/QW-ACT-R53.js +41 -0
  163. package/dist/rules/QW-ACT-R54.d.ts +7 -0
  164. package/dist/rules/QW-ACT-R54.d.ts.map +1 -0
  165. package/dist/rules/QW-ACT-R54.js +41 -0
  166. package/dist/rules/QW-ACT-R55.d.ts +7 -0
  167. package/dist/rules/QW-ACT-R55.d.ts.map +1 -0
  168. package/dist/rules/QW-ACT-R55.js +41 -0
  169. package/dist/rules/QW-ACT-R56.d.ts +7 -0
  170. package/dist/rules/QW-ACT-R56.d.ts.map +1 -0
  171. package/dist/rules/QW-ACT-R56.js +41 -0
  172. package/dist/rules/QW-ACT-R58.d.ts +7 -0
  173. package/dist/rules/QW-ACT-R58.d.ts.map +1 -0
  174. package/dist/rules/QW-ACT-R58.js +33 -0
  175. package/dist/rules/QW-ACT-R59.d.ts +7 -0
  176. package/dist/rules/QW-ACT-R59.d.ts.map +1 -0
  177. package/dist/rules/QW-ACT-R59.js +33 -0
  178. package/dist/rules/QW-ACT-R6.d.ts +7 -0
  179. package/dist/rules/QW-ACT-R6.d.ts.map +1 -0
  180. package/dist/rules/QW-ACT-R6.js +40 -0
  181. package/dist/rules/QW-ACT-R60.d.ts +7 -0
  182. package/dist/rules/QW-ACT-R60.d.ts.map +1 -0
  183. package/dist/rules/QW-ACT-R60.js +41 -0
  184. package/dist/rules/QW-ACT-R61.d.ts +7 -0
  185. package/dist/rules/QW-ACT-R61.d.ts.map +1 -0
  186. package/dist/rules/QW-ACT-R61.js +41 -0
  187. package/dist/rules/QW-ACT-R62.d.ts +7 -0
  188. package/dist/rules/QW-ACT-R62.d.ts.map +1 -0
  189. package/dist/rules/QW-ACT-R62.js +37 -0
  190. package/dist/rules/QW-ACT-R63.d.ts +8 -0
  191. package/dist/rules/QW-ACT-R63.d.ts.map +1 -0
  192. package/dist/rules/QW-ACT-R63.js +60 -0
  193. package/dist/rules/QW-ACT-R64.d.ts +8 -0
  194. package/dist/rules/QW-ACT-R64.d.ts.map +1 -0
  195. package/dist/rules/QW-ACT-R64.js +60 -0
  196. package/dist/rules/QW-ACT-R65.d.ts +7 -0
  197. package/dist/rules/QW-ACT-R65.d.ts.map +1 -0
  198. package/dist/rules/QW-ACT-R65.js +58 -0
  199. package/dist/rules/QW-ACT-R66.d.ts +7 -0
  200. package/dist/rules/QW-ACT-R66.d.ts.map +1 -0
  201. package/dist/rules/QW-ACT-R66.js +40 -0
  202. package/dist/rules/QW-ACT-R67.d.ts +12 -0
  203. package/dist/rules/QW-ACT-R67.d.ts.map +1 -0
  204. package/dist/rules/QW-ACT-R67.js +94 -0
  205. package/dist/rules/QW-ACT-R68.d.ts +14 -0
  206. package/dist/rules/QW-ACT-R68.d.ts.map +1 -0
  207. package/dist/rules/QW-ACT-R68.js +117 -0
  208. package/dist/rules/QW-ACT-R69.d.ts +12 -0
  209. package/dist/rules/QW-ACT-R69.d.ts.map +1 -0
  210. package/dist/rules/QW-ACT-R69.js +94 -0
  211. package/dist/rules/QW-ACT-R7.d.ts +14 -0
  212. package/dist/rules/QW-ACT-R7.d.ts.map +1 -0
  213. package/dist/rules/QW-ACT-R7.js +167 -0
  214. package/dist/rules/QW-ACT-R70.d.ts +7 -0
  215. package/dist/rules/QW-ACT-R70.d.ts.map +1 -0
  216. package/dist/rules/QW-ACT-R70.js +52 -0
  217. package/dist/rules/QW-ACT-R71.d.ts +8 -0
  218. package/dist/rules/QW-ACT-R71.d.ts.map +1 -0
  219. package/dist/rules/QW-ACT-R71.js +81 -0
  220. package/dist/rules/QW-ACT-R73.d.ts +8 -0
  221. package/dist/rules/QW-ACT-R73.d.ts.map +1 -0
  222. package/dist/rules/QW-ACT-R73.js +60 -0
  223. package/dist/rules/QW-ACT-R74.d.ts +8 -0
  224. package/dist/rules/QW-ACT-R74.d.ts.map +1 -0
  225. package/dist/rules/QW-ACT-R74.js +80 -0
  226. package/dist/rules/QW-ACT-R75.d.ts +6 -0
  227. package/dist/rules/QW-ACT-R75.d.ts.map +1 -0
  228. package/dist/rules/QW-ACT-R75.js +27 -0
  229. package/dist/rules/QW-ACT-R76.d.ts +23 -0
  230. package/dist/rules/QW-ACT-R76.d.ts.map +1 -0
  231. package/dist/rules/QW-ACT-R76.js +336 -0
  232. package/dist/rules/QW-ACT-R77.d.ts +7 -0
  233. package/dist/rules/QW-ACT-R77.d.ts.map +1 -0
  234. package/dist/rules/QW-ACT-R77.js +53 -0
  235. package/dist/rules/QW-ACT-R9.d.ts +7 -0
  236. package/dist/rules/QW-ACT-R9.d.ts.map +1 -0
  237. package/dist/rules/QW-ACT-R9.js +87 -0
  238. package/dist/rules/index.d.ts +69 -0
  239. package/dist/rules/index.d.ts.map +1 -0
  240. package/dist/rules/index.js +84 -0
  241. package/package.json +30 -27
  242. 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"}