Skip to content

Commit 4498680

Browse files
authored
fix(label): Prevent label rule from crashing on input without type #678 (#730)
1 parent 9c7b9f1 commit 4498680

File tree

4 files changed

+67
-14
lines changed

4 files changed

+67
-14
lines changed

lib/rules/label-matches.js

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
// :not([type='hidden'])
2-
// :not([type='image'])
3-
// :not([type='button'])
4-
// :not([type='submit'])
5-
// :not([type='reset'])
6-
if (node.nodeName.toLowerCase() !== 'input') {
1+
if (node.nodeName.toLowerCase() !== 'input' ||
2+
node.hasAttribute('type') === false) {
73
return true;
84
}
9-
var t = node.getAttribute('type').toLowerCase();
10-
if (t === 'hidden' || t === 'image' || t === 'button' || t === 'submit' ||
11-
t === 'reset') {
12-
return false;
13-
}
14-
return true;
5+
6+
var type = node.getAttribute('type').toLowerCase();
7+
return ['hidden', 'image', 'button', 'submit', 'reset'].includes(type) === false;

test/integration/rules/label-title-only/label-title-only.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@
2929
</label>
3030

3131
<input type="text" id="pass7" aria-describedby="hi" aria-label="Hi">
32-
<input type="text" id="pass8" aria-describedby="hi" aria-labelledby="hi">
32+
<input id="pass8" aria-describedby="hi" aria-labelledby="hi">
3333

3434
</form>

test/integration/rules/label/label.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<label for="pass11">Label</label><select id="pass11"></select>
2929
<label for="pass12">Label</label><textarea id="pass12"></textarea>
3030

31-
<input type="text" id="pass13" title="Label">
31+
<input id="pass13" title="Label">
3232
<select id="pass14" title="Label"></select>
3333
<textarea id="pass15" title="Label"></textarea>
3434

test/rule-matches/label-matches.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
describe('label-matches', function () {
2+
'use strict';
3+
4+
var fixture = document.getElementById('fixture');
5+
var rule;
6+
7+
beforeEach(function () {
8+
rule = axe._audit.rules.find(function (rule) {
9+
return rule.id === 'label';
10+
});
11+
});
12+
13+
it('returns true for non-input elements', function () {
14+
fixture.innerHTML = '<textarea></textarea>';
15+
var target = fixture.querySelector('textarea');
16+
17+
assert.isTrue(rule.matches(target));
18+
});
19+
20+
it('returns true for input elements without type', function () {
21+
fixture.innerHTML = '<input />';
22+
var target = fixture.querySelector('input');
23+
24+
assert.isTrue(rule.matches(target));
25+
});
26+
27+
it('returns false for input buttons', function () {
28+
fixture.innerHTML = '<input type="button" />' +
29+
'<input type="submit" />' +
30+
'<input type="image" />' +
31+
'<input type="reset" />';
32+
33+
var targets = Array.from(fixture.querySelectorAll('input'));
34+
targets.forEach(function (target) {
35+
assert.isFalse(rule.matches(target));
36+
});
37+
});
38+
39+
it('returns false for input elements type=hidden', function () {
40+
fixture.innerHTML = '<input type="hidden" />';
41+
var target = fixture.querySelector('input');
42+
43+
assert.isFalse(rule.matches(target));
44+
});
45+
46+
it('returns true for other input types', function () {
47+
fixture.innerHTML = '<input type="text" />' +
48+
'<input type="password" />' +
49+
'<input type="url" />' +
50+
'<input type="range" />' +
51+
'<input type="date" />' +
52+
'<input type="checkbox" />' +
53+
'<input type="radio" />';
54+
55+
var targets = Array.from(fixture.querySelectorAll('input'));
56+
targets.forEach(function (target) {
57+
assert.isTrue(rule.matches(target));
58+
});
59+
});
60+
});

0 commit comments

Comments
 (0)