testilo 13.4.0 → 13.6.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testilo",
3
- "version": "13.4.0",
3
+ "version": "13.6.0",
4
4
  "description": "Client that scores and digests Testaro reports",
5
5
  "main": "aim.js",
6
6
  "scripts": {
@@ -362,7 +362,7 @@ exports.issueClasses = {
362
362
  }
363
363
  },
364
364
  wave: {
365
- 'alt_input_missing': {
365
+ alt_input_missing: {
366
366
  variable: false,
367
367
  quality: 1,
368
368
  what: 'Image button has no alternative text'
@@ -452,12 +452,12 @@ exports.issueClasses = {
452
452
  }
453
453
  },
454
454
  wave: {
455
- 'alt_missing': {
455
+ alt_missing: {
456
456
  variable: false,
457
457
  quality: 1,
458
458
  what: 'Text alternative is missing'
459
459
  },
460
- 'alt_spacer_missing': {
460
+ alt_spacer_missing: {
461
461
  variable: false,
462
462
  quality: 1,
463
463
  what: 'Spacer image has no text alternative'
@@ -576,7 +576,7 @@ exports.issueClasses = {
576
576
  weight: 1,
577
577
  tools: {
578
578
  wave: {
579
- 'alt_duplicate': {
579
+ alt_duplicate: {
580
580
  variable: false,
581
581
  quality: 1,
582
582
  what: 'Two images near each other have the same text alternative'
@@ -596,7 +596,7 @@ exports.issueClasses = {
596
596
  }
597
597
  },
598
598
  wave: {
599
- 'alt_long': {
599
+ alt_long: {
600
600
  variable: false,
601
601
  quality: 1,
602
602
  what: 'Long text alternative'
@@ -654,7 +654,7 @@ exports.issueClasses = {
654
654
  }
655
655
  },
656
656
  wave: {
657
- 'alt_suspicious': {
657
+ alt_suspicious: {
658
658
  variable: false,
659
659
  quality: 1,
660
660
  what: 'Image text alternative is suspicious'
@@ -766,7 +766,7 @@ exports.issueClasses = {
766
766
  }
767
767
  },
768
768
  wave: {
769
- 'language_missing': {
769
+ language_missing: {
770
770
  variable: false,
771
771
  quality: 1,
772
772
  what: 'Language missing or invalid'
@@ -961,7 +961,7 @@ exports.issueClasses = {
961
961
  }
962
962
  },
963
963
  wave: {
964
- 'plugin': {
964
+ plugin: {
965
965
  variable: false,
966
966
  quality: 1,
967
967
  what: 'An unidentified plugin is present'
@@ -1000,7 +1000,7 @@ exports.issueClasses = {
1000
1000
  weight: 4,
1001
1001
  tools: {
1002
1002
  wave: {
1003
- 'alt_map_missing': {
1003
+ alt_map_missing: {
1004
1004
  variable: false,
1005
1005
  quality: 1,
1006
1006
  what: 'Image that has hot spots has no alt attribute'
@@ -1046,7 +1046,7 @@ exports.issueClasses = {
1046
1046
  }
1047
1047
  },
1048
1048
  wave: {
1049
- 'alt_area_missing': {
1049
+ alt_area_missing: {
1050
1050
  variable: false,
1051
1051
  quality: 1,
1052
1052
  what: 'Image map area has no alternative text'
@@ -1119,7 +1119,7 @@ exports.issueClasses = {
1119
1119
  }
1120
1120
  },
1121
1121
  wave: {
1122
- 'event_handler': {
1122
+ event_handler: {
1123
1123
  variable: false,
1124
1124
  quality: 1,
1125
1125
  what: 'Device-dependent event handler'
@@ -1139,7 +1139,7 @@ exports.issueClasses = {
1139
1139
  }
1140
1140
  },
1141
1141
  wave: {
1142
- 'link_internal_broken': {
1142
+ link_internal_broken: {
1143
1143
  variable: false,
1144
1144
  quality: 1,
1145
1145
  what: 'Broken same-page link'
@@ -1155,7 +1155,14 @@ exports.issueClasses = {
1155
1155
  'AAA.1_3_1.H44.NotFormControl': {
1156
1156
  variable: false,
1157
1157
  quality: 1,
1158
- what: 'referent of the for attribute of the label is not a form control, so may be wrong'
1158
+ what: 'Referent of the for attribute of the label is not a form control, so may be wrong'
1159
+ }
1160
+ },
1161
+ ibm: {
1162
+ label_ref_valid: {
1163
+ variable: false,
1164
+ quality: 1,
1165
+ what: 'Value of the for attribute of the label element is not the id of a valid input element'
1159
1166
  }
1160
1167
  },
1161
1168
  nuVal: {
@@ -1323,7 +1330,7 @@ exports.issueClasses = {
1323
1330
  }
1324
1331
  },
1325
1332
  wave: {
1326
- 'label_orphaned': {
1333
+ label_orphaned: {
1327
1334
  variable: false,
1328
1335
  quality: 1,
1329
1336
  what: 'Orphaned form label'
@@ -1414,6 +1421,11 @@ exports.issueClasses = {
1414
1421
  variable: false,
1415
1422
  quality: 1,
1416
1423
  what: 'Hyperlink has no text description'
1424
+ },
1425
+ a_text_purpose: {
1426
+ variable: false,
1427
+ quality: 1,
1428
+ what: 'Hyperlink has no link text, label, or image with a text alternative'
1417
1429
  }
1418
1430
  },
1419
1431
  qualWeb: {
@@ -1441,12 +1453,12 @@ exports.issueClasses = {
1441
1453
  }
1442
1454
  },
1443
1455
  wave: {
1444
- 'link_empty': {
1456
+ link_empty: {
1445
1457
  variable: false,
1446
1458
  quality: 1,
1447
1459
  what: 'Link contains no text'
1448
1460
  },
1449
- 'alt_link_missing': {
1461
+ alt_link_missing: {
1450
1462
  variable: false,
1451
1463
  quality: 1,
1452
1464
  what: 'Linked image has no text alternative'
@@ -1525,7 +1537,7 @@ exports.issueClasses = {
1525
1537
  weight: 1,
1526
1538
  tools: {
1527
1539
  wave: {
1528
- 'link_pdf': {
1540
+ link_pdf: {
1529
1541
  variable: false,
1530
1542
  quality: 1,
1531
1543
  what: 'Link to PDF document'
@@ -1681,7 +1693,7 @@ exports.issueClasses = {
1681
1693
  }
1682
1694
  },
1683
1695
  wave: {
1684
- 'link_redundant': {
1696
+ link_redundant: {
1685
1697
  variable: false,
1686
1698
  quality: 1,
1687
1699
  what: 'Adjacent links go to the same URL'
@@ -1751,7 +1763,7 @@ exports.issueClasses = {
1751
1763
  weight: 1,
1752
1764
  tools: {
1753
1765
  wave: {
1754
- 'javascript_jumpmenu': {
1766
+ javascript_jumpmenu: {
1755
1767
  variable: false,
1756
1768
  quality: 1,
1757
1769
  what: 'selection change may navigate to another page without notice'
@@ -1864,7 +1876,7 @@ exports.issueClasses = {
1864
1876
  }
1865
1877
  },
1866
1878
  wave: {
1867
- 'button_empty': {
1879
+ button_empty: {
1868
1880
  variable: false,
1869
1881
  quality: 1,
1870
1882
  what: 'Button is empty or has no value text'
@@ -2137,7 +2149,7 @@ exports.issueClasses = {
2137
2149
  }
2138
2150
  },
2139
2151
  wave: {
2140
- 'text_small': {
2152
+ text_small: {
2141
2153
  variable: false,
2142
2154
  quality: 1,
2143
2155
  what: 'Text is very small'
@@ -2276,6 +2288,18 @@ exports.issueClasses = {
2276
2288
  wcag: '1.3.1',
2277
2289
  weight: 4,
2278
2290
  tools: {
2291
+ htmlcs: {
2292
+ 'AAA.2_4_8.H59.1': {
2293
+ variable: false,
2294
+ quality: 1,
2295
+ what: 'link element is not in the document head'
2296
+ },
2297
+ 'A link element with an as attribute must have a rel attribute that contains the value preload or the value modulepreload or the value prefetch.': {
2298
+ variable: false,
2299
+ quality: 1,
2300
+ what: 'link element with an as attribute has no rel attribute with preload, modulepreload, or prefetch as its value'
2301
+ }
2302
+ },
2279
2303
  nuVal: {
2280
2304
  'A link element must not appear as a descendant of a body element unless the link element has an itemprop attribute or has a rel attribute whose value contains dns-prefetch, modulepreload, pingback, preconnect, prefetch, preload, prerender, or stylesheet.': {
2281
2305
  variable: false,
@@ -2518,6 +2542,11 @@ exports.issueClasses = {
2518
2542
  }
2519
2543
  },
2520
2544
  ibm: {
2545
+ aria_role_valid: {
2546
+ variable: false,
2547
+ quality: 1,
2548
+ what: 'ARIA role is not valid for its element'
2549
+ },
2521
2550
  aria_semantics_role: {
2522
2551
  variable: false,
2523
2552
  quality: 1,
@@ -2538,6 +2567,11 @@ exports.issueClasses = {
2538
2567
  quality: 1,
2539
2568
  what: 'Element has an invalid role'
2540
2569
  },
2570
+ aria_eventhandler_role_valid: {
2571
+ variable: false,
2572
+ quality: 1,
2573
+ what: 'Element with an onclick, onmouseout, or onmouseover attribute has no valid ARIA role'
2574
+ },
2541
2575
  Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics: {
2542
2576
  variable: false,
2543
2577
  quality: 1,
@@ -2619,7 +2653,7 @@ exports.issueClasses = {
2619
2653
  }
2620
2654
  },
2621
2655
  testaro: {
2622
- 'role': {
2656
+ role: {
2623
2657
  variable: false,
2624
2658
  quality: 1,
2625
2659
  what: 'Invalid, native-replacing, or redundant role'
@@ -2636,6 +2670,11 @@ exports.issueClasses = {
2636
2670
  variable: false,
2637
2671
  quality: 1,
2638
2672
  what: 'dir attribute has a value other than ltr, rtl, or auto'
2673
+ },
2674
+ aria_attribute_valid: {
2675
+ variable: false,
2676
+ quality: 1,
2677
+ what: 'ARIA attribute is invalid for the role of its element'
2639
2678
  }
2640
2679
  },
2641
2680
  nuVal: {
@@ -2728,6 +2767,11 @@ exports.issueClasses = {
2728
2767
  variable: false,
2729
2768
  quality: 1,
2730
2769
  what: 'ARIA role on an element does not have a required attribute'
2770
+ },
2771
+ aria_attribute_required: {
2772
+ variable: false,
2773
+ quality: 1,
2774
+ what: 'Element does not have the ARIA attribute required by its role'
2731
2775
  }
2732
2776
  },
2733
2777
  nuVal: {
@@ -3106,7 +3150,7 @@ exports.issueClasses = {
3106
3150
  }
3107
3151
  },
3108
3152
  wave: {
3109
- 'aria_reference_broken': {
3153
+ aria_reference_broken: {
3110
3154
  variable: false,
3111
3155
  quality: 1,
3112
3156
  what: 'Broken ARIA reference'
@@ -3248,7 +3292,7 @@ exports.issueClasses = {
3248
3292
  }
3249
3293
  },
3250
3294
  wave: {
3251
- 'contrast': {
3295
+ contrast: {
3252
3296
  variable: false,
3253
3297
  quality: 1,
3254
3298
  what: 'Very low contrast'
@@ -3444,6 +3488,11 @@ exports.issueClasses = {
3444
3488
  variable: false,
3445
3489
  quality: 1,
3446
3490
  what: 'Heading element provides no descriptive text'
3491
+ },
3492
+ heading_content_exists: {
3493
+ variable: false,
3494
+ quality: 1,
3495
+ what: 'Heading element has no descriptive content'
3447
3496
  }
3448
3497
  },
3449
3498
  nuVal: {
@@ -3461,7 +3510,7 @@ exports.issueClasses = {
3461
3510
  }
3462
3511
  },
3463
3512
  wave: {
3464
- 'heading_empty': {
3513
+ heading_empty: {
3465
3514
  variable: false,
3466
3515
  quality: 1,
3467
3516
  what: 'Empty heading'
@@ -3526,7 +3575,7 @@ exports.issueClasses = {
3526
3575
  }
3527
3576
  },
3528
3577
  wave: {
3529
- 'alt_redundant': {
3578
+ alt_redundant: {
3530
3579
  variable: false,
3531
3580
  quality: 1,
3532
3581
  what: 'Redundant text alternative'
@@ -3553,7 +3602,7 @@ exports.issueClasses = {
3553
3602
  }
3554
3603
  },
3555
3604
  wave: {
3556
- 'image_title': {
3605
+ image_title: {
3557
3606
  variable: false,
3558
3607
  quality: 1,
3559
3608
  what: 'Image has a title attribute value but no alt value'
@@ -3580,7 +3629,7 @@ exports.issueClasses = {
3580
3629
  }
3581
3630
  },
3582
3631
  wave: {
3583
- 'title_redundant': {
3632
+ title_redundant: {
3584
3633
  variable: false,
3585
3634
  quality: 1,
3586
3635
  what: 'Title attribute text is the same as text or alternative text'
@@ -3699,7 +3748,7 @@ exports.issueClasses = {
3699
3748
  }
3700
3749
  },
3701
3750
  wave: {
3702
- 'title_invalid': {
3751
+ title_invalid: {
3703
3752
  variable: false,
3704
3753
  quality: 1,
3705
3754
  what: 'Missing or uninformative page title'
@@ -3726,7 +3775,7 @@ exports.issueClasses = {
3726
3775
  }
3727
3776
  },
3728
3777
  wave: {
3729
- 'heading_skipped': {
3778
+ heading_skipped: {
3730
3779
  variable: false,
3731
3780
  quality: 1,
3732
3781
  what: 'Skipped heading level'
@@ -3786,7 +3835,7 @@ exports.issueClasses = {
3786
3835
  }
3787
3836
  },
3788
3837
  wave: {
3789
- 'heading_missing': {
3838
+ heading_missing: {
3790
3839
  variable: false,
3791
3840
  quality: 1,
3792
3841
  what: 'Page has no headings'
@@ -3898,7 +3947,7 @@ exports.issueClasses = {
3898
3947
  }
3899
3948
  },
3900
3949
  wave: {
3901
- 'text_justified': {
3950
+ text_justified: {
3902
3951
  variable: false,
3903
3952
  quality: 1,
3904
3953
  what: 'Text is justified'
@@ -4025,7 +4074,7 @@ exports.issueClasses = {
4025
4074
  }
4026
4075
  },
4027
4076
  wave: {
4028
- 'heading_possible': {
4077
+ heading_possible: {
4029
4078
  variable: false,
4030
4079
  quality: 1,
4031
4080
  what: 'Possible heading'
@@ -4045,7 +4094,7 @@ exports.issueClasses = {
4045
4094
  }
4046
4095
  },
4047
4096
  wave: {
4048
- 'underline': {
4097
+ underline: {
4049
4098
  variable: false,
4050
4099
  quality: 1,
4051
4100
  what: 'CSS underline on text that is not a link'
@@ -4139,7 +4188,7 @@ exports.issueClasses = {
4139
4188
  }
4140
4189
  },
4141
4190
  wave: {
4142
- 'list_possible': {
4191
+ list_possible: {
4143
4192
  variable: false,
4144
4193
  quality: 1,
4145
4194
  what: 'List may fail to be coded as such'
@@ -4211,7 +4260,7 @@ exports.issueClasses = {
4211
4260
  }
4212
4261
  },
4213
4262
  wave: {
4214
- 'select_missing_label': {
4263
+ select_missing_label: {
4215
4264
  variable: false,
4216
4265
  quality: 1,
4217
4266
  what: 'Select element has no label'
@@ -4271,7 +4320,7 @@ exports.issueClasses = {
4271
4320
  }
4272
4321
  },
4273
4322
  wave: {
4274
- 'accesskey': {
4323
+ accesskey: {
4275
4324
  variable: false,
4276
4325
  quality: 1,
4277
4326
  what: 'Accesskey'
@@ -4298,7 +4347,7 @@ exports.issueClasses = {
4298
4347
  }
4299
4348
  },
4300
4349
  wave: {
4301
- 'fieldset_missing': {
4350
+ fieldset_missing: {
4302
4351
  variable: false,
4303
4352
  quality: 1,
4304
4353
  what: 'fieldset element is missing'
@@ -4354,7 +4403,12 @@ exports.issueClasses = {
4354
4403
  WCAG20_Fieldset_HasLegend: {
4355
4404
  variable: false,
4356
4405
  quality: 1,
4357
- what: 'fieldset element has no single, non-empty legend as a label'
4406
+ what: 'fieldset element has no single, non-empty legend element as a label'
4407
+ },
4408
+ fieldset_legend_valid: {
4409
+ variable: false,
4410
+ quality: 1,
4411
+ what: 'fieldset element does not have a legend element'
4358
4412
  }
4359
4413
  },
4360
4414
  qualWeb: {
@@ -4365,7 +4419,7 @@ exports.issueClasses = {
4365
4419
  }
4366
4420
  },
4367
4421
  wave: {
4368
- 'legend_missing': {
4422
+ legend_missing: {
4369
4423
  variable: false,
4370
4424
  quality: 1,
4371
4425
  what: 'fieldset has no legend element'
@@ -4396,6 +4450,11 @@ exports.issueClasses = {
4396
4450
  variable: false,
4397
4451
  quality: 1,
4398
4452
  what: 'Groups with nested inputs has no unique accessible name'
4453
+ },
4454
+ fieldset_label_valid: {
4455
+ variable: false,
4456
+ quality: 1,
4457
+ what: 'Group or fieldset has no accessible name'
4399
4458
  }
4400
4459
  }
4401
4460
  }
@@ -4424,7 +4483,7 @@ exports.issueClasses = {
4424
4483
  }
4425
4484
  },
4426
4485
  wave: {
4427
- 'table_layout': {
4486
+ table_layout: {
4428
4487
  variable: false,
4429
4488
  quality: 1,
4430
4489
  what: 'table element is misused to arrange content'
@@ -4651,7 +4710,7 @@ exports.issueClasses = {
4651
4710
  weight: 2,
4652
4711
  tools: {
4653
4712
  wave: {
4654
- 'th_empty': {
4713
+ th_empty: {
4655
4714
  variable: false,
4656
4715
  quality: 1,
4657
4716
  what: 'th (table header) contains no text'
@@ -4705,7 +4764,7 @@ exports.issueClasses = {
4705
4764
  }
4706
4765
  },
4707
4766
  wave: {
4708
- 'label_missing': {
4767
+ label_missing: {
4709
4768
  variable: false,
4710
4769
  quality: 1,
4711
4770
  what: 'form element has no label'
@@ -4731,7 +4790,7 @@ exports.issueClasses = {
4731
4790
  weight: 3,
4732
4791
  tools: {
4733
4792
  wave: {
4734
- 'label_title': {
4793
+ label_title: {
4735
4794
  variable: false,
4736
4795
  quality: 1,
4737
4796
  what: 'Form control has a title but no label'
@@ -4968,7 +5027,7 @@ exports.issueClasses = {
4968
5027
  }
4969
5028
  },
4970
5029
  testaro: {
4971
- 'focInd': {
5030
+ focInd: {
4972
5031
  variable: false,
4973
5032
  quality: 1,
4974
5033
  what: 'Focused element displays a nonstandard or no focus indicator'
@@ -5021,7 +5080,7 @@ exports.issueClasses = {
5021
5080
  weight: 2,
5022
5081
  tools: {
5023
5082
  wave: {
5024
- 'region_missing': {
5083
+ region_missing: {
5025
5084
  variable: false,
5026
5085
  quality: 1,
5027
5086
  what: 'Page has no regions or ARIA landmarks'
@@ -5182,6 +5241,13 @@ exports.issueClasses = {
5182
5241
  quality: 1,
5183
5242
  what: 'Multiple elements with a banner role are on the page'
5184
5243
  }
5244
+ },
5245
+ qualWeb: {
5246
+ 'QW-BP20': {
5247
+ variable: false,
5248
+ quality: 1,
5249
+ what: 'Document has more than 1 banner landmark'
5250
+ }
5185
5251
  }
5186
5252
  }
5187
5253
  },
@@ -5195,6 +5261,13 @@ exports.issueClasses = {
5195
5261
  quality: 1,
5196
5262
  what: 'banner landmark is contained in another landmark'
5197
5263
  }
5264
+ },
5265
+ qualWeb: {
5266
+ 'QW-BP19': {
5267
+ variable: false,
5268
+ quality: 1,
5269
+ what: 'banner landmark is not at the top level'
5270
+ }
5198
5271
  }
5199
5272
  }
5200
5273
  },
@@ -5437,6 +5510,11 @@ exports.issueClasses = {
5437
5510
  variable: false,
5438
5511
  quality: 1,
5439
5512
  what: 'label element has no non-empty purpose-descriptive text'
5513
+ },
5514
+ label_content_exists: {
5515
+ variable: false,
5516
+ quality: 1,
5517
+ what: 'label element has no descriptive text identifying the expected input'
5440
5518
  }
5441
5519
  }
5442
5520
  }
@@ -5446,7 +5524,7 @@ exports.issueClasses = {
5446
5524
  weight: 3,
5447
5525
  tools: {
5448
5526
  testaro: {
5449
- 'focOp': {
5527
+ focOp: {
5450
5528
  variable: false,
5451
5529
  quality: 1,
5452
5530
  what: 'Tab-focusable elements that are inoperable or operable elements that are not focusable'
@@ -5570,6 +5648,24 @@ exports.issueClasses = {
5570
5648
  }
5571
5649
  }
5572
5650
  },
5651
+ multipleLabelees: {
5652
+ wcag: '1.3.1',
5653
+ weight: 4,
5654
+ tools: {
5655
+ nuVal: {
5656
+ 'The label element may contain at most one button, input, meter, output, progress, select, or textarea descendant.': {
5657
+ variable: false,
5658
+ quality: 1,
5659
+ what: 'label element has more than 1 labelable descendant.'
5660
+ },
5661
+ 'label element with multiple labelable descendants.': {
5662
+ variable: false,
5663
+ quality: 1,
5664
+ what: 'label element has multiple labelable descendants.'
5665
+ }
5666
+ }
5667
+ }
5668
+ },
5573
5669
  labeledHidden: {
5574
5670
  wcag: '1.3.1',
5575
5671
  weight: 2,
@@ -5658,7 +5754,7 @@ exports.issueClasses = {
5658
5754
  weight: 3,
5659
5755
  tools: {
5660
5756
  testaro: {
5661
- 'hover': {
5757
+ hover: {
5662
5758
  variable: false,
5663
5759
  quality: 1,
5664
5760
  what: 'Hovering over element has unexpected effects'
@@ -5678,7 +5774,7 @@ exports.issueClasses = {
5678
5774
  }
5679
5775
  },
5680
5776
  testaro: {
5681
- 'labClash': {
5777
+ labClash: {
5682
5778
  variable: false,
5683
5779
  quality: 1,
5684
5780
  what: 'Incompatible label types'
@@ -5692,7 +5788,7 @@ exports.issueClasses = {
5692
5788
  }
5693
5789
  },
5694
5790
  wave: {
5695
- 'label_multiple': {
5791
+ label_multiple: {
5696
5792
  variable: false,
5697
5793
  quality: 1,
5698
5794
  what: 'Form control has more than one label associated with it'
@@ -5717,7 +5813,7 @@ exports.issueClasses = {
5717
5813
  }
5718
5814
  },
5719
5815
  wave: {
5720
- 'label_empty': {
5816
+ label_empty: {
5721
5817
  variable: false,
5722
5818
  quality: 1,
5723
5819
  what: 'Empty form label'
@@ -5730,7 +5826,7 @@ exports.issueClasses = {
5730
5826
  weight: 1,
5731
5827
  tools: {
5732
5828
  wave: {
5733
- 'link_suspicious': {
5829
+ link_suspicious: {
5734
5830
  variable: false,
5735
5831
  quality: 1,
5736
5832
  what: 'Suspicious link text'
@@ -5750,12 +5846,12 @@ exports.issueClasses = {
5750
5846
  }
5751
5847
  },
5752
5848
  wave: {
5753
- 'link_excel': {
5849
+ link_excel: {
5754
5850
  variable: false,
5755
5851
  quality: 1,
5756
5852
  what: 'Link to Microsoft Excel workbook'
5757
5853
  },
5758
- 'link_word': {
5854
+ link_word: {
5759
5855
  variable: false,
5760
5856
  quality: 1,
5761
5857
  what: 'Link to Microsoft Word document'
@@ -5821,7 +5917,7 @@ exports.issueClasses = {
5821
5917
  weight: 4,
5822
5918
  tools: {
5823
5919
  wave: {
5824
- 'aria_menu_broken': {
5920
+ aria_menu_broken: {
5825
5921
  variable: false,
5826
5922
  quality: 1,
5827
5923
  what: 'ARIA menu does not contain required menu items'
@@ -5954,6 +6050,13 @@ exports.issueClasses = {
5954
6050
  wcag: '1.3.1',
5955
6051
  weight: 4,
5956
6052
  tools: {
6053
+ ibm: {
6054
+ aria_parent_required: {
6055
+ variable: true,
6056
+ quality: 1,
6057
+ what: 'Element is not contained in or owned by an element with a required role'
6058
+ }
6059
+ },
5957
6060
  nuVal: {
5958
6061
  '^Element .+ not allowed as child of element .+ in this context.*$': {
5959
6062
  variable: true,
@@ -6014,7 +6117,7 @@ exports.issueClasses = {
6014
6117
  }
6015
6118
  },
6016
6119
  wave: {
6017
- 'tabindex': {
6120
+ tabindex: {
6018
6121
  variable: false,
6019
6122
  quality: 1,
6020
6123
  what: 'tabIndex value positive'
@@ -6199,12 +6302,12 @@ exports.issueClasses = {
6199
6302
  quality: 1,
6200
6303
  what: 'video or audio element may have no or incorrect captions, transcript, or audio description'
6201
6304
  },
6202
- 'audio_video': {
6305
+ audio_video: {
6203
6306
  variable: false,
6204
6307
  quality: 1,
6205
6308
  what: 'audio or video file or link may have no or incorrect captions, transcript, or audio description'
6206
6309
  },
6207
- 'youtube_video': {
6310
+ youtube_video: {
6208
6311
  variable: false,
6209
6312
  quality: 1,
6210
6313
  what: 'YouTube video may have no or incorrect captions'
@@ -6303,7 +6406,7 @@ exports.issueClasses = {
6303
6406
  weight: 3,
6304
6407
  tools: {
6305
6408
  axe: {
6306
- 'bypass': {
6409
+ bypass: {
6307
6410
  variable: false,
6308
6411
  quality: 1,
6309
6412
  what: 'Page has no means to bypass repeated blocks'
@@ -6334,7 +6437,7 @@ exports.issueClasses = {
6334
6437
  }
6335
6438
  },
6336
6439
  wave: {
6337
- 'link_skip_broken': {
6440
+ link_skip_broken: {
6338
6441
  variable: false,
6339
6442
  quality: 1,
6340
6443
  what: 'Skip-navigation link has no target or is not keyboard accessible'
@@ -6433,7 +6536,7 @@ exports.issueClasses = {
6433
6536
  weight: 1,
6434
6537
  tools: {
6435
6538
  wave: {
6436
- 'noscript': {
6539
+ noscript: {
6437
6540
  variable: false,
6438
6541
  quality: 1,
6439
6542
  what: 'noscript element may fail to contain an accessible equivalent or alternative'
@@ -6564,12 +6667,12 @@ exports.issueClasses = {
6564
6667
  }
6565
6668
  },
6566
6669
  wave: {
6567
- 'longdesc': {
6670
+ longdesc: {
6568
6671
  variable: false,
6569
6672
  quality: 1,
6570
6673
  what: 'longdesc attribute is obsolete'
6571
6674
  },
6572
- 'flash': {
6675
+ flash: {
6573
6676
  variable: false,
6574
6677
  quality: 1,
6575
6678
  what: 'Flash content is present'
@@ -6771,7 +6874,12 @@ exports.issueClasses = {
6771
6874
  weight: 3,
6772
6875
  tools: {
6773
6876
  ibm: {
6774
- 'Rpt_Aria_InvalidTabindexForActivedescendant': {
6877
+ aria_child_valid: {
6878
+ variable: false,
6879
+ quality: 1,
6880
+ what: 'Child element has a role not allowed for the role of the parent'
6881
+ },
6882
+ Rpt_Aria_InvalidTabindexForActivedescendant: {
6775
6883
  variable: false,
6776
6884
  quality: 1,
6777
6885
  what: 'Element with an aria-activedescendant attribute has no nonpositive tabindex attribute'
@@ -6942,7 +7050,7 @@ exports.issueClasses = {
6942
7050
  }
6943
7051
  },
6944
7052
  wave: {
6945
- 'longdesc_invalid': {
7053
+ longdesc_invalid: {
6946
7054
  variable: false,
6947
7055
  quality: 1,
6948
7056
  what: 'longdesc attribute has a value that is not a URL (and is obsolete)'
@@ -29,7 +29,7 @@ const latencyWeight = 1;
29
29
  // Normal latency (1.5 second per visit).
30
30
  const normalLatency = 20;
31
31
  // How much each prevention adds to the score.
32
- const preventionWeight = 200;
32
+ const preventionWeight = 300;
33
33
  // Indexes of issues.
34
34
  const issueIndex = {};
35
35
  const issueMatcher = [];
@@ -83,7 +83,7 @@ exports.scorer = report => {
83
83
  testActs.forEach(act => {
84
84
  // If the page prevented the tool from operating:
85
85
  const {which, standardResult} = act;
86
- if (standardResult.prevented) {
86
+ if (! standardResult || standardResult.prevented) {
87
87
  // Add this to the score.
88
88
  details.prevention[which] = preventionWeight;
89
89
  }
@@ -149,7 +149,7 @@ exports.scorer = report => {
149
149
  }
150
150
  });
151
151
  }
152
- // Otherwise, i.e. if no successful standard result exists:
152
+ // Otherwise, i.e. if a failed standard result exists:
153
153
  else {
154
154
  // Add an inferred prevention to the score.
155
155
  details.prevention[which] = preventionWeight;
@@ -0,0 +1,79 @@
1
+ {
2
+ "id": "ts27",
3
+ "what": "accessibility tests",
4
+ "strict": true,
5
+ "timeLimit": 330,
6
+ "acts": [
7
+ {
8
+ "type": "placeholder",
9
+ "which": "main",
10
+ "launch": "webkit"
11
+ },
12
+ {
13
+ "type": "tenonRequest",
14
+ "id": "a",
15
+ "withNewContent": false,
16
+ "what": "Tenon API version 2 test request, with page content"
17
+ },
18
+ {
19
+ "type": "test",
20
+ "which": "testaro",
21
+ "what": "Testaro motion test (requires webkit)",
22
+ "withItems": true,
23
+ "rules": ["y", "motion"]
24
+ },
25
+ {
26
+ "type": "placeholder",
27
+ "which": "main",
28
+ "launch": "chromium"
29
+ },
30
+ {
31
+ "type": "test",
32
+ "which": "alfa"
33
+ },
34
+ {
35
+ "type": "test",
36
+ "which": "axe",
37
+ "detailLevel": 2
38
+ },
39
+ {
40
+ "type": "test",
41
+ "which": "continuum"
42
+ },
43
+ {
44
+ "type": "test",
45
+ "which": "htmlcs"
46
+ },
47
+ {
48
+ "type": "test",
49
+ "which": "ibm",
50
+ "withItems": true,
51
+ "withNewContent": false
52
+ },
53
+ {
54
+ "type": "test",
55
+ "which": "nuVal"
56
+ },
57
+ {
58
+ "type": "test",
59
+ "which": "qualWeb",
60
+ "withNewContent": false
61
+ },
62
+ {
63
+ "type": "test",
64
+ "which": "tenon",
65
+ "id": "a"
66
+ },
67
+ {
68
+ "type": "test",
69
+ "which": "testaro",
70
+ "withItems": true,
71
+ "rules": ["n", "motion"]
72
+ },
73
+ {
74
+ "type": "test",
75
+ "which": "wave",
76
+ "reportType": 4
77
+ }
78
+ ]
79
+ }