testilo 3.7.0 → 3.8.0

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 (2) hide show
  1. package/package.json +1 -1
  2. package/procs/score/sp12a.js +338 -46
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testilo",
3
- "version": "3.7.0",
3
+ "version": "3.8.0",
4
4
  "description": "Client that scores and digests Testaro reports",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -73,6 +73,10 @@ const groups = {
73
73
  'duplicate-id-active': {
74
74
  quality: 1,
75
75
  what: 'id attribute value of the active element is not unique'
76
+ },
77
+ 'duplicate-id-aria': {
78
+ quality: 1,
79
+ what: 'id attribute used in ARIA or in a label has a value that is not unique'
76
80
  }
77
81
  },
78
82
  htmlcs: {
@@ -89,6 +93,17 @@ const groups = {
89
93
  }
90
94
  }
91
95
  },
96
+ regionNoText: {
97
+ weight: 4,
98
+ packages: {
99
+ alfa: {
100
+ r40: {
101
+ quality: 1,
102
+ what: 'Region has no accessible name'
103
+ }
104
+ }
105
+ }
106
+ },
92
107
  formFieldNoText: {
93
108
  weight: 4,
94
109
  packages: {
@@ -118,9 +133,21 @@ const groups = {
118
133
  quality: 1,
119
134
  what: 'Email input has no accessible name'
120
135
  },
136
+ 'e:AA.4_1_2.H91.InputTel.Name': {
137
+ quality: 1,
138
+ what: 'Telephone input has no accessible name'
139
+ },
121
140
  'e:AA.4_1_2.H91.InputNumber.Name': {
122
141
  quality: 1,
123
142
  what: 'Number input has no accessible name'
143
+ },
144
+ 'e:AA.4_1_2.H91.InputSearch.Name': {
145
+ quality: 1,
146
+ what: 'Search input has no accessible name'
147
+ },
148
+ 'e:AA.4_1_2.H91.InputCheckbox.Name': {
149
+ quality: 1,
150
+ what: 'Checkbox input has no accessible name'
124
151
  }
125
152
  }
126
153
  }
@@ -137,7 +164,7 @@ const groups = {
137
164
  axe: {
138
165
  'input-image-alt': {
139
166
  quality: 1,
140
- what: 'Image buttons must have alternate text'
167
+ what: 'Image button has no text alternative'
141
168
  }
142
169
  },
143
170
  htmlcs: {
@@ -184,13 +211,17 @@ const groups = {
184
211
  ibm: {
185
212
  'v:WCAG20_Img_HasAlt': {
186
213
  quality: 1,
187
- what: 'Images must have an alt attribute if they convey meaning, or alt="" if decorative'
214
+ what: 'Image has no alt attribute conveying its meaning, or alt="" if decorative'
188
215
  }
189
216
  },
190
217
  wave: {
191
218
  'e:alt_missing': {
192
219
  quality: 1,
193
220
  what: 'Text alternative is missing'
221
+ },
222
+ 'e:alt_spacer_missing': {
223
+ quality: 1,
224
+ what: 'Spacer image has no text alternative'
194
225
  }
195
226
  }
196
227
  }
@@ -277,7 +308,7 @@ const groups = {
277
308
  axe: {
278
309
  'html-has-lang': {
279
310
  quality: 1,
280
- what: 'html element must have a lang attribute'
311
+ what: 'html element has no lang attribute'
281
312
  }
282
313
  },
283
314
  htmlcs: {
@@ -312,7 +343,13 @@ const groups = {
312
343
  axe: {
313
344
  'html-lang-valid': {
314
345
  quality: 1,
315
- what: 'html element must have a valid value for the lang attribute'
346
+ what: 'html element has no valid value for the lang attribute'
347
+ }
348
+ },
349
+ htmlcs: {
350
+ 'e:AA.3_1_1.H57.3.Lang': {
351
+ quality: 1,
352
+ what: 'Language specified in the lang attribute of the document does not appear to be well-formed'
316
353
  }
317
354
  },
318
355
  ibm: {
@@ -323,6 +360,17 @@ const groups = {
323
360
  }
324
361
  }
325
362
  },
363
+ elementLanguageBad: {
364
+ weight: 4,
365
+ packages: {
366
+ htmlcs: {
367
+ 'e:AA.3_1_2.H58.1.Lang': {
368
+ quality: 1,
369
+ what: 'Language specified in the lang attribute of the element does not appear to be well-formed'
370
+ }
371
+ }
372
+ }
373
+ },
326
374
  languageChange: {
327
375
  weight: 3,
328
376
  packages: {
@@ -335,7 +383,7 @@ const groups = {
335
383
  axe: {
336
384
  'valid-lang': {
337
385
  quality: 1,
338
- what: 'lang attribute must have a valid value'
386
+ what: 'lang attribute has no valid value'
339
387
  }
340
388
  },
341
389
  htmlcs: {
@@ -346,25 +394,36 @@ const groups = {
346
394
  }
347
395
  }
348
396
  },
397
+ dialogNoText: {
398
+ weight: 4,
399
+ packages: {
400
+ axe: {
401
+ 'aria-dialog-name': {
402
+ quality: 1,
403
+ what: 'ARIA dialog or alertdialog node has no accessible name'
404
+ }
405
+ }
406
+ }
407
+ },
349
408
  objectNoText: {
350
409
  weight: 4,
351
410
  packages: {
352
411
  axe: {
353
412
  'object-alt': {
354
413
  quality: 1,
355
- what: 'Object elements must have alternate text'
414
+ what: 'Object element has no text alternative'
356
415
  }
357
416
  },
358
417
  htmlcs: {
359
418
  'e:ARIA6+H53': {
360
419
  quality: 1,
361
- what: 'Object elements must contain a text alternative'
420
+ what: 'Object element contains no text alternative'
362
421
  }
363
422
  },
364
423
  ibm: {
365
424
  'v:WCAG20_Object_HasText': {
366
425
  quality: 1,
367
- what: 'Object elements must have a text alternative'
426
+ what: 'Object element has no text alternative'
368
427
  }
369
428
  },
370
429
  wave: {
@@ -381,7 +440,7 @@ const groups = {
381
440
  axe: {
382
441
  'area-alt': {
383
442
  quality: 1,
384
- what: 'Active area elements must have alternate text'
443
+ what: 'Active area elements has no text alternative'
385
444
  }
386
445
  },
387
446
  htmlcs: {
@@ -446,13 +505,32 @@ const groups = {
446
505
  }
447
506
  }
448
507
  },
449
- labelForBadID: {
508
+ labelForWrongRisk: {
509
+ weight: 1,
510
+ packages: {
511
+ htmlcs: {
512
+ 'w:AA.1_3_1.H44.NotFormControl': {
513
+ quality: 1,
514
+ what: 'Label for attribute may reference the wrong element, because it is not a form control'
515
+ }
516
+ }
517
+ }
518
+ },
519
+ labelBadID: {
450
520
  weight: 4,
451
521
  packages: {
452
522
  htmlcs: {
453
523
  'w:AA.1_3_1.H44.NonExistentFragment': {
454
524
  quality: 1,
455
525
  what: 'Label for attribute references a nonexistent element'
526
+ },
527
+ 'w:AA.1_3_1.ARIA16,ARIA9': {
528
+ quality: 1,
529
+ what: 'aria-labelledby attribute references a nonexistent element'
530
+ },
531
+ 'w:AA.4_1_2.ARIA16,ARIA9': {
532
+ quality: 1,
533
+ what: 'aria-labelledby attribute references a nonexistent element'
456
534
  }
457
535
  },
458
536
  wave: {
@@ -475,7 +553,7 @@ const groups = {
475
553
  axe: {
476
554
  'link-name': {
477
555
  quality: 1,
478
- what: 'Links must have discernible text'
556
+ what: 'Link has no discernible text'
479
557
  }
480
558
  },
481
559
  htmlcs: {
@@ -556,7 +634,7 @@ const groups = {
556
634
  htmlcs: {
557
635
  'w:AA.4_1_2.H91.A.NoHref': {
558
636
  quality: 1,
559
- what: 'Link misused as link destination'
637
+ what: 'Link is misused as a link destination'
560
638
  }
561
639
  }
562
640
  }
@@ -698,7 +776,7 @@ const groups = {
698
776
  axe: {
699
777
  'aria-required-parent': {
700
778
  quality: 1,
701
- what: 'Certain ARIA roles must be contained by particular parents'
779
+ what: 'ARIA role is not contained by a required parent'
702
780
  }
703
781
  }
704
782
  }
@@ -715,7 +793,7 @@ const groups = {
715
793
  axe: {
716
794
  'svg-img-alt': {
717
795
  quality: 1,
718
- what: 'SVG elements with an img role must have an alternative text'
796
+ what: 'SVG element with an img role has no text alternative'
719
797
  }
720
798
  }
721
799
  }
@@ -769,13 +847,13 @@ const groups = {
769
847
  alfa: {
770
848
  r68: {
771
849
  quality: 1,
772
- what: 'Element owns no elements as required by its semantic role'
850
+ what: 'Element does not own an element required by its semantic role'
773
851
  }
774
852
  },
775
853
  axe: {
776
854
  'aria-required-children': {
777
855
  quality: 1,
778
- what: 'Certain ARIA roles must contain particular children'
856
+ what: 'ARIA role does not contain a required child'
779
857
  }
780
858
  }
781
859
  }
@@ -797,7 +875,7 @@ const groups = {
797
875
  alfa: {
798
876
  r74: {
799
877
  quality: 1,
800
- what: 'Paragraph text has absolute font size'
878
+ what: 'Paragraph text has an absolute font size'
801
879
  }
802
880
  }
803
881
  }
@@ -805,6 +883,12 @@ const groups = {
805
883
  fontSmall: {
806
884
  weight: 3,
807
885
  packages: {
886
+ alfa: {
887
+ r75: {
888
+ quality: 1,
889
+ what: 'Font size is smaller than 9 pixels'
890
+ }
891
+ },
808
892
  tenon: {
809
893
  134: {
810
894
  quality: 1,
@@ -831,7 +915,7 @@ const groups = {
831
915
  axe: {
832
916
  'avoid-inline-spacing': {
833
917
  quality: 1,
834
- what: 'Inline text spacing must be adjustable with custom stylesheets'
918
+ what: 'Inline text spacing is not adjustable with a custom stylesheet'
835
919
  }
836
920
  }
837
921
  }
@@ -842,7 +926,7 @@ const groups = {
842
926
  alfa: {
843
927
  r80: {
844
928
  quality: 1,
845
- what: 'Paragraph text has absolute line height'
929
+ what: 'Paragraph text has an absolute line height'
846
930
  }
847
931
  }
848
932
  }
@@ -853,7 +937,7 @@ const groups = {
853
937
  alfa: {
854
938
  r73: {
855
939
  quality: 1,
856
- what: 'Paragraphs of text have insufficient line height'
940
+ what: 'Paragraph of text has insufficient line height'
857
941
  }
858
942
  }
859
943
  }
@@ -902,7 +986,7 @@ const groups = {
902
986
  htmlcs: {
903
987
  'e:AA.2_4_1.H64.1': {
904
988
  quality: 1,
905
- what: 'iframe element requires a non-empty title attribute'
989
+ what: 'iframe element has no non-empty title attribute'
906
990
  }
907
991
  },
908
992
  ibm: {
@@ -916,16 +1000,22 @@ const groups = {
916
1000
  roleBad: {
917
1001
  weight: 3,
918
1002
  packages: {
1003
+ alfa: {
1004
+ r21: {
1005
+ quality: 1,
1006
+ what: 'Element does not have a valid role'
1007
+ }
1008
+ },
919
1009
  axe: {
920
1010
  'aria-allowed-role': {
921
1011
  quality: 1,
922
- what: 'ARIA role should be appropriate for the element'
1012
+ what: 'ARIA role is not appropriate for the element'
923
1013
  }
924
1014
  },
925
1015
  ibm: {
926
1016
  'v:aria_semantics_role': {
927
1017
  quality: 1,
928
- what: 'ARIA roles must be valid for the element to which they are assigned'
1018
+ what: 'ARIA role is not valid for the element to which it is assigned'
929
1019
  }
930
1020
  },
931
1021
  testaro: {
@@ -942,13 +1032,13 @@ const groups = {
942
1032
  axe: {
943
1033
  'aria-required-attr': {
944
1034
  quality: 1,
945
- what: 'Required ARIA attributes must be provided'
1035
+ what: 'Required ARIA attribute is not provided'
946
1036
  }
947
1037
  },
948
1038
  ibm: {
949
1039
  'v:Rpt_Aria_RequiredProperties': {
950
1040
  quality: 1,
951
- what: 'ARIA role on an element must have required attributes'
1041
+ what: 'ARIA role on an element does not have a required attribute'
952
1042
  }
953
1043
  }
954
1044
  }
@@ -957,6 +1047,10 @@ const groups = {
957
1047
  weight: 4,
958
1048
  packages: {
959
1049
  alfa: {
1050
+ r18: {
1051
+ quality: 1,
1052
+ what: 'ARIA state or property is not allowed for the element on which it is specified'
1053
+ },
960
1054
  r19: {
961
1055
  quality: 1,
962
1056
  what: 'ARIA state or property has an invalid value'
@@ -994,7 +1088,7 @@ const groups = {
994
1088
  ibm: {
995
1089
  'v:Rpt_Aria_ValidIdRef': {
996
1090
  quality: 1,
997
- what: 'ARIA property must reference non-empty unique id of visible element'
1091
+ what: 'ARIA property does not reference the non-empty unique id of a visible element'
998
1092
  }
999
1093
  },
1000
1094
  wave: {
@@ -1028,7 +1122,7 @@ const groups = {
1028
1122
  axe: {
1029
1123
  'autocomplete-valid': {
1030
1124
  quality: 1,
1031
- what: 'Autocomplete attribute must be used correctly'
1125
+ what: 'Autocomplete attribute is used incorrectly'
1032
1126
  }
1033
1127
  },
1034
1128
  htmlcs: {
@@ -1040,7 +1134,18 @@ const groups = {
1040
1134
  ibm: {
1041
1135
  'v:WCAG21_Input_Autocomplete': {
1042
1136
  quality: 1,
1043
- what: 'Autocomplete attribute token(s) must be appropriate for the input form field'
1137
+ what: 'Autocomplete attribute token is not appropriate for the input form field'
1138
+ }
1139
+ }
1140
+ }
1141
+ },
1142
+ autocompleteRisk: {
1143
+ weight: 1,
1144
+ packages: {
1145
+ htmlcs: {
1146
+ 'w:AA.1_3_5.H98': {
1147
+ quality: 1,
1148
+ what: 'Element contains a potentially faulty value in its autocomplete attribute'
1044
1149
  }
1045
1150
  }
1046
1151
  }
@@ -1057,7 +1162,7 @@ const groups = {
1057
1162
  axe: {
1058
1163
  'color-contrast': {
1059
1164
  quality: 1,
1060
- what: 'Elements must have sufficient color contrast'
1165
+ what: 'Element has insufficient color contrast'
1061
1166
  }
1062
1167
  },
1063
1168
  htmlcs: {
@@ -1073,7 +1178,7 @@ const groups = {
1073
1178
  ibm: {
1074
1179
  'v:IBMA_Color_Contrast_WCAG2AA': {
1075
1180
  quality: 1,
1076
- what: 'Contrast ratio of text with background must meet WCAG 2.1 AA'
1181
+ what: 'Contrast ratio of text with background does not meet WCAG 2.1 AA'
1077
1182
  }
1078
1183
  },
1079
1184
  wave: {
@@ -1096,7 +1201,7 @@ const groups = {
1096
1201
  axe: {
1097
1202
  'color-contrast-enhanced': {
1098
1203
  quality: 1,
1099
- what: 'Elements must have sufficient color contrast (Level AAA)'
1204
+ what: 'Element has insufficient color contrast (Level AAA)'
1100
1205
  }
1101
1206
  },
1102
1207
  htmlcs: {
@@ -1176,7 +1281,7 @@ const groups = {
1176
1281
  ibm: {
1177
1282
  'v:RPT_Header_HasContent': {
1178
1283
  quality: 1,
1179
- what: 'Heading elements must provide descriptive text'
1284
+ what: 'Heading element provides no descriptive text'
1180
1285
  }
1181
1286
  },
1182
1287
  wave: {
@@ -1204,7 +1309,7 @@ const groups = {
1204
1309
  axe: {
1205
1310
  'image-redundant-alt': {
1206
1311
  quality: 1,
1207
- what: 'Text of buttons and links should not be repeated in the image alternative'
1312
+ what: 'Text of a button or link is repeated in the image alternative'
1208
1313
  }
1209
1314
  },
1210
1315
  ibm: {
@@ -1227,6 +1332,23 @@ const groups = {
1227
1332
  }
1228
1333
  }
1229
1334
  },
1335
+ decorativeTitle: {
1336
+ weight: 1,
1337
+ packages: {
1338
+ htmlcs: {
1339
+ 'e:AA.1_1_1.H67.1': {
1340
+ quality: 1,
1341
+ what: 'img element has an empty alt attribute but has a nonempty title attribute'
1342
+ }
1343
+ },
1344
+ wave: {
1345
+ 'a:image_title': {
1346
+ quality: 1,
1347
+ what: 'Image has a title attribute value but no alt value'
1348
+ }
1349
+ }
1350
+ }
1351
+ },
1230
1352
  titleRedundant: {
1231
1353
  weight: 1,
1232
1354
  packages: {
@@ -1262,10 +1384,22 @@ const groups = {
1262
1384
  pageTitle: {
1263
1385
  weight: 3,
1264
1386
  packages: {
1387
+ alfa: {
1388
+ r1: {
1389
+ quality: 1,
1390
+ what: 'Document has no valid title element'
1391
+ }
1392
+ },
1265
1393
  axe: {
1266
1394
  'document-title': {
1267
1395
  quality: 1,
1268
- what: 'Documents must contain a title element'
1396
+ what: 'Document contains no title element'
1397
+ }
1398
+ },
1399
+ htmlcs: {
1400
+ 'e:AA.2_4_2.H25.1.NoTitleEl': {
1401
+ quality: 1,
1402
+ what: 'Document head element contains no non-empty title element'
1269
1403
  }
1270
1404
  },
1271
1405
  wave: {
@@ -1288,7 +1422,7 @@ const groups = {
1288
1422
  axe: {
1289
1423
  'heading-order': {
1290
1424
  quality: 1,
1291
- what: 'Heading levels should only increase by one'
1425
+ what: 'Heading levels do not increase by only one'
1292
1426
  }
1293
1427
  },
1294
1428
  htmlcs: {
@@ -1300,7 +1434,7 @@ const groups = {
1300
1434
  tenon: {
1301
1435
  155: {
1302
1436
  quality: 1,
1303
- what: 'These headings are not structured in a hierarchical manner'
1437
+ what: 'Headings are not structured in a hierarchical manner'
1304
1438
  }
1305
1439
  },
1306
1440
  wave: {
@@ -1311,11 +1445,22 @@ const groups = {
1311
1445
  }
1312
1446
  }
1313
1447
  },
1448
+ noHeading: {
1449
+ weight: 3,
1450
+ packages: {
1451
+ alfa: {
1452
+ r59: {
1453
+ quality: 1,
1454
+ what: 'Document has no headings'
1455
+ }
1456
+ }
1457
+ }
1458
+ },
1314
1459
  h1Missing: {
1315
1460
  weight: 2,
1316
1461
  packages: {
1317
1462
  alfa: {
1318
- 'r61': {
1463
+ r61: {
1319
1464
  quality: 1,
1320
1465
  what: 'First heading is not h1'
1321
1466
  }
@@ -1323,7 +1468,7 @@ const groups = {
1323
1468
  axe: {
1324
1469
  'page-has-heading-one': {
1325
1470
  quality: 1,
1326
- what: 'Page should contain a level-one heading'
1471
+ what: 'Page contains no level-one heading'
1327
1472
  }
1328
1473
  },
1329
1474
  wave: {
@@ -1337,6 +1482,18 @@ const groups = {
1337
1482
  justification: {
1338
1483
  weight: 1,
1339
1484
  packages: {
1485
+ alfa: {
1486
+ r71: {
1487
+ quality: 1,
1488
+ what: 'Paragraph text is fully justified'
1489
+ }
1490
+ },
1491
+ tenon: {
1492
+ 36: {
1493
+ quality: 1,
1494
+ what: 'Text is fully justified'
1495
+ }
1496
+ },
1340
1497
  wave: {
1341
1498
  'a:text_justified': {
1342
1499
  quality: 1,
@@ -1349,13 +1506,29 @@ const groups = {
1349
1506
  weight: 2,
1350
1507
  packages: {
1351
1508
  htmlcs: {
1509
+ 'w:AA.1_3_1.H49.AlignAttr': {
1510
+ quality: 1,
1511
+ what: 'Special text is aligned nonsemantically'
1512
+ },
1352
1513
  'w:AA.1_3_1.H49.B': {
1353
1514
  quality: 1,
1354
- what: 'Bold text is coded nonsemantically'
1515
+ what: 'Special text is bolded nonsemantically'
1516
+ },
1517
+ 'w:AA.1_3_1.H49.I': {
1518
+ quality: 1,
1519
+ what: 'Special text is italicized nonsemantically'
1520
+ },
1521
+ 'w:AA.1_3_1.H49.Big': {
1522
+ quality: 1,
1523
+ what: 'Special text is enlarged nonsemantically'
1355
1524
  },
1356
1525
  'w:AA.1_3_1.H49.Small': {
1357
1526
  quality: 1,
1358
- what: 'Small text is coded nonsemantically'
1527
+ what: 'Special text is made small nonsemantically'
1528
+ },
1529
+ 'w:AA.1_3_1.H49.U': {
1530
+ quality: 1,
1531
+ what: 'Special text is underlined nonsemantically'
1359
1532
  }
1360
1533
  }
1361
1534
  }
@@ -1415,9 +1588,13 @@ const groups = {
1415
1588
  weight: 4,
1416
1589
  packages: {
1417
1590
  axe: {
1418
- 'list': {
1591
+ list: {
1419
1592
  quality: 1,
1420
1593
  what: 'List element ul or ol has a child element other than li, script, and template'
1594
+ },
1595
+ 'definition-list': {
1596
+ quality: 1,
1597
+ what: 'List element dl has a child element other than properly ordered dt and dt group, script, template, and div'
1421
1598
  }
1422
1599
  }
1423
1600
  }
@@ -1450,7 +1627,7 @@ const groups = {
1450
1627
  htmlcs: {
1451
1628
  'w:AA.1_3_1.H48': {
1452
1629
  quality: 1,
1453
- what: 'Navigation links should best be coded as a list'
1630
+ what: 'Navigation links are not coded as a list'
1454
1631
  }
1455
1632
  }
1456
1633
  }
@@ -1488,7 +1665,7 @@ const groups = {
1488
1665
  htmlcs: {
1489
1666
  'w:AA.1_3_1.H85.2': {
1490
1667
  quality: 1,
1491
- what: 'If selection list contains groups of related options, they should be grouped with optgroup'
1668
+ what: 'Selection list may contain groups of related options that are not grouped with optgroup'
1492
1669
  }
1493
1670
  }
1494
1671
  }
@@ -1499,7 +1676,7 @@ const groups = {
1499
1676
  ibm: {
1500
1677
  'v:WCAG20_Elem_UniqueAccessKey': {
1501
1678
  quality: 1,
1502
- what: 'Accesskey attribute values on each element must be unique for the page'
1679
+ what: 'Accesskey attribute value on an element is not unique for the page'
1503
1680
  }
1504
1681
  },
1505
1682
  wave: {
@@ -1533,6 +1710,17 @@ const groups = {
1533
1710
  }
1534
1711
  }
1535
1712
  },
1713
+ fieldSetRisk: {
1714
+ weight: 1,
1715
+ packages: {
1716
+ htmlcs: {
1717
+ 'w:AA.1_3_1.H71.SameName': {
1718
+ quality: 1,
1719
+ what: 'Radio buttons or check boxes may require a group description via a fieldset element'
1720
+ }
1721
+ }
1722
+ }
1723
+ },
1536
1724
  legendMissing: {
1537
1725
  weight: 2,
1538
1726
  packages: {
@@ -1600,9 +1788,37 @@ const groups = {
1600
1788
  }
1601
1789
  }
1602
1790
  },
1791
+ TableHeaderScopeRisk: {
1792
+ weight: 1,
1793
+ packages: {
1794
+ htmlcs: {
1795
+ 'e:AA.1_3_1.H63.1': {
1796
+ quality: 1,
1797
+ what: 'Not all th elements in the table have a scope attribute, so an inferred scope may be incorrect'
1798
+ }
1799
+ }
1800
+ }
1801
+ },
1802
+ tableHeaderEmpty: {
1803
+ weight: 2,
1804
+ packages: {
1805
+ wave: {
1806
+ 'e:th_empty': {
1807
+ quality: 1,
1808
+ what: 'th (table header) contains no text'
1809
+ }
1810
+ }
1811
+ }
1812
+ },
1603
1813
  controlLabel: {
1604
1814
  weight: 4,
1605
1815
  packages: {
1816
+ axe: {
1817
+ label: {
1818
+ quality: 1,
1819
+ what: 'Form element has no label'
1820
+ }
1821
+ },
1606
1822
  htmlcs: {
1607
1823
  'e:AA.1_3_1.F68': {
1608
1824
  quality: 1,
@@ -1738,6 +1954,12 @@ const groups = {
1738
1954
  allItalics: {
1739
1955
  weight: 1,
1740
1956
  packages: {
1957
+ alfa: {
1958
+ r85: {
1959
+ quality: 1,
1960
+ what: 'Text of the paragraph is all italic'
1961
+ }
1962
+ },
1741
1963
  tenon: {
1742
1964
  154: {
1743
1965
  quality: 1,
@@ -1746,6 +1968,17 @@ const groups = {
1746
1968
  }
1747
1969
  }
1748
1970
  },
1971
+ noLandmarks: {
1972
+ weight: 2,
1973
+ packages: {
1974
+ wave: {
1975
+ 'a:region_missing': {
1976
+ quality: 1,
1977
+ what: 'Page has no regions or ARIA landmarks'
1978
+ }
1979
+ }
1980
+ }
1981
+ },
1749
1982
  contentBeyondLandmarks: {
1750
1983
  weight: 2,
1751
1984
  packages: {
@@ -1897,6 +2130,17 @@ const groups = {
1897
2130
  }
1898
2131
  }
1899
2132
  },
2133
+ focusableDescendants: {
2134
+ weight: 4,
2135
+ packages: {
2136
+ alfa: {
2137
+ r90: {
2138
+ quality: 1,
2139
+ what: 'Element has a role making its children presentational but contains a focusable element'
2140
+ }
2141
+ }
2142
+ }
2143
+ },
1900
2144
  labeledHidden: {
1901
2145
  weight: 2,
1902
2146
  packages: {
@@ -1959,6 +2203,16 @@ const groups = {
1959
2203
  'w:AA.1_3_1.ARIA6': {
1960
2204
  quality: 1,
1961
2205
  what: 'Value of the aria-label attribute of the form control is empty or only whitespace'
2206
+ },
2207
+ 'w:AA.4_1_2.ARIA6': {
2208
+ quality: 1,
2209
+ what: 'Value of the aria-label attribute of the form control is empty or only whitespace'
2210
+ }
2211
+ },
2212
+ wave: {
2213
+ 'e:label_empty': {
2214
+ quality: 1,
2215
+ what: 'Empty form label'
1962
2216
  }
1963
2217
  }
1964
2218
  }
@@ -2019,6 +2273,17 @@ const groups = {
2019
2273
  }
2020
2274
  }
2021
2275
  },
2276
+ menuItemless: {
2277
+ weight: 4,
2278
+ packages: {
2279
+ wave: {
2280
+ 'e:aria_menu_broken': {
2281
+ quality: 1,
2282
+ what: 'ARIA menu does not contain required menu items'
2283
+ }
2284
+ }
2285
+ }
2286
+ },
2022
2287
  tabNavigation: {
2023
2288
  weight: 2,
2024
2289
  packages: {
@@ -2164,6 +2429,12 @@ const groups = {
2164
2429
  quality: 1,
2165
2430
  what: 'Skip-link target is not focusable or does not exist'
2166
2431
  }
2432
+ },
2433
+ wave: {
2434
+ 'e:link_skip_broken': {
2435
+ quality: 1,
2436
+ what: 'Skip-navigation link has no target or is not keyboard accessible'
2437
+ }
2167
2438
  }
2168
2439
  }
2169
2440
  },
@@ -2178,6 +2449,17 @@ const groups = {
2178
2449
  }
2179
2450
  }
2180
2451
  },
2452
+ fragmentaryNoticeRisk: {
2453
+ weight: 2,
2454
+ packages: {
2455
+ alfa: {
2456
+ r54: {
2457
+ quality: 1,
2458
+ what: 'Assertive region is not atomic'
2459
+ }
2460
+ }
2461
+ }
2462
+ },
2181
2463
  noScriptRisk: {
2182
2464
  weight: 1,
2183
2465
  packages: {
@@ -2201,19 +2483,29 @@ const groups = {
2201
2483
  htmlcs: {
2202
2484
  'e:AA.1_3_1.H49.Center': {
2203
2485
  quality: 1,
2204
- what: 'Element is obsolete'
2486
+ what: 'center element is obsolete'
2487
+ },
2488
+ 'e:AA.1_3_1.H49.Font': {
2489
+ quality: 1,
2490
+ what: 'font element is obsolete'
2205
2491
  }
2206
2492
  }
2207
2493
  }
2208
2494
  },
2209
2495
  obsoleteAttribute: {
2210
- weight: 1,
2496
+ weight: 3,
2211
2497
  packages: {
2212
2498
  htmlcs: {
2213
2499
  'e:AA.1_3_1.H49.AlignAttr': {
2214
2500
  quality: 1,
2215
2501
  what: 'The align attribute is obsolete'
2216
2502
  }
2503
+ },
2504
+ wave: {
2505
+ 'a:longdesc': {
2506
+ quality: 1,
2507
+ what: 'The longdesc attribute is obsolete'
2508
+ }
2217
2509
  }
2218
2510
  }
2219
2511
  }