testilo 41.5.0 → 41.5.2

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.
@@ -21,8 +21,8 @@
21
21
  */
22
22
 
23
23
  /*
24
- tic43
25
- Testilo issue classification 43
24
+ tic49
25
+ Testilo issue classification 49
26
26
 
27
27
  Classifies about 990 rules of the tools of Testaro into about 310 issues.
28
28
 
@@ -56,6 +56,11 @@ exports.issues = {
56
56
  quality: 0,
57
57
  what: 'Text has contrast less than 4.5:1 [speculative]'
58
58
  },
59
+ 'color_contrast_aaa': {
60
+ variable: false,
61
+ quality: 1,
62
+ what: 'Text contrast may be less than enhanced but the element is invisible [invalid]'
63
+ },
59
64
  css_images_convey_information: {
60
65
  variable: false,
61
66
  quality: 1,
@@ -212,7 +217,7 @@ exports.issues = {
212
217
  'QW-BP1': {
213
218
  variable: false,
214
219
  quality: 0,
215
- what: 'h1-h6 not used to identify headings [invalid]'
220
+ what: 'h1-h6 may fail to be used to identify headings [speculative]'
216
221
  },
217
222
  'QW-BP17': {
218
223
  variable: false,
@@ -273,6 +278,13 @@ exports.issues = {
273
278
  variable: false,
274
279
  quality: 0,
275
280
  what: 'No link at the top of the page goes directly to the main content area [invalid]'
281
+ },
282
+ qualWeb: {
283
+ 'QW-WCAG-T32': {
284
+ variable: false,
285
+ quality: 1,
286
+ what: 'ol, ul or dl may fail to be used for a list or group of links [speculative]'
287
+ }
276
288
  }
277
289
  }
278
290
  }
@@ -457,55 +469,15 @@ exports.issues = {
457
469
  }
458
470
  },
459
471
  htmlcs: {
460
- 'AAA.4_1_2.H91.InputText.Name': {
472
+ 'AAA.4_1_2.H91.Input.Name': {
461
473
  variable: false,
462
474
  quality: 1,
463
475
  what: 'Text input has no accessible name'
464
476
  },
465
- 'AAA.4_1_2.H91.InputEmail.Name': {
466
- variable: false,
467
- quality: 1,
468
- what: 'Email input has no accessible name'
469
- },
470
- 'AAA.4_1_2.H91.InputPhone.Name': {
471
- variable: false,
472
- quality: 1,
473
- what: 'Telephone input has no accessible name'
474
- },
475
- 'AAA.4_1_2.H91.InputFile.Name': {
476
- variable: false,
477
- quality: 1,
478
- what: 'File input element has no accessible name'
479
- },
480
- 'AAA.4_1_2.H91.InputTel.Name': {
481
- variable: false,
482
- quality: 1,
483
- what: 'Telephone input has no accessible name'
484
- },
485
- 'AAA.4_1_2.H91.InputNumber.Name': {
486
- variable: false,
487
- quality: 1,
488
- what: 'Number input has no accessible name'
489
- },
490
- 'AAA.4_1_2.H91.InputPassword.Name': {
491
- variable: false,
492
- quality: 1,
493
- what: 'Password input has no accessible name'
494
- },
495
- 'AAA.4_1_2.H91.InputSearch.Name': {
496
- variable: false,
497
- quality: 1,
498
- what: 'Search input has no accessible name'
499
- },
500
- 'AAA.4_1_2.H91.InputCheckbox.Name': {
501
- variable: false,
502
- quality: 1,
503
- what: 'Checkbox input has no accessible name'
504
- },
505
- 'AAA.4_1_2.H91.InputRadio.Name': {
506
- variable: false,
477
+ '^AAA.4_1_2.H91.Input[-a-zA-Z]+.Name$': {
478
+ variable: true,
507
479
  quality: 1,
508
- what: 'Radio input has no accessible name'
480
+ what: 'input element has no accessible name'
509
481
  }
510
482
  }
511
483
  }
@@ -710,6 +682,13 @@ exports.issues = {
710
682
  quality: 1,
711
683
  what: 'Spacer image has no text alternative'
712
684
  }
685
+ },
686
+ wax: {
687
+ 'Images must have alternate text': {
688
+ variable: false,
689
+ quality: 1,
690
+ what: 'Image has no text alternative'
691
+ }
713
692
  }
714
693
  }
715
694
  },
@@ -739,6 +718,26 @@ exports.issues = {
739
718
  variable: false,
740
719
  quality: 1,
741
720
  what: 'alt attribute of the element states the image is an image'
721
+ },
722
+ altImageOfLinked: {
723
+ variable: false,
724
+ quality: 1,
725
+ what: 'alt attribute of the intra-link element states the image is an image instead of describing the link purpose'
726
+ }
727
+ }
728
+ }
729
+ },
730
+ decorativeAlt: {
731
+ summary: 'decorative image is named',
732
+ why: 'User gets an uninformative image description or misses an informative image',
733
+ wcag: '1.1.1',
734
+ weight: 1,
735
+ tools: {
736
+ ibm: {
737
+ img_alt_decorative: {
738
+ variable: false,
739
+ quality: 1,
740
+ what: 'element is marked as an uninformative image but has an alt attribute'
742
741
  }
743
742
  }
744
743
  }
@@ -836,6 +835,66 @@ exports.issues = {
836
835
  }
837
836
  }
838
837
  },
838
+ borderBad: {
839
+ summary: 'CSS border invalid',
840
+ why: 'Border is displayed improperly',
841
+ wcag: '4.1',
842
+ weight: 4,
843
+ tools: {
844
+ nuVal: {
845
+ '^CSS: border-.+ negative values are not allowed.*$': {
846
+ variable: true,
847
+ quality: 1,
848
+ what: 'CSS border includes a negative-valued property'
849
+ }
850
+ }
851
+ }
852
+ },
853
+ flexBad: {
854
+ summary: 'CSS flex invalid',
855
+ why: 'Content is displayed improperly',
856
+ wcag: '4.1',
857
+ weight: 4,
858
+ tools: {
859
+ nuVal: {
860
+ '^CSS: flex: .+ negative values are not allowed.*$': {
861
+ variable: true,
862
+ quality: 1,
863
+ what: 'CSS flex value is negative'
864
+ }
865
+ }
866
+ }
867
+ },
868
+ paddingBad: {
869
+ summary: 'CSS padding invalid',
870
+ why: 'Content is displayed improperly',
871
+ wcag: '4.1',
872
+ weight: 4,
873
+ tools: {
874
+ nuVal: {
875
+ '^CSS: padding[-a-z]*: .+ negative values are not allowed\.$': {
876
+ variable: true,
877
+ quality: 1,
878
+ what: 'One of the CSS padding values is negative'
879
+ }
880
+ }
881
+ }
882
+ },
883
+ gapBad: {
884
+ summary: 'CSS padding invalid',
885
+ why: 'Content is displayed improperly',
886
+ wcag: '4.1',
887
+ weight: 4,
888
+ tools: {
889
+ nuVal: {
890
+ '^CSS: gap: .+ negative values are not allowed\.$': {
891
+ variable: true,
892
+ quality: 1,
893
+ what: 'CSS gap value is negative'
894
+ }
895
+ }
896
+ }
897
+ },
839
898
  backgroundBad: {
840
899
  summary: 'CSS background invalid',
841
900
  why: 'Background is displayed improperly',
@@ -857,7 +916,7 @@ exports.issues = {
857
916
  variable: true,
858
917
  quality: 1,
859
918
  what: 'CSS background URL is invalid'
860
- },
919
+ }
861
920
  }
862
921
  }
863
922
  },
@@ -1081,6 +1140,13 @@ exports.issues = {
1081
1140
  quality: 1,
1082
1141
  what: 'Language missing or invalid'
1083
1142
  }
1143
+ },
1144
+ wax: {
1145
+ '<html> element must have a lang attribute': {
1146
+ variable: false,
1147
+ quality: 1,
1148
+ what: 'html element has no lang attribute'
1149
+ }
1084
1150
  }
1085
1151
  }
1086
1152
  },
@@ -1119,6 +1185,13 @@ exports.issues = {
1119
1185
  what: 'Language specified in the lang attribute of the document does not appear to be well-formed'
1120
1186
  }
1121
1187
  },
1188
+ ibm: {
1189
+ html_lang_valid: {
1190
+ variable: false,
1191
+ quality: 1,
1192
+ what: 'lang attribute of the html element does not include a valid primary language'
1193
+ }
1194
+ },
1122
1195
  qualWeb: {
1123
1196
  'QW-ACT-R5': {
1124
1197
  variable: false,
@@ -1217,6 +1290,13 @@ exports.issues = {
1217
1290
  quality: 1,
1218
1291
  what: 'ARIA dialog or alertdialog node has no accessible name'
1219
1292
  }
1293
+ },
1294
+ wax: {
1295
+ 'ARIA dialog and alertdialog nodes should have an accessible name': {
1296
+ variable: false,
1297
+ quality: 1,
1298
+ what: 'Node is ARIA dialog or alertdialog but has no accessible name'
1299
+ }
1220
1300
  }
1221
1301
  }
1222
1302
  },
@@ -1245,6 +1325,11 @@ exports.issues = {
1245
1325
  variable: false,
1246
1326
  quality: 1,
1247
1327
  what: 'object element contains no text alternative'
1328
+ },
1329
+ 'AAA.1_1_1.H53,ARIA6': {
1330
+ variable: false,
1331
+ quality: 1,
1332
+ what: 'object element contains no text alternative after all other alternatives are exhausted'
1248
1333
  }
1249
1334
  },
1250
1335
  ibm: {
@@ -1286,7 +1371,7 @@ exports.issues = {
1286
1371
  }
1287
1372
  },
1288
1373
  objectAudioRisk: {
1289
- summary: 'non-audio element possibly plays audio',
1374
+ summary: 'non-audio element plays audio?',
1290
1375
  why: 'User may get inadequate help consuming audio content',
1291
1376
  wcag: '1.1.1',
1292
1377
  weight: 1,
@@ -1386,7 +1471,7 @@ exports.issues = {
1386
1471
  }
1387
1472
  },
1388
1473
  customKeyboardRisk: {
1389
- summary: 'custom button possibly keyboard-inoperable',
1474
+ summary: 'custom button keyboard-inoperable?',
1390
1475
  why: 'Custom item may prevent a keyboard-only user from operating it',
1391
1476
  wcag: '2.1.1',
1392
1477
  weight: 1,
@@ -1401,7 +1486,7 @@ exports.issues = {
1401
1486
  }
1402
1487
  },
1403
1488
  objectBlurKeyboardRisk: {
1404
- summary: 'object possibly not keyboard-blurrable',
1489
+ summary: 'object not keyboard-blurrable?',
1405
1490
  why: 'Custom item may trap a keyboard-only user',
1406
1491
  wcag: '2.1.1',
1407
1492
  weight: 1,
@@ -1416,7 +1501,7 @@ exports.issues = {
1416
1501
  }
1417
1502
  },
1418
1503
  eventKeyboardRisk: {
1419
- summary: 'event possibly not keyboard-triggerable',
1504
+ summary: 'event not keyboard-triggerable?',
1420
1505
  why: 'Keyboard-only user may be unable to perform an action',
1421
1506
  wcag: '2.1.1',
1422
1507
  weight: 1,
@@ -1458,7 +1543,7 @@ exports.issues = {
1458
1543
  wave: {
1459
1544
  event_handler: {
1460
1545
  variable: false,
1461
- quality: 1,
1546
+ quality: 0.5,
1462
1547
  what: 'Device-dependent event handler'
1463
1548
  }
1464
1549
  }
@@ -1892,7 +1977,14 @@ exports.issues = {
1892
1977
  variable: false,
1893
1978
  quality: 1,
1894
1979
  what: 'Linked image has no text alternative'
1895
- },
1980
+ }
1981
+ },
1982
+ wax: {
1983
+ 'Links must have discernible text': {
1984
+ variable: false,
1985
+ quality: 1,
1986
+ what: 'Link has no discernible text'
1987
+ }
1896
1988
  }
1897
1989
  }
1898
1990
  },
@@ -1929,6 +2021,11 @@ exports.issues = {
1929
2021
  variable: false,
1930
2022
  quality: 1,
1931
2023
  what: 'link element has an empty href attribute'
2024
+ },
2025
+ 'Attribute href without an explicit value seen. The attribute may be dropped by IE7.': {
2026
+ variable: false,
2027
+ quality: 1,
2028
+ what: 'Element has an empty href attribute'
1932
2029
  }
1933
2030
  }
1934
2031
  }
@@ -2231,7 +2328,7 @@ exports.issues = {
2231
2328
  }
2232
2329
  },
2233
2330
  newTabSurpriseRisk: {
2234
- summary: 'tab-opening link action possibly unstated',
2331
+ summary: 'tab-opening link action unstated?',
2235
2332
  why: 'Following a link opens a new window, possibly surprising a user',
2236
2333
  wcag: '3.2.5',
2237
2334
  weight: 1,
@@ -2265,7 +2362,7 @@ exports.issues = {
2265
2362
  }
2266
2363
  },
2267
2364
  selectNavSurpriseRisk: {
2268
- summary: 'navigating selection-change action possibly unstated',
2365
+ summary: 'navigating selection-change action unstated?',
2269
2366
  why: 'Changing a selected option opens a new window, possibly surprising a user',
2270
2367
  wcag: '3.2.5',
2271
2368
  weight: 1,
@@ -2294,6 +2391,31 @@ exports.issues = {
2294
2391
  }
2295
2392
  }
2296
2393
  },
2394
+ selectBad: {
2395
+ summary: 'select element invalid',
2396
+ why: 'User cannot properly select among options',
2397
+ wcag: '4.1.2',
2398
+ weight: 4,
2399
+ tools: {
2400
+ nuVal: {
2401
+ 'The document role is not allowed for element select without a multiple attribute and without a size attribute whose value is greater than 1.': {
2402
+ variable: false,
2403
+ quality: 1,
2404
+ what: 'select element is not multiple or has no size greater than 1 but has a document role'
2405
+ },
2406
+ 'The first child option element of a select element with a required attribute, and without a multiple attribute, and without a size attribute whose value is greater than 1, must have either an empty value attribute, or must have no text content. Consider either adding a placeholder option label, or adding a size attribute with a value equal to the number of option elements.': {
2407
+ variable: false,
2408
+ quality: 1,
2409
+ what: 'option element has a nonempty value'
2410
+ },
2411
+ 'The select element cannot have more than one selected option descendant unless the multiple attribute is specified.': {
2412
+ variable: false,
2413
+ quality: 1,
2414
+ what: 'Element is select and has no multiple attribute, but has more than 1 selected option'
2415
+ }
2416
+ }
2417
+ }
2418
+ },
2297
2419
  buttonAlt: {
2298
2420
  summary: 'button has alt',
2299
2421
  why: 'User cannot get help explaing a button',
@@ -2319,14 +2441,14 @@ exports.issues = {
2319
2441
  r12: {
2320
2442
  variable: false,
2321
2443
  quality: 1,
2322
- what: 'Button has no accessible name'
2444
+ what: 'button element has no accessible name'
2323
2445
  }
2324
2446
  },
2325
2447
  aslint: {
2326
2448
  empty_button_description: {
2327
2449
  variable: false,
2328
2450
  quality: 1,
2329
- what: 'Button has no visible accessible name'
2451
+ what: 'button element has no visible accessible name'
2330
2452
  }
2331
2453
  },
2332
2454
  axe: {
@@ -2338,7 +2460,7 @@ exports.issues = {
2338
2460
  'button-name': {
2339
2461
  variable: false,
2340
2462
  quality: 1,
2341
- what: 'Button has no discernible text'
2463
+ what: 'button element has no discernible text'
2342
2464
  },
2343
2465
  'input-button-name': {
2344
2466
  variable: false,
@@ -2360,7 +2482,7 @@ exports.issues = {
2360
2482
  'AAA.4_1_2.H91.Button.Name': {
2361
2483
  variable: false,
2362
2484
  quality: 1,
2363
- what: 'Button element has no accessible name'
2485
+ what: 'button element has no accessible name'
2364
2486
  },
2365
2487
  'AAA.4_1_2.H91.Img.Name': {
2366
2488
  variable: false,
@@ -2389,14 +2511,26 @@ exports.issues = {
2389
2511
  'QW-ACT-R11': {
2390
2512
  variable: false,
2391
2513
  quality: 1,
2392
- what: 'Button has no accessible name'
2514
+ what: 'button element has no accessible name'
2393
2515
  }
2394
2516
  },
2395
2517
  wave: {
2396
2518
  button_empty: {
2397
2519
  variable: false,
2398
2520
  quality: 1,
2399
- what: 'Button is empty or has no value text'
2521
+ what: 'button element is empty or has no value text'
2522
+ }
2523
+ },
2524
+ wax: {
2525
+ 'Buttons must have discernible text': {
2526
+ variable: false,
2527
+ quality: 1,
2528
+ what: 'button element has no discernible text'
2529
+ },
2530
+ 'Input buttons must have discernible text': {
2531
+ variable: false,
2532
+ quality: 1,
2533
+ what: 'input element with button type has no discernible text'
2400
2534
  }
2401
2535
  }
2402
2536
  }
@@ -2456,6 +2590,13 @@ exports.issues = {
2456
2590
  quality: 1,
2457
2591
  what: 'Element has no ARIA required context role'
2458
2592
  }
2593
+ },
2594
+ wax: {
2595
+ 'Certain ARIA roles must be contained by particular parents': {
2596
+ variable: false,
2597
+ quality: 1,
2598
+ what: 'ARIA role is not contained by a required parent'
2599
+ }
2459
2600
  }
2460
2601
  }
2461
2602
  },
@@ -2485,6 +2626,13 @@ exports.issues = {
2485
2626
  quality: 1,
2486
2627
  what: 'Element has no ARIA required owned element'
2487
2628
  }
2629
+ },
2630
+ wax: {
2631
+ 'Certain ARIA roles must contain particular children': {
2632
+ variable: false,
2633
+ quality: 1,
2634
+ what: 'ARIA role does not contain a required child'
2635
+ }
2488
2636
  }
2489
2637
  }
2490
2638
  },
@@ -2527,7 +2675,7 @@ exports.issues = {
2527
2675
  'svg-img-alt': {
2528
2676
  variable: false,
2529
2677
  quality: 1,
2530
- what: 'Element with an img role has no text alternative'
2678
+ what: 'Element is svg and has an img role but has no text alternative'
2531
2679
  }
2532
2680
  },
2533
2681
  qualWeb: {
@@ -2536,6 +2684,13 @@ exports.issues = {
2536
2684
  quality: 1,
2537
2685
  what: 'Element with an explicit role has no accessible name'
2538
2686
  }
2687
+ },
2688
+ wax: {
2689
+ '<svg> elements with an img role must have an alternative text': {
2690
+ variable: false,
2691
+ quality: 1,
2692
+ what: 'Element is svg and has an img role but has no text alternative'
2693
+ }
2539
2694
  }
2540
2695
  }
2541
2696
  },
@@ -2653,6 +2808,13 @@ exports.issues = {
2653
2808
  quality: 1,
2654
2809
  what: 'meta viewport prevents zoom'
2655
2810
  }
2811
+ },
2812
+ wax: {
2813
+ 'Zooming and scaling must not be disabled': {
2814
+ variable: false,
2815
+ quality: 1,
2816
+ what: 'Element disables zooming or scaling'
2817
+ }
2656
2818
  }
2657
2819
  }
2658
2820
  },
@@ -2714,17 +2876,17 @@ exports.issues = {
2714
2876
  }
2715
2877
  }
2716
2878
  },
2717
- textSpacingFrozen: {
2718
- summary: 'text spacing frozen',
2719
- why: 'User cannot adjust the text spacing for readability',
2879
+ horizontalSpacingFrozen: {
2880
+ summary: 'horizontal text spacing frozen',
2881
+ why: 'User cannot adjust the horizontal text spacing for readability',
2720
2882
  wcag: '1.4.12',
2721
2883
  weight: 4,
2722
2884
  tools: {
2723
2885
  alfa: {
2724
- r93: {
2886
+ r91: {
2725
2887
  variable: false,
2726
2888
  quality: 1,
2727
- what: 'Style attribute with !important prevents adjusting line height'
2889
+ what: 'Style attribute with !important makes letter spacing insufficient'
2728
2890
  }
2729
2891
  },
2730
2892
  axe: {
@@ -2734,17 +2896,19 @@ exports.issues = {
2734
2896
  what: 'Inline text spacing is not adjustable with a custom stylesheet'
2735
2897
  }
2736
2898
  },
2899
+ ibm: {
2900
+ text_spacing_valid: {
2901
+ variable: false,
2902
+ quality: 1,
2903
+ what: 'CSS !important is used in an inline letter-spacing style'
2904
+ }
2905
+ },
2737
2906
  qualWeb: {
2738
2907
  'QW-ACT-R67': {
2739
2908
  variable: false,
2740
2909
  quality: 1,
2741
2910
  what: 'Letter spacing in a style attribute is !important'
2742
2911
  },
2743
- 'QW-ACT-R68': {
2744
- variable: false,
2745
- quality: 1,
2746
- what: 'Line height in a style attribute is !important'
2747
- },
2748
2912
  'QW-ACT-R69': {
2749
2913
  variable: false,
2750
2914
  quality: 1,
@@ -2753,6 +2917,28 @@ exports.issues = {
2753
2917
  }
2754
2918
  }
2755
2919
  },
2920
+ verticalSpacingFrozen: {
2921
+ summary: 'vertical text spacing frozen',
2922
+ why: 'User cannot adjust the vertical text spacing for readability',
2923
+ wcag: '1.4.12',
2924
+ weight: 4,
2925
+ tools: {
2926
+ alfa: {
2927
+ r93: {
2928
+ variable: false,
2929
+ quality: 1,
2930
+ what: 'Style attribute with !important prevents adjusting line height'
2931
+ }
2932
+ },
2933
+ qualWeb: {
2934
+ 'QW-ACT-R68': {
2935
+ variable: false,
2936
+ quality: 1,
2937
+ what: 'Line height in a style attribute is !important'
2938
+ }
2939
+ }
2940
+ }
2941
+ },
2756
2942
  lineHeightAbsolute: {
2757
2943
  summary: 'line height absolute',
2758
2944
  why: 'User cannot adjust the line height of text for readability',
@@ -2790,6 +2976,21 @@ exports.issues = {
2790
2976
  }
2791
2977
  }
2792
2978
  },
2979
+ lineHeightBad: {
2980
+ summary: 'line height misdefined',
2981
+ why: 'Text is difficult to read',
2982
+ wcag: '1.4.8',
2983
+ weight: 4,
2984
+ tools: {
2985
+ nuVal: {
2986
+ '^CSS: line-height: .* negative values are not allowed.*$': {
2987
+ variable: true,
2988
+ quality: 1,
2989
+ what: 'Text line height is negative'
2990
+ }
2991
+ }
2992
+ }
2993
+ },
2793
2994
  overflowHidden: {
2794
2995
  summary: 'overflow hidden',
2795
2996
  why: 'User cannot enlarge the text for readability',
@@ -2806,7 +3007,7 @@ exports.issues = {
2806
3007
  }
2807
3008
  },
2808
3009
  overflowHiddenRisk: {
2809
- summary: 'overflow possibly hidden',
3010
+ summary: 'overflow hidden?',
2810
3011
  why: 'User may be unable to enlarge the text for readability',
2811
3012
  wcag: '1.4.4',
2812
3013
  weight: 1,
@@ -2840,6 +3041,21 @@ exports.issues = {
2840
3041
  }
2841
3042
  }
2842
3043
  },
3044
+ elementBad: {
3045
+ summary: 'nonexistent element',
3046
+ why: 'User cannot understand the content',
3047
+ wcag: '4.1.2',
3048
+ weight: 4,
3049
+ tools: {
3050
+ nuVal: {
3051
+ '^Saw a start tag [a-z]+\.$': {
3052
+ variable: true,
3053
+ quality: 1,
3054
+ what: 'Element does not exist in HTML'
3055
+ }
3056
+ }
3057
+ }
3058
+ },
2843
3059
  titleBad: {
2844
3060
  summary: 'title attribute invalid',
2845
3061
  why: 'User cannot hover to get help explaining an item',
@@ -2962,12 +3178,17 @@ exports.issues = {
2962
3178
  'Element script must not have attribute defer unless attribute src is also specified.': {
2963
3179
  variable: false,
2964
3180
  quality: 1,
2965
- what: 'script element has a defer attribute without a src attribute'
3181
+ what: 'Element is script and has a defer attribute but no src attribute'
3182
+ },
3183
+ 'Element script should not have attribute fetchpriority unless attribute src is also specified.': {
3184
+ variable: false,
3185
+ quality: 1,
3186
+ what: 'Element is script and has a fetchpriority attribute but no src attribute'
2966
3187
  },
2967
3188
  'A script element with a src attribute must not have a type attribute whose value is anything other than the empty string, a JavaScript MIME type, or module.': {
2968
3189
  variable: false,
2969
3190
  quality: 1,
2970
- what: 'script element has a src attribute but its type is not empty, a JS MIME type, or module'
3191
+ what: 'Element is script and has a src attribute but its type is not empty, a JS MIME type, or module'
2971
3192
  }
2972
3193
  }
2973
3194
  }
@@ -3059,6 +3280,13 @@ exports.issues = {
3059
3280
  quality: 1,
3060
3281
  what: 'iframe element has no accessible name'
3061
3282
  }
3283
+ },
3284
+ wax: {
3285
+ 'Frames must have an accessible name': {
3286
+ variable: false,
3287
+ quality: 1,
3288
+ what: 'iframe element has no accessible name'
3289
+ }
3062
3290
  }
3063
3291
  }
3064
3292
  },
@@ -3144,6 +3372,11 @@ exports.issues = {
3144
3372
  variable: false,
3145
3373
  quality: 1,
3146
3374
  what: 'Element has an event handler but no valid ARIA role'
3375
+ },
3376
+ combobox_haspopup_valid: {
3377
+ variable: false,
3378
+ quality: 1,
3379
+ what: 'Element has a combobox role but controls an element that has no listbox, grid, tree, or dialog role'
3147
3380
  }
3148
3381
  },
3149
3382
  nuVal: {
@@ -3173,7 +3406,7 @@ exports.issues = {
3173
3406
  }
3174
3407
  },
3175
3408
  roleHierarchyBad: {
3176
- summary: 'ancestor and descendant elements have incompatible roles',
3409
+ summary: 'ancestor and descendant roles incompatible',
3177
3410
  why: 'User may misunderstand or be blocked from exposure to an item',
3178
3411
  wcag: '4.1.2',
3179
3412
  weight: 4,
@@ -3369,7 +3602,14 @@ exports.issues = {
3369
3602
  quality: 1,
3370
3603
  what: 'Element with a srcset attribute with a width has no valid sizes attribute'
3371
3604
  }
3372
- }
3605
+ },
3606
+ wax: {
3607
+ 'Elements must only use allowed ARIA attributes': {
3608
+ variable: false,
3609
+ quality: 1,
3610
+ what: 'Element has an attribute that is not allowed'
3611
+ }
3612
+ },
3373
3613
  }
3374
3614
  },
3375
3615
  attributeValueBad: {
@@ -3479,7 +3719,7 @@ exports.issues = {
3479
3719
  }
3480
3720
  },
3481
3721
  roleMissingRisk: {
3482
- summary: 'role possibly missing',
3722
+ summary: 'role missing?',
3483
3723
  why: 'Item may behave improperly',
3484
3724
  wcag: '4.1.2',
3485
3725
  weight: 1,
@@ -3523,7 +3763,7 @@ exports.issues = {
3523
3763
  }
3524
3764
  },
3525
3765
  ariaMissingRisk: {
3526
- summary: 'aria attribute possibly missing',
3766
+ summary: 'aria attribute missing?',
3527
3767
  why: 'Item may behave improperly',
3528
3768
  wcag: '4.1.2',
3529
3769
  weight: 2,
@@ -3586,7 +3826,7 @@ exports.issues = {
3586
3826
  aria_semantics_attribute: {
3587
3827
  variable: false,
3588
3828
  quality: 1,
3589
- what: 'ARIA attributes is invalid for the element or ARIA role to which it is assigned'
3829
+ what: 'ARIA attribute is invalid for the element or ARIA role to which it is assigned'
3590
3830
  },
3591
3831
  Rpt_Aria_ValidProperty: {
3592
3832
  variable: false,
@@ -3688,6 +3928,11 @@ exports.issues = {
3688
3928
  variable: true,
3689
3929
  quality: 1,
3690
3930
  what: 'ARIA attribute is redundant with the synonymous native attribute'
3931
+ },
3932
+ 'The aria-valuemax attribute must not be used on an element which has a max attribute.': {
3933
+ variable: false,
3934
+ quality: 1,
3935
+ what: 'Element has the max attribute but also the aria-valuemax attribute'
3691
3936
  }
3692
3937
  }
3693
3938
  }
@@ -3924,7 +4169,7 @@ exports.issues = {
3924
4169
  }
3925
4170
  },
3926
4171
  colorNamedRisk: {
3927
- summary: 'color perception possibly required',
4172
+ summary: 'color perception required?',
3928
4173
  why: 'Content is impossible to perceive under some conditions',
3929
4174
  wcag: '1.4.1',
3930
4175
  weight: 1,
@@ -3952,11 +4197,6 @@ exports.issues = {
3952
4197
  }
3953
4198
  },
3954
4199
  aslint: {
3955
- 'color_contrast_aaa': {
3956
- variable: false,
3957
- quality: 1,
3958
- what: 'Text contrast may be less than enhanced but the element is invisible'
3959
- },
3960
4200
  'color_contrast_aaa4': {
3961
4201
  variable: false,
3962
4202
  quality: 1,
@@ -4125,6 +4365,21 @@ exports.issues = {
4125
4365
  }
4126
4366
  }
4127
4367
  },
4368
+ headingsEmbedded: {
4369
+ summary: 'heading within a heading',
4370
+ why: 'User cannot understand the page organization',
4371
+ wcag: '4.1.2',
4372
+ weight: 4,
4373
+ tools: {
4374
+ nuVal: {
4375
+ 'Heading cannot be a child of another heading.': {
4376
+ variable: false,
4377
+ quality: 1,
4378
+ what: 'Heading is within a heading'
4379
+ }
4380
+ }
4381
+ }
4382
+ },
4128
4383
  headingEmpty: {
4129
4384
  summary: 'heading empty',
4130
4385
  why: 'User cannot get help on the topic of a part of the document',
@@ -4517,6 +4772,13 @@ exports.issues = {
4517
4772
  quality: 1,
4518
4773
  what: 'HTML page has no title'
4519
4774
  }
4775
+ },
4776
+ wax: {
4777
+ 'Documents must have <title> element to aid in navigation': {
4778
+ variable: false,
4779
+ quality: 1,
4780
+ what: 'Document contains no title element'
4781
+ }
4520
4782
  }
4521
4783
  }
4522
4784
  },
@@ -4575,6 +4837,13 @@ exports.issues = {
4575
4837
  quality: 1,
4576
4838
  what: 'Skipped heading level'
4577
4839
  }
4840
+ },
4841
+ wax: {
4842
+ 'Heading levels should only increase by one': {
4843
+ variable: false,
4844
+ quality: 1,
4845
+ what: 'Heading levels do not increase by only one'
4846
+ }
4578
4847
  }
4579
4848
  }
4580
4849
  },
@@ -4785,7 +5054,7 @@ exports.issues = {
4785
5054
  }
4786
5055
  },
4787
5056
  justificationRisk: {
4788
- summary: 'justification possibly undefined',
5057
+ summary: 'justification undefined?',
4789
5058
  why: 'Text may be difficult to read',
4790
5059
  wcag: '1.4.8',
4791
5060
  weight: 1,
@@ -4970,12 +5239,26 @@ exports.issues = {
4970
5239
  what: 'List element dl has a child element other than properly ordered dt or dt group, script, template, or div'
4971
5240
  }
4972
5241
  },
5242
+ ibm: {
5243
+ list_children_valid: {
5244
+ variable: false,
5245
+ quality: 1,
5246
+ what: 'Element has a group role but has a child whose role is not listitem'
5247
+ }
5248
+ },
4973
5249
  nuVal: {
4974
5250
  'Element dl is missing a required child element.': {
4975
5251
  variable: false,
4976
5252
  quality: 1,
4977
5253
  what: 'dl element has no child element'
4978
5254
  }
5255
+ },
5256
+ wax: {
5257
+ '<ul> and <ol> must only directly contain <li>, <script> or <template> elements': {
5258
+ variable: false,
5259
+ quality: 1,
5260
+ what: 'Element is ul or ol but directly contains an element other than li, script, or template'
5261
+ }
4979
5262
  }
4980
5263
  }
4981
5264
  },
@@ -4991,6 +5274,13 @@ exports.issues = {
4991
5274
  quality: 1,
4992
5275
  what: 'Element is not contained by a ul or ol element'
4993
5276
  }
5277
+ },
5278
+ wax: {
5279
+ '<li> elements must be contained in a <ul> or <ol>': {
5280
+ variable: false,
5281
+ quality: 1,
5282
+ what: 'Element is li but is not contained by a ul or ol element'
5283
+ }
4994
5284
  }
4995
5285
  }
4996
5286
  },
@@ -5040,7 +5330,7 @@ exports.issues = {
5040
5330
  }
5041
5331
  },
5042
5332
  pseudoListRisk: {
5043
- summary: 'list possibly not marked as such',
5333
+ summary: 'list not marked as such?',
5044
5334
  why: 'User may be unable to get help on which items are in lists',
5045
5335
  wcag: '1.3.1',
5046
5336
  weight: 1,
@@ -5095,13 +5385,6 @@ exports.issues = {
5095
5385
  quality: 1,
5096
5386
  what: 'Navigation links are not coded as a list'
5097
5387
  }
5098
- },
5099
- qualWeb: {
5100
- 'QW-WCAG-T32': {
5101
- variable: false,
5102
- quality: 1,
5103
- what: 'ol, ul or dl is not used for a list or group of links'
5104
- }
5105
5388
  }
5106
5389
  }
5107
5390
  },
@@ -5136,6 +5419,13 @@ exports.issues = {
5136
5419
  quality: 1,
5137
5420
  what: 'Select element has no label'
5138
5421
  }
5422
+ },
5423
+ wax: {
5424
+ 'Select element must have an accessible name': {
5425
+ variable: false,
5426
+ quality: 1,
5427
+ what: 'select element has no accessible name'
5428
+ }
5139
5429
  }
5140
5430
  }
5141
5431
  },
@@ -5155,7 +5445,7 @@ exports.issues = {
5155
5445
  }
5156
5446
  },
5157
5447
  selectFlatRisk: {
5158
- summary: 'option groups possibly not marked',
5448
+ summary: 'option groups not marked?',
5159
5449
  why: 'User may be unable to get help recognizing groups of options',
5160
5450
  wcag: '1.3.1',
5161
5451
  weight: 1,
@@ -5236,7 +5526,7 @@ exports.issues = {
5236
5526
  }
5237
5527
  },
5238
5528
  fieldSetRisk: {
5239
- summary: 'fieldset possibly missing',
5529
+ summary: 'fieldset missing?',
5240
5530
  why: 'User may be unable to get help recognizing a group of related form items',
5241
5531
  wcag: '1.3.1',
5242
5532
  weight: 1,
@@ -5419,6 +5709,11 @@ exports.issues = {
5419
5709
  variable: true,
5420
5710
  quality: 1,
5421
5711
  what: 'Table row has a column count larger than that of the first row'
5712
+ },
5713
+ '^Table column \d+ established by element td has no cells beginning in it\.$': {
5714
+ variable: true,
5715
+ quality: 1,
5716
+ what: 'Element is td but the prior cells in its table column do not exist'
5422
5717
  }
5423
5718
  }
5424
5719
  }
@@ -5461,6 +5756,13 @@ exports.issues = {
5461
5756
  quality: 1,
5462
5757
  what: 'caption element not used to associate a caption with a data table'
5463
5758
  }
5759
+ },
5760
+ wave: {
5761
+ table_caption_possible: {
5762
+ variable: false,
5763
+ quality: 1,
5764
+ what: 'table cell apparently misused as the table caption'
5765
+ }
5464
5766
  }
5465
5767
  }
5466
5768
  },
@@ -5561,6 +5863,13 @@ exports.issues = {
5561
5863
  quality: 1,
5562
5864
  what: 'Complex table is missing headers attributes of cells'
5563
5865
  }
5866
+ },
5867
+ ibm: {
5868
+ table_headers_related: {
5869
+ variable: false,
5870
+ quality: 1,
5871
+ what: 'Element is a cell in a complex table but has no headers associated with headers or scope attributes'
5872
+ }
5564
5873
  }
5565
5874
  }
5566
5875
  },
@@ -5580,7 +5889,7 @@ exports.issues = {
5580
5889
  }
5581
5890
  },
5582
5891
  cellHeadersAmbiguityRisk: {
5583
- summary: 'cell headers possibly ambiguous',
5892
+ summary: 'cell headers ambiguous?',
5584
5893
  why: 'User may be unable to get help on relationships in a table',
5585
5894
  wcag: '1.3.1',
5586
5895
  weight: 2,
@@ -5692,7 +6001,7 @@ exports.issues = {
5692
6001
  }
5693
6002
  },
5694
6003
  TableHeaderScopeRisk: {
5695
- summary: 'Table scope possibly ambiguous',
6004
+ summary: 'Table scope ambiguous?',
5696
6005
  why: 'User may be unable to get help on relationships in a table',
5697
6006
  wcag: '1.3.1',
5698
6007
  weight: 1,
@@ -5712,6 +6021,13 @@ exports.issues = {
5712
6021
  wcag: '1.3.1',
5713
6022
  weight: 2,
5714
6023
  tools: {
6024
+ axe: {
6025
+ 'empty-table-header': {
6026
+ variable: false,
6027
+ quality: 1,
6028
+ what: 'Element is a table header but has no text'
6029
+ }
6030
+ },
5715
6031
  ed11y: {
5716
6032
  tableEmptyHeaderCell: {
5717
6033
  variable: false,
@@ -5773,6 +6089,51 @@ exports.issues = {
5773
6089
  }
5774
6090
  }
5775
6091
  },
6092
+ divInTable: {
6093
+ summary: 'div embedded in table',
6094
+ why: 'Blocks of content within a table cell may confuse a user',
6095
+ wcag: '1.4',
6096
+ weight: 1,
6097
+ tools: {
6098
+ nuVal: {
6099
+ 'Start tag div seen in table.': {
6100
+ variable: false,
6101
+ quality: 1,
6102
+ what: 'div element is inside a table element'
6103
+ }
6104
+ }
6105
+ }
6106
+ },
6107
+ formInTable: {
6108
+ summary: 'form embedded in table',
6109
+ why: 'Navigation in a form may confuse a keyboard-only user',
6110
+ wcag: '2.1.1',
6111
+ weight: 1,
6112
+ tools: {
6113
+ nuVal: {
6114
+ 'Start tag form seen in table.': {
6115
+ variable: false,
6116
+ quality: 1,
6117
+ what: 'form element is inside a table element'
6118
+ }
6119
+ }
6120
+ }
6121
+ },
6122
+ inputInTable: {
6123
+ summary: 'input embedded in table',
6124
+ why: 'Entry of data in a form may confuse a keyboard-only user',
6125
+ wcag: '2.1.1',
6126
+ weight: 1,
6127
+ tools: {
6128
+ nuVal: {
6129
+ 'Start tag input seen in table.': {
6130
+ variable: false,
6131
+ quality: 1,
6132
+ what: 'input element is inside a table element'
6133
+ }
6134
+ }
6135
+ }
6136
+ },
5776
6137
  tableHeading: {
5777
6138
  summary: 'heading located in table',
5778
6139
  why: 'Complex relationships in a table may confuse a user',
@@ -5835,6 +6196,13 @@ exports.issues = {
5835
6196
  quality: 1,
5836
6197
  what: 'form element has no label'
5837
6198
  }
6199
+ },
6200
+ wax: {
6201
+ 'Form elements must have labels': {
6202
+ variable: false,
6203
+ quality: 1,
6204
+ what: 'Form input element has no label'
6205
+ }
5838
6206
  }
5839
6207
  }
5840
6208
  },
@@ -5857,6 +6225,13 @@ exports.issues = {
5857
6225
  quality: 1,
5858
6226
  what: 'Form control has no visible label'
5859
6227
  }
6228
+ },
6229
+ wax: {
6230
+ 'Form elements should have a visible label': {
6231
+ variable: false,
6232
+ quality: 1,
6233
+ what: 'Form control has no visible label'
6234
+ }
5860
6235
  }
5861
6236
  }
5862
6237
  },
@@ -6015,6 +6390,16 @@ exports.issues = {
6015
6390
  quality: 1,
6016
6391
  what: 'button element is a descendant of an element with a button role'
6017
6392
  },
6393
+ 'An element with the attribute role=button must not appear as a descendant of an element with the attribute role=button.': {
6394
+ variable: false,
6395
+ quality: 1,
6396
+ what: 'Element with a button role is a descendant of an element with a button role'
6397
+ },
6398
+ 'An element with the attribute role=button must not appear as a descendant of the button element.': {
6399
+ variable: false,
6400
+ quality: 1,
6401
+ what: 'Element with a button role is a descendant of a button element'
6402
+ },
6018
6403
  'The element label must not appear as a descendant of an element with the attribute role=button.': {
6019
6404
  variable: false,
6020
6405
  quality: 1,
@@ -6072,6 +6457,13 @@ exports.issues = {
6072
6457
  quality: 1,
6073
6458
  what: 'Active element is embedded in a link or button'
6074
6459
  }
6460
+ },
6461
+ wax: {
6462
+ 'Interactive controls must not be nested': {
6463
+ variable: false,
6464
+ quality: 1,
6465
+ what: 'Interactive controls are nested'
6466
+ }
6075
6467
  }
6076
6468
  }
6077
6469
  },
@@ -6096,8 +6488,8 @@ exports.issues = {
6096
6488
  },
6097
6489
  'QW-WCAG-T24': {
6098
6490
  variable: false,
6099
- quality: 1,
6100
- what: 'Script removes the focus when focus is received'
6491
+ quality: 0.5,
6492
+ what: 'Script removes the focus when focus is received?'
6101
6493
  }
6102
6494
  },
6103
6495
  testaro: {
@@ -6260,6 +6652,13 @@ exports.issues = {
6260
6652
  quality: 1,
6261
6653
  what: 'Content is not within a landmark element'
6262
6654
  }
6655
+ },
6656
+ wax: {
6657
+ 'All page content should be contained by landmarks': {
6658
+ variable: false,
6659
+ quality: 1,
6660
+ what: 'Content is not within a landmark element'
6661
+ }
6263
6662
  }
6264
6663
  }
6265
6664
  },
@@ -6275,6 +6674,13 @@ exports.issues = {
6275
6674
  quality: 1,
6276
6675
  what: 'contentinfo landmark (footer) is contained in another landmark'
6277
6676
  }
6677
+ },
6678
+ wax: {
6679
+ 'Contentinfo landmark should not be contained in another landmark': {
6680
+ variable: false,
6681
+ quality: 1,
6682
+ what: 'Element is contentinfo but is within another landmark'
6683
+ }
6278
6684
  }
6279
6685
  }
6280
6686
  },
@@ -6302,6 +6708,13 @@ exports.issues = {
6302
6708
  quality: 1,
6303
6709
  what: 'complementary landmark is not at the top level'
6304
6710
  }
6711
+ },
6712
+ wax: {
6713
+ 'Aside should not be contained in another landmark': {
6714
+ variable: false,
6715
+ quality: 1,
6716
+ what: 'Element is aside but is within another landmark'
6717
+ }
6305
6718
  }
6306
6719
  }
6307
6720
  },
@@ -6420,6 +6833,13 @@ exports.issues = {
6420
6833
  quality: 1,
6421
6834
  what: 'More than one element with a banner role is on the page'
6422
6835
  }
6836
+ },
6837
+ wax: {
6838
+ 'Document should not have more than one banner landmark': {
6839
+ variable: false,
6840
+ quality: 1,
6841
+ what: 'Page has more than 1 banner landmark'
6842
+ }
6423
6843
  }
6424
6844
  }
6425
6845
  },
@@ -6494,6 +6914,13 @@ exports.issues = {
6494
6914
  quality: 0.5,
6495
6915
  what: 'There are multiple contentinfo or banner landmarks'
6496
6916
  }
6917
+ },
6918
+ wax: {
6919
+ 'Document should not have more than one contentinfo landmark': {
6920
+ variable: false,
6921
+ quality: 1,
6922
+ what: 'Page has more than 1 contentinfo landmark'
6923
+ }
6497
6924
  }
6498
6925
  }
6499
6926
  },
@@ -6521,6 +6948,13 @@ exports.issues = {
6521
6948
  quality: 1,
6522
6949
  what: 'Multiple landmarks with the same parent region are not distinguished from one another'
6523
6950
  }
6951
+ },
6952
+ wax: {
6953
+ 'Ensures landmarks are unique': {
6954
+ variable: false,
6955
+ quality: 1,
6956
+ what: 'Landmark is indistinguishable from another by role or accessible name'
6957
+ }
6524
6958
  }
6525
6959
  }
6526
6960
  },
@@ -6569,6 +7003,21 @@ exports.issues = {
6569
7003
  }
6570
7004
  }
6571
7005
  },
7006
+ applicationNoText: {
7007
+ summary: 'application not named',
7008
+ why: 'User cannot get help on how some of the document is organized',
7009
+ wcag: '1.3.6',
7010
+ weight: 4,
7011
+ tools: {
7012
+ ibm: {
7013
+ aria_application_labelled: {
7014
+ variable: false,
7015
+ quality: 1,
7016
+ what: 'Element with an application role has no purpose label'
7017
+ }
7018
+ }
7019
+ }
7020
+ },
6572
7021
  applicationConfusion: {
6573
7022
  summary: 'applications not distinctly named',
6574
7023
  why: 'User cannot get help on how some of the document is organized',
@@ -7436,6 +7885,13 @@ exports.issues = {
7436
7885
  quality: 1,
7437
7886
  what: 'Element has a refresh delay (no exception)'
7438
7887
  }
7888
+ },
7889
+ wave: {
7890
+ meta_refresh: {
7891
+ variable: false,
7892
+ quality: 1,
7893
+ what: 'Page refreshes or redirects'
7894
+ }
7439
7895
  }
7440
7896
  }
7441
7897
  },
@@ -7532,6 +7988,13 @@ exports.issues = {
7532
7988
  quality: 1,
7533
7989
  what: 'tabIndex value positive'
7534
7990
  }
7991
+ },
7992
+ wax: {
7993
+ 'Elements should not have tabindex greater than zero': {
7994
+ variable: false,
7995
+ quality: 1,
7996
+ what: 'Element has a positive tabIndex attribute'
7997
+ }
7535
7998
  }
7536
7999
  }
7537
8000
  },
@@ -7645,7 +8108,7 @@ exports.issues = {
7645
8108
  }
7646
8109
  },
7647
8110
  audioTextRisk: {
7648
- summary: 'audio possibly not named',
8111
+ summary: 'audio not named?',
7649
8112
  why: 'User may be unable to get help reading speech as text',
7650
8113
  wcag: '1.2.1',
7651
8114
  weight: 1,
@@ -7722,7 +8185,7 @@ exports.issues = {
7722
8185
  }
7723
8186
  },
7724
8187
  videoCaptionRisk: {
7725
- summary: 'audio or video alternatives possibly missing',
8188
+ summary: 'audio or video alternatives missing?',
7726
8189
  why: 'User may be unable to get help reading video content as text',
7727
8190
  wcag: '1.2.2',
7728
8191
  weight: 1,
@@ -7843,7 +8306,7 @@ exports.issues = {
7843
8306
  }
7844
8307
  },
7845
8308
  scrollFocus: {
7846
- summary: 'scrollable element and its children not focusable',
8309
+ summary: 'scrollable element and children nonfocusable',
7847
8310
  why: 'User may be unable to see all of an item without scrolling in both dimensions',
7848
8311
  wcag: '2.1.1',
7849
8312
  weight: 3,
@@ -7908,7 +8371,7 @@ exports.issues = {
7908
8371
  }
7909
8372
  },
7910
8373
  repeatedContentRisk: {
7911
- summary: 'skip method possibly missing or invalid',
8374
+ summary: 'skip method missing or invalid?',
7912
8375
  why: 'Keyboard-only user may be unable easily to reach the specific content of the document',
7913
8376
  wcag: '2.4.1',
7914
8377
  weight: 1,
@@ -7990,7 +8453,7 @@ exports.issues = {
7990
8453
  }
7991
8454
  },
7992
8455
  noScriptRisk: {
7993
- summary: 'noscript element possibly not equivalent',
8456
+ summary: 'noscript element not equivalent?',
7994
8457
  why: 'User who has disabled JavaScript may be denied some content',
7995
8458
  wcag: '4.1',
7996
8459
  weight: 1,
@@ -8222,6 +8685,36 @@ exports.issues = {
8222
8685
  }
8223
8686
  }
8224
8687
  },
8688
+ atRuleInvalid: {
8689
+ summary: 'invalid at-rule',
8690
+ why: 'Document cannot be properly displayed in particular contexts',
8691
+ wcag: '4.1',
8692
+ weight: 3,
8693
+ tools: {
8694
+ nuVal: {
8695
+ '^CSS: Unrecognized at-rule @.+$': {
8696
+ variable: true,
8697
+ quality: 1,
8698
+ what: 'At-rule not recognized by CSS'
8699
+ },
8700
+ 'CSS: This profile has a very specific syntax for @charset: @charset followed by exactly one space, followed by the name of the encoding in quotes, followed immediately by a semicolon.': {
8701
+ variable: false,
8702
+ quality: 1,
8703
+ what: 'CSS @charset at-rule has an invalid format'
8704
+ },
8705
+ 'CSS: The @charset rule may only occur at the start of the style sheet. Please check that there are no spaces before it.': {
8706
+ variable: false,
8707
+ quality: 1,
8708
+ what: 'CSS @charset at-rule is not at the start of its style sheet'
8709
+ },
8710
+ 'CSS: @import are not allowed after any valid statement other than @charset and @import.': {
8711
+ variable: false,
8712
+ quality: 1,
8713
+ what: 'CSS @import at-rule is after an at-rule other than @charset or @import'
8714
+ }
8715
+ }
8716
+ }
8717
+ },
8225
8718
  cssInvalid: {
8226
8719
  summary: 'CSS invalid',
8227
8720
  why: 'Document cannot be properly displayed',
@@ -8329,6 +8822,11 @@ exports.issues = {
8329
8822
  quality: 1,
8330
8823
  what: 'Space is misused as a CSS operator'
8331
8824
  },
8825
+ '^CSS: .+: , is an incorrect operator\.$': {
8826
+ variable: true,
8827
+ quality: 1,
8828
+ what: 'Comma is misused as a CSS operator'
8829
+ },
8332
8830
  '^CSS: Unknown pseudo-element or pseudo-class :.+$': {
8333
8831
  variable: true,
8334
8832
  quality: 1,
@@ -8339,11 +8837,6 @@ exports.issues = {
8339
8837
  quality: 1,
8340
8838
  what: 'Unrecognized media value'
8341
8839
  },
8342
- 'CSS: This profile has a very specific syntax for @charset: @charset followed by exactly one space, followed by the name of the encoding in quotes, followed immediately by a semicolon.': {
8343
- variable: false,
8344
- quality: 1,
8345
- what: 'CSS @charset at-rule has an invalid format'
8346
- },
8347
8840
  '^CSS: .+ is not a :lang.+ value.*$': {
8348
8841
  variable: true,
8349
8842
  quality: 1,
@@ -8354,16 +8847,6 @@ exports.issues = {
8354
8847
  quality: 1,
8355
8848
  what: 'semicolon missing in CSS'
8356
8849
  },
8357
- 'CSS: The @charset rule may only occur at the start of the style sheet. Please check that there are no spaces before it.': {
8358
- variable: false,
8359
- quality: 1,
8360
- what: 'CSS @charset at-rule is not at the start of its style sheet'
8361
- },
8362
- 'CSS: @import are not allowed after any valid statement other than @charset and @import.': {
8363
- variable: false,
8364
- quality: 1,
8365
- what: 'CSS @import at-rule is after an at-rule other than @charset or @import'
8366
- },
8367
8850
  '^CSS: perspective: .+ is not valid, only values greater than 0 allowed.*$': {
8368
8851
  variable: true,
8369
8852
  quality: 0.5,
@@ -8379,6 +8862,11 @@ exports.issues = {
8379
8862
  quality: 0.5,
8380
8863
  what: 'CSS transition property has a value greater than 1'
8381
8864
  },
8865
+ 'CSS: -webkit-mask: too few values for the property linear-gradient.': {
8866
+ variable: false,
8867
+ quality: 1,
8868
+ what: 'CSS webkit-mask linear-gradient property has too few values'
8869
+ },
8382
8870
  '^CSS: In CSS1, a class name could start with a digit .+, unless it was a dimension .+ In CSS2, such classes are parsed as unknown dimensions .+ To make .+ a valid class, CSS2 requires the first digit to be escaped: .+$': {
8383
8871
  variable: true,
8384
8872
  quality: 0.5,
@@ -8397,13 +8885,18 @@ exports.issues = {
8397
8885
  '^Stray start tag .+$': {
8398
8886
  variable: true,
8399
8887
  quality: 1,
8400
- what: 'Invalid opening tag'
8888
+ what: 'Invalid start tag'
8401
8889
  },
8402
8890
  '^Stray end tag .+$': {
8403
8891
  variable: true,
8404
8892
  quality: 1,
8405
8893
  what: 'Invalid closing tag'
8406
8894
  },
8895
+ '^End tag [a-z]+\.$': {
8896
+ variable: true,
8897
+ quality: 1,
8898
+ what: 'Closing tag of an ineligible element'
8899
+ },
8407
8900
  '^Start tag .+ seen but an element of the same type was already open.*$': {
8408
8901
  variable: true,
8409
8902
  quality: 1,
@@ -8433,6 +8926,11 @@ exports.issues = {
8433
8926
  variable: true,
8434
8927
  quality: 1,
8435
8928
  what: 'End tag for an element that is not in scope'
8929
+ },
8930
+ 'End tag had attributes.': {
8931
+ variable: false,
8932
+ quality: 1,
8933
+ what: 'End tag has an attribute'
8436
8934
  }
8437
8935
  }
8438
8936
  }
@@ -8522,6 +9020,21 @@ exports.issues = {
8522
9020
  }
8523
9021
  }
8524
9022
  },
9023
+ entityBad: {
9024
+ summary: 'named character reference invalid',
9025
+ why: 'User may be unable to read all the document text',
9026
+ wcag: '4.1',
9027
+ weight: 4,
9028
+ tools: {
9029
+ nuVal: {
9030
+ 'Named character reference was not terminated by a semicolon. (Or & should have been escaped as &amp;.)': {
9031
+ variable: false,
9032
+ quality: 1,
9033
+ what: '& not escaped or used in an unterminated character reference'
9034
+ }
9035
+ }
9036
+ }
9037
+ },
8525
9038
  textContentBad: {
8526
9039
  summary: 'element text content invalid',
8527
9040
  why: 'User may be unable to read all the document text',
@@ -8614,10 +9127,10 @@ exports.issues = {
8614
9127
  quality: 1,
8615
9128
  what: 'Invalid element name'
8616
9129
  },
8617
- 'Quote \" in attribute name. Probable cause: Matching quote missing somewhere earlier.': {
8618
- variable: false,
9130
+ '^Quote . in attribute name\. Probable cause: Matching quote missing somewhere earlier\.$': {
9131
+ variable: true,
8619
9132
  quality: 1,
8620
- what: 'Attribute name includes a double quotation mark'
9133
+ what: 'Attribute name includes an apostrophe or double quotation mark'
8621
9134
  },
8622
9135
  'Element script must not have attribute async unless attribute src is also specified or unless attribute type is specified with value module.': {
8623
9136
  variable: false,
@@ -8639,11 +9152,6 @@ exports.issues = {
8639
9152
  quality: 1,
8640
9153
  what: 'Element has an invalid ancestor'
8641
9154
  },
8642
- 'The first child option element of a select element with a required attribute, and without a multiple attribute, and without a size attribute whose value is greater than 1, must have either an empty value attribute, or must have no text content. Consider either adding a placeholder option label, or adding a size attribute with a value equal to the number of option elements.': {
8643
- variable: false,
8644
- quality: 1,
8645
- what: 'option element has a nonempty value'
8646
- },
8647
9155
  'Element script must not have attribute charset unless attribute src is also specified.': {
8648
9156
  variable: false,
8649
9157
  quality: 1,
@@ -8663,6 +9171,11 @@ exports.issues = {
8663
9171
  variable: true,
8664
9172
  quality: 1,
8665
9173
  what: 'Element is invalid because its namespace is not HTML'
9174
+ },
9175
+ 'A slash was not immediately followed by >.': {
9176
+ variable: false,
9177
+ quality: 1,
9178
+ what: 'Element start tag contains a nonfinal slash'
8666
9179
  }
8667
9180
  },
8668
9181
  qualWeb: {
@@ -8719,15 +9232,20 @@ exports.issues = {
8719
9232
  weight: 4,
8720
9233
  tools: {
8721
9234
  nuVal: {
9235
+ '^Internal encoding declaration named an unsupported chararacter encoding .*$': {
9236
+ variable: true,
9237
+ quality: 1,
9238
+ what: 'Encoding declaration names an unsupported character encoding'
9239
+ },
8722
9240
  'Text run is not in Unicode Normalization Form C.': {
8723
9241
  variable: false,
8724
9242
  quality: 1,
8725
- what: 'Text run is not in Unicode Normalization Form C.'
9243
+ what: 'Text run is not in Unicode Normalization Form C'
8726
9244
  },
8727
9245
  '^The value of attribute .+ on element .+ from namespace .+ is not in Unicode Normalization Form C.*$': {
8728
9246
  variable: true,
8729
9247
  quality: 1,
8730
- what: 'Value of attribute is not in Unicode Normalization Form C.'
9248
+ what: 'Value of attribute is not in Unicode Normalization Form C'
8731
9249
  },
8732
9250
  '^Forbidden code point U+.*$': {
8733
9251
  variable: true,