testilo 3.9.2 → 3.9.3

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/sp15a.js +103 -83
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testilo",
3
- "version": "3.9.2",
3
+ "version": "3.9.3",
4
4
  "description": "Client that scores and digests Testaro reports",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -10,8 +10,8 @@
10
10
  This proc applies specified weights to the component scores before summing them. An issue reported
11
11
  by a test is given a score. That score is determined by:
12
12
  Whether the issue is reported as an error or a warning.
13
- How important the issue is, if the test package is pre-weighted (axe, tenon, and testaro)
14
- Whether the test belongs to a group or is a solo test.
13
+ How important the issue is, if the test package is pre-weighted (axe, tenon, and testaro)
14
+ Whether the test belongs to a group or is a solo test.
15
15
  How heavily the group is weighted, if the test package is not pre-weighted and the test belongs
16
16
  to a group
17
17
 
@@ -27,7 +27,7 @@
27
27
  Browser logging produces a log score, and the prevention of tests produces a prevention score.
28
28
  They, too, are added to the total score.
29
29
 
30
- Each grouped test has a quality property, typically set to 1. The value of this property can be
30
+ Each grouped test has a quality property, typically set to 1. The value of this property can be
31
31
  modified when the test is found to be higher or lower in quality than usual.
32
32
  */
33
33
 
@@ -58,21 +58,24 @@ const otherPackages = ['alfa', 'axe', 'continuum', 'htmlcs', 'ibm', 'nuVal', 'te
58
58
  const preWeightedPackages = ['axe', 'tenon', 'testaro'];
59
59
  const testMatchers = {
60
60
  nuVal: [
61
- /^CSS: background-image”: .+ is not a background-image value.*$/,
62
- /^CSS: background”: .+ is not a color value.*$/,
63
- /^CSS: cursor”: .+ is not a cursor value.*$/,
64
- /^CSS: transform”: .+ is not a transform value.*$/,
65
- /^Duplicate ID .+$|^The first occurrence of ID .+ was here.*$/,
61
+ /^CSS: background-image: .+ is not a background-image value.*$/,
62
+ /^CSS: background: .+ is not a color value.*$/,
63
+ /^CSS: cursor: .+ is not a cursor value.*$/,
64
+ /^CSS: transform: .+ is not a transform value.*$/,
65
+ /^Bad value for attribute id on element .+: An ID must not be the empty string.+$/,
66
+ /^Duplicate ID .+$|^The first occurrence of ID .* was here.*$/,
66
67
  /^Start tag .+ seen but an element of the same type was already open.*$/,
67
68
  /^End tag .+ violates nesting rules.*$/,
68
69
  /^Attribute .+ is not serializable as XML 1\.0.*$/,
69
- /^Attribute .+ not allowed on element meta at this point.*$/,
70
+ /^Attribute .+ not allowed on element meta at this point.*$/,
70
71
  /^Attribute .+ not allowed on element .+ at this point.*$/,
71
- /^Bad value .+ for attribute .+ on element meta”.*$/,
72
+ /^Bad value .+ for attribute .+ on element meta.*$/,
72
73
  /^Bad value .+ for attribute .+ on element .+$/,
74
+ /^Bad value .+ for the attribute .+$/,
73
75
  /^Attribute .+ not allowed here.*$/,
76
+ /^The .+ role is unnecessary for element .+$/,
74
77
  /^CSS: .+: Property .+ doesn't exist.*$/,
75
- /^CSS: .+: only 0 can be a length”. You must put a unit after your number.*$/,
78
+ /^CSS: .+: only 0 can be a length. You must put a unit after your number.*$/,
76
79
  /^Element .+ not allowed as child of element .+ in this context.*$/
77
80
  ]
78
81
  };
@@ -81,7 +84,7 @@ const groups = {
81
84
  weight: 0,
82
85
  packages: {
83
86
  nuVal: {
84
- 'Element mediaelementwrapper not allowed as child of element div in this context. (Suppressing further errors from this subtree.)': {
87
+ 'Element mediaelementwrapper not allowed as child of element div in this context. (Suppressing further errors from this subtree.)': {
85
88
  quality: 0,
86
89
  what: 'Bug in nuVal'
87
90
  }
@@ -130,7 +133,7 @@ const groups = {
130
133
  }
131
134
  },
132
135
  nuVal: {
133
- '^Duplicate ID .+$|^The first occurrence of ID .+ was here.*$': {
136
+ '^Duplicate ID .+$|^The first occurrence of ID .* was here.*$': {
134
137
  quality: 1,
135
138
  what: 'Duplicate id'
136
139
  }
@@ -348,7 +351,7 @@ const groups = {
348
351
  }
349
352
  },
350
353
  nuVal: {
351
- 'An img element must have an alt attribute, except under certain conditions. For details, consult guidance on providing text alternatives for images.': {
354
+ 'An img element must have an alt attribute, except under certain conditions. For details, consult guidance on providing text alternatives for images.': {
352
355
  quality: 1,
353
356
  what: 'img element has no alt attribute'
354
357
  }
@@ -391,7 +394,7 @@ const groups = {
391
394
  weight: 4,
392
395
  packages: {
393
396
  nuVal: {
394
- 'Element img is missing required attribute src”.': {
397
+ 'Element img is missing required attribute src.': {
395
398
  quality: 1,
396
399
  what: 'img element has no src attribute'
397
400
  }
@@ -402,7 +405,7 @@ const groups = {
402
405
  weight: 4,
403
406
  packages: {
404
407
  nuVal: {
405
- '^CSS: background”: .+ is not a color value.*$': {
408
+ '^CSS: background: .+ is not a color value.*$': {
406
409
  quality: 1,
407
410
  what: 'CSS background color is misdefined'
408
411
  }
@@ -413,7 +416,7 @@ const groups = {
413
416
  weight: 4,
414
417
  packages: {
415
418
  nuVal: {
416
- '^CSS: background-image”: .+ is not a background-image value.*$': {
419
+ '^CSS: background-image: .+ is not a background-image value.*$': {
417
420
  quality: 1,
418
421
  what: 'CSS background image is misdefined'
419
422
  }
@@ -811,7 +814,7 @@ const groups = {
811
814
  weight: 1,
812
815
  packages: {
813
816
  nuVal: {
814
- 'Possible misuse of aria-label”. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)': {
817
+ 'Possible misuse of aria-label. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)': {
815
818
  quality: 1,
816
819
  what: 'aria-label attribute may be misused'
817
820
  }
@@ -898,7 +901,7 @@ const groups = {
898
901
  }
899
902
  },
900
903
  nuVal: {
901
- 'The aria-labelledby attribute must point to an element in the same document.': {
904
+ 'The aria-labelledby attribute must point to an element in the same document.': {
902
905
  quality: 1,
903
906
  what: 'aria-labelledby attribute references an element not in the document'
904
907
  }
@@ -1185,7 +1188,7 @@ const groups = {
1185
1188
  weight: 4,
1186
1189
  packages: {
1187
1190
  nuVal: {
1188
- 'Attribute alt not allowed on element button at this point.': {
1191
+ 'Attribute alt not allowed on element button at this point.': {
1189
1192
  quality: 1,
1190
1193
  what: 'button element has an alt attribute'
1191
1194
  }
@@ -1487,7 +1490,7 @@ const groups = {
1487
1490
  weight: 4,
1488
1491
  packages: {
1489
1492
  nuVal: {
1490
- 'Element title not allowed as child of element body in this context. (Suppressing further errors from this subtree.)': {
1493
+ 'Element title not allowed as child of element body in this context. (Suppressing further errors from this subtree.)': {
1491
1494
  quality: 1,
1492
1495
  what: 'title element is a child of the body element'
1493
1496
  }
@@ -1504,7 +1507,7 @@ const groups = {
1504
1507
  weight: 4,
1505
1508
  packages: {
1506
1509
  nuVal: {
1507
- '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”.': {
1510
+ '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.': {
1508
1511
  quality: 1,
1509
1512
  what: 'link element with a body ancestor has no itemprop or valid rel attribute'
1510
1513
  }
@@ -1515,31 +1518,31 @@ const groups = {
1515
1518
  weight: 3,
1516
1519
  packages: {
1517
1520
  nuVal: {
1518
- '^Attribute .+ not allowed on element meta at this point.*$': {
1521
+ '^Attribute .+ not allowed on element meta at this point.*$': {
1519
1522
  quality: 1,
1520
1523
  what: 'Attribute is not allowed on a meta element here'
1521
1524
  },
1522
- 'Element meta is missing one or more of the following attributes: charset”, content”, http-equiv”, itemprop”, name”, property”.': {
1525
+ 'Element meta is missing one or more of the following attributes: charset, content, http-equiv, itemprop, name, property.': {
1523
1526
  quality: 1,
1524
1527
  what: 'meta element is missing a charset, content, http-equiv, itemprop, name, or property attribute'
1525
1528
  },
1526
- 'A document must not include more than one meta element with its name attribute set to the value description”.': {
1529
+ 'A document must not include more than one meta element with its name attribute set to the value description.': {
1527
1530
  quality: 1,
1528
1531
  what: 'meta element with name="description" is not the only one'
1529
1532
  },
1530
- 'A meta element with an http-equiv attribute whose value is X-UA-Compatible must have a content attribute with the value IE=edge”.': {
1533
+ 'A meta element with an http-equiv attribute whose value is X-UA-Compatible must have a content attribute with the value IE=edge.': {
1531
1534
  quality: 1,
1532
1535
  what: 'meta element with http-equiv="X-UA-Compatible" has no content="IE=edge"'
1533
1536
  },
1534
- 'Element meta is missing one or more of the following attributes: itemprop”, property”.': {
1537
+ 'Element meta is missing one or more of the following attributes: itemprop, property.': {
1535
1538
  quality: 1,
1536
1539
  what: 'meta element is missing an itemprop or property attribute'
1537
1540
  },
1538
- 'A charset attribute on a meta element found after the first 1024 bytes.': {
1541
+ 'A charset attribute on a meta element found after the first 1024 bytes.': {
1539
1542
  quality: 1,
1540
1543
  what: 'charset attribute on a meta element appears after 1024 bytes'
1541
1544
  },
1542
- '^Bad value .+ for attribute .+ on element meta”.*$': {
1545
+ '^Bad value .+ for attribute .+ on element meta.*$': {
1543
1546
  quality: 1,
1544
1547
  what: 'attribute of a meta element has an invalid value'
1545
1548
  }
@@ -1550,7 +1553,7 @@ const groups = {
1550
1553
  weight: 4,
1551
1554
  packages: {
1552
1555
  nuVal: {
1553
- 'Element script must not have attribute defer unless attribute src is also specified.': {
1556
+ 'Element script must not have attribute defer unless attribute src is also specified.': {
1554
1557
  quality: 1,
1555
1558
  what: 'script element has a defer attribute without a src attribute'
1556
1559
  }
@@ -1561,7 +1564,7 @@ const groups = {
1561
1564
  weight: 4,
1562
1565
  packages: {
1563
1566
  nuVal: {
1564
- 'The itemtype attribute must not be specified on elements that do not have an itemscope attribute specified.': {
1567
+ 'The itemtype attribute must not be specified on elements that do not have an itemscope attribute specified.': {
1565
1568
  quality: 1,
1566
1569
  what: 'Element has an itemtype attribute without an itemscope attribute'
1567
1570
  }
@@ -1679,7 +1682,7 @@ const groups = {
1679
1682
  }
1680
1683
  },
1681
1684
  nuVal: {
1682
- 'Bad value dialog for attribute role on element li”.': {
1685
+ 'Bad value dialog for attribute role on element li.': {
1683
1686
  quality: 1,
1684
1687
  what: 'dialog role is not valid for an li element'
1685
1688
  }
@@ -1702,21 +1705,9 @@ const groups = {
1702
1705
  }
1703
1706
  },
1704
1707
  nuVal: {
1705
- 'The “banner” role is unnecessary for element “header”.': {
1708
+ '^The .+ role is unnecessary for element .+$': {
1706
1709
  quality: 1,
1707
- what: 'banner role is redundant for a header element'
1708
- },
1709
- 'The “contentinfo” role is unnecessary for element “footer”.': {
1710
- quality: 1,
1711
- what: 'contentinfo role is redundant for a footer element'
1712
- },
1713
- 'The “main” role is unnecessary for element “main”.': {
1714
- quality: 1,
1715
- what: 'main role is redundant for a main element'
1716
- },
1717
- 'The “navigation” role is unnecessary for element “nav”.': {
1718
- quality: 1,
1719
- what: 'navigation role is redundant for a nav element'
1710
+ what: 'explicit role is redundant for its element'
1720
1711
  }
1721
1712
  }
1722
1713
  }
@@ -1737,7 +1728,7 @@ const groups = {
1737
1728
  }
1738
1729
  },
1739
1730
  nuVal: {
1740
- 'Element a is missing required attribute aria-valuenow”.': {
1731
+ 'Element a is missing required attribute aria-valuenow.': {
1741
1732
  quality: 1,
1742
1733
  what: 'a element has no aria-valuenow attribute'
1743
1734
  }
@@ -1879,7 +1870,7 @@ const groups = {
1879
1870
  }
1880
1871
  },
1881
1872
  nuVal: {
1882
- 'The aria-hidden attribute must not be specified on the noscript element.': {
1873
+ 'The aria-hidden attribute must not be specified on the noscript element.': {
1883
1874
  quality: 1,
1884
1875
  what: 'noscript element has an aria-hidden attribute'
1885
1876
  }
@@ -2065,7 +2056,7 @@ const groups = {
2065
2056
  weight: 4,
2066
2057
  packages: {
2067
2058
  nuVal: {
2068
- 'Bad value “” for attribute id on element “a”: An ID must not be the empty string.': {
2059
+ '^Bad value for attribute id on element .+: An ID must not be the empty string.+$': {
2069
2060
  quality: 1,
2070
2061
  what: 'id attribute has an empty value'
2071
2062
  }
@@ -2128,11 +2119,11 @@ const groups = {
2128
2119
  weight: 1,
2129
2120
  packages: {
2130
2121
  nuVal: {
2131
- 'The type attribute is unnecessary for JavaScript resources.': {
2122
+ 'The type attribute is unnecessary for JavaScript resources.': {
2132
2123
  quality: 1,
2133
2124
  what: 'type attribute is unnecessary for a JavaScript resource'
2134
2125
  },
2135
- 'The type attribute for the style element is not needed and should be omitted.': {
2126
+ 'The type attribute for the style element is not needed and should be omitted.': {
2136
2127
  quality: 1,
2137
2128
  what: 'type attribute is unnecessary for a style element'
2138
2129
  }
@@ -2224,8 +2215,14 @@ const groups = {
2224
2215
  }
2225
2216
  },
2226
2217
  docType: {
2227
- weight: 1,
2218
+ weight: 3,
2228
2219
  packages: {
2220
+ nuVal: {
2221
+ 'Start tag seen without seeing a doctype first. Expected <!DOCTYPE html>.': {
2222
+ quality: 1,
2223
+ what: 'Page does not start with <!DOCTYPE html>'
2224
+ }
2225
+ },
2229
2226
  testaro: {
2230
2227
  docType: {
2231
2228
  quality: 1,
@@ -2268,7 +2265,7 @@ const groups = {
2268
2265
  }
2269
2266
  },
2270
2267
  nuVal: {
2271
- 'Element head is missing a required instance of child element title”.': {
2268
+ 'Element head is missing a required instance of child element title.': {
2272
2269
  quality: 1,
2273
2270
  what: 'head element has no child title element'
2274
2271
  }
@@ -2303,7 +2300,7 @@ const groups = {
2303
2300
  }
2304
2301
  },
2305
2302
  nuVal: {
2306
- 'Consider using the h1 element as a top-level heading only (all h1 elements are treated as top-level headings by many screen readers and other tools).': {
2303
+ 'Consider using the h1 element as a top-level heading only (all h1 elements are treated as top-level headings by many screen readers and other tools).': {
2307
2304
  quality: 1,
2308
2305
  what: 'Page contains more than 1 h1 element'
2309
2306
  }
@@ -2373,11 +2370,26 @@ const groups = {
2373
2370
  }
2374
2371
  }
2375
2372
  },
2373
+ articleHeadingless: {
2374
+ weight: 1,
2375
+ packages: {
2376
+ nuVal: {
2377
+ 'Article lacks heading. Consider using h2-h6 elements to add identifying headings to all articles.': {
2378
+ quality: 1,
2379
+ what: 'article has no heading'
2380
+ }
2381
+ }
2382
+ }
2383
+ },
2376
2384
  sectionHeadingless: {
2377
2385
  weight: 1,
2378
2386
  packages: {
2379
2387
  nuVal: {
2380
- 'Section lacks heading. Consider using h2”-“h6 elements to add identifying headings to all sections.': {
2388
+ 'Section lacks heading. Consider using h2-h6 elements to add identifying headings to all sections.': {
2389
+ quality: 1,
2390
+ what: 'section has no heading'
2391
+ },
2392
+ 'Section lacks heading. Consider using h2-h6 elements to add identifying headings to all sections, or else use a div element instead for any cases where no heading is needed.': {
2381
2393
  quality: 1,
2382
2394
  what: 'section has no heading'
2383
2395
  }
@@ -2544,7 +2556,7 @@ const groups = {
2544
2556
  }
2545
2557
  },
2546
2558
  nuVal: {
2547
- 'Element li not allowed as child of element div in this context. (Suppressing further errors from this subtree.)': {
2559
+ 'Element li not allowed as child of element div in this context. (Suppressing further errors from this subtree.)': {
2548
2560
  quality: 1,
2549
2561
  what: 'li element is a child of a div element'
2550
2562
  }
@@ -3500,7 +3512,7 @@ const groups = {
3500
3512
  weight: 2,
3501
3513
  packages: {
3502
3514
  nuVal: {
3503
- 'Potentially bad value allow-scripts allow-same-origin for attribute sandbox on element iframe”: Setting both allow-scripts and allow-same-origin is not recommended, because it effectively enables an embedded page to break out of all sandboxing.': {
3515
+ 'Potentially bad value allow-scripts allow-same-origin for attribute sandbox on element iframe: Setting both allow-scripts and allow-same-origin is not recommended, because it effectively enables an embedded page to break out of all sandboxing.': {
3504
3516
  quality: 1,
3505
3517
  what: 'iframe element has vulnerable sandbox="allow-scripts allow-same-origin"'
3506
3518
  }
@@ -3585,6 +3597,10 @@ const groups = {
3585
3597
  quality: 1,
3586
3598
  what: 'attribute on this element has an invalid value'
3587
3599
  },
3600
+ '^Bad value .+ for the attribute .+$': {
3601
+ quality: 1,
3602
+ what: 'attribute has an invalid value'
3603
+ },
3588
3604
  '^Attribute .+ not allowed here.*$': {
3589
3605
  quality: 1,
3590
3606
  what: 'Attribute not allowed here'
@@ -3710,7 +3726,7 @@ const groups = {
3710
3726
  weight: 4,
3711
3727
  packages: {
3712
3728
  nuVal: {
3713
- 'Element div not allowed as child of element button in this context. (Suppressing further errors from this subtree.)': {
3729
+ 'Element div not allowed as child of element button in this context. (Suppressing further errors from this subtree.)': {
3714
3730
  quality: 1,
3715
3731
  what: 'div element has a button element as its parent'
3716
3732
  }
@@ -3721,7 +3737,7 @@ const groups = {
3721
3737
  weight: 4,
3722
3738
  packages: {
3723
3739
  nuVal: {
3724
- 'Element p not allowed as child of element strong in this context. (Suppressing further errors from this subtree.)': {
3740
+ 'Element p not allowed as child of element strong in this context. (Suppressing further errors from this subtree.)': {
3725
3741
  quality: 1,
3726
3742
  what: 'p element has a strong element as its parent'
3727
3743
  }
@@ -3732,19 +3748,19 @@ const groups = {
3732
3748
  weight: 4,
3733
3749
  packages: {
3734
3750
  nuVal: {
3735
- 'Element style not allowed as child of element body in this context. (Suppressing further errors from this subtree.)': {
3751
+ 'Element style not allowed as child of element body in this context. (Suppressing further errors from this subtree.)': {
3736
3752
  quality: 1,
3737
3753
  what: 'style element not allowed as a child of the body element'
3738
3754
  },
3739
- 'Element style not allowed as child of element div in this context. (Suppressing further errors from this subtree.)': {
3755
+ 'Element style not allowed as child of element div in this context. (Suppressing further errors from this subtree.)': {
3740
3756
  quality: 1,
3741
3757
  what: 'style element not allowed as a child of this div element'
3742
3758
  },
3743
- 'Element style not allowed as child of element main in this context. (Suppressing further errors from this subtree.)': {
3759
+ 'Element style not allowed as child of element main in this context. (Suppressing further errors from this subtree.)': {
3744
3760
  quality: 1,
3745
3761
  what: 'style element not allowed as a child of this main element'
3746
3762
  },
3747
- 'Element style not allowed as child of element footer in this context. (Suppressing further errors from this subtree.)': {
3763
+ 'Element style not allowed as child of element footer in this context. (Suppressing further errors from this subtree.)': {
3748
3764
  quality: 1,
3749
3765
  what: 'style element not allowed as a child of this footer element'
3750
3766
  }
@@ -4010,35 +4026,39 @@ const groups = {
4010
4026
  }
4011
4027
  },
4012
4028
  nuVal: {
4013
- 'The charset attribute on the script element is obsolete.': {
4029
+ 'The charset attribute on the script element is obsolete.': {
4014
4030
  quality: 1,
4015
4031
  what: 'charset attribute is obsolete on a script element'
4016
4032
  },
4017
- 'The only allowed value for the charset attribute for the script element is utf-8”. (But the attribute is not needed and should be omitted altogether.)': {
4033
+ 'The only allowed value for the charset attribute for the script element is utf-8. (But the attribute is not needed and should be omitted altogether.)': {
4018
4034
  quality: 1,
4019
4035
  what: 'charset attribute has a value other than utf-8 and is unnecessary'
4020
4036
  },
4021
- 'The language attribute on the script element is obsolete. You can safely omit it.': {
4037
+ 'The language attribute on the script element is obsolete. You can safely omit it.': {
4022
4038
  quality: 1,
4023
4039
  what: 'language attribute is obsolete on a script element'
4024
4040
  },
4025
- 'The language attribute on the script element is obsolete. Use the type attribute instead.': {
4041
+ 'The language attribute on the script element is obsolete. Use the type attribute instead.': {
4026
4042
  quality: 1,
4027
4043
  what: 'language attribute is obsolete on a script element'
4028
4044
  },
4029
- 'The “frameborder” attribute on the “iframe” element is obsolete. Use CSS instead.': {
4045
+ 'Using the meta element to specify the document-wide default language is obsolete. Consider specifying the language on the root element instead.': {
4046
+ quality: 1,
4047
+ what: 'language declaration in a meta element is obsolete'
4048
+ },
4049
+ 'The frameborder attribute on the iframe element is obsolete. Use CSS instead.': {
4030
4050
  quality: 1,
4031
4051
  what: 'frameborder attribute is obsolete'
4032
4052
  },
4033
- 'The name attribute is obsolete. Consider putting an id attribute on the nearest container instead.': {
4053
+ 'The name attribute is obsolete. Consider putting an id attribute on the nearest container instead.': {
4034
4054
  quality: 1,
4035
4055
  what: 'name attribute is obsolete'
4036
4056
  },
4037
- 'The allowtransparency attribute on the iframe element is obsolete. Use CSS instead.': {
4057
+ 'The allowtransparency attribute on the iframe element is obsolete. Use CSS instead.': {
4038
4058
  quality: 1,
4039
4059
  what: 'allowtransparency attribute on an iframe element is obsolete'
4040
4060
  },
4041
- 'The scrolling attribute on the iframe element is obsolete. Use CSS instead.': {
4061
+ 'The scrolling attribute on the iframe element is obsolete. Use CSS instead.': {
4042
4062
  quality: 1,
4043
4063
  what: 'scrolling attribute on an iframe element is obsolete'
4044
4064
  }
@@ -4055,31 +4075,31 @@ const groups = {
4055
4075
  weight: 3,
4056
4076
  packages: {
4057
4077
  nuVal: {
4058
- 'CSS: “-webkit-box-flex”: Parse Error.': {
4078
+ 'CSS: -webkit-box-flex: Parse Error.': {
4059
4079
  quality: 1,
4060
4080
  what: 'Invalid -webkit-box-flex in CSS'
4061
4081
  },
4062
- 'CSS: “-webkit-flex”: Parse Error.': {
4082
+ 'CSS: -webkit-flex: Parse Error.': {
4063
4083
  quality: 1,
4064
4084
  what: 'Invalid -webkit-flex in CSS'
4065
4085
  },
4066
- 'CSS: “-ms-flex”: Parse Error.': {
4086
+ 'CSS: -ms-flex: Parse Error.': {
4067
4087
  quality: 1,
4068
4088
  what: 'Invalid -ms-flex in CSS'
4069
4089
  },
4070
- 'CSS: “-moz-box-flex”: Parse Error.': {
4090
+ 'CSS: -moz-box-flex: Parse Error.': {
4071
4091
  quality: 1,
4072
4092
  what: 'Invalid -moz-box-flex in CSS'
4073
4093
  },
4074
- 'CSS: flex”: Parse Error.': {
4094
+ 'CSS: flex: Parse Error.': {
4075
4095
  quality: 1,
4076
4096
  what: 'Invalid flex in CSS'
4077
4097
  },
4078
- '^CSS: cursor”: .+ is not a cursor value.*$': {
4098
+ '^CSS: cursor: .+ is not a cursor value.*$': {
4079
4099
  quality: 1,
4080
4100
  what: 'Invalid cursor in CSS'
4081
4101
  },
4082
- '^CSS: transform”: .+ is not a transform value.*$': {
4102
+ '^CSS: transform: .+ is not a transform value.*$': {
4083
4103
  quality: 1,
4084
4104
  what: 'Invalid transform in CSS'
4085
4105
  },
@@ -4087,7 +4107,7 @@ const groups = {
4087
4107
  quality: 1,
4088
4108
  what: 'Invalid property in CSS'
4089
4109
  },
4090
- '^CSS: .+: only 0 can be a length”. You must put a unit after your number.*$': {
4110
+ '^CSS: .+: only 0 can be a length. You must put a unit after your number.*$': {
4091
4111
  quality: 1,
4092
4112
  what: 'Length in CSS is nonzero but has no unit'
4093
4113
  },
@@ -4095,7 +4115,7 @@ const groups = {
4095
4115
  quality: 1,
4096
4116
  what: 'Invalid CSS'
4097
4117
  },
4098
- 'Stray end tag head”.': {
4118
+ 'Stray end tag head.': {
4099
4119
  quality: 1,
4100
4120
  what: 'Invalid closing head tag'
4101
4121
  },
@@ -4198,7 +4218,7 @@ exports.scorer = async report => {
4198
4218
  if (verdict && rule) {
4199
4219
  const {ruleID} = rule;
4200
4220
  if (ruleID) {
4201
- // Add 4 per failure, 1 per warning (cantTell).
4221
+ // Add 4 per failure, 1 per warning (cantTell).
4202
4222
  addDetail(which, ruleID, verdict === 'failed' ? 4 : 1);
4203
4223
  }
4204
4224
  }
@@ -4283,7 +4303,7 @@ exports.scorer = async report => {
4283
4303
  items.forEach(issue => {
4284
4304
  const {ruleId, level} = issue;
4285
4305
  if (ruleId && level) {
4286
- // Add 4 per violation, 1 per warning (recommendation).
4306
+ // Add 4 per violation, 1 per warning (recommendation).
4287
4307
  addDetail(which, ruleId, level === 'violation' ? 4 : 1);
4288
4308
  }
4289
4309
  });
@@ -4329,7 +4349,7 @@ exports.scorer = async report => {
4329
4349
  testIDs.forEach(testID => {
4330
4350
  const {count} = items[testID];
4331
4351
  if (count) {
4332
- // Add 4 per error, 3 per contrast error, 1 per warning (alert).
4352
+ // Add 4 per error, 3 per contrast error, 1 per warning (alert).
4333
4353
  addDetail(
4334
4354
  which, `${issueClass[0]}:${testID}`, count * classScores[issueClass]
4335
4355
  );