-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathautocomplete-matches.js
More file actions
153 lines (133 loc) · 5.18 KB
/
autocomplete-matches.js
File metadata and controls
153 lines (133 loc) · 5.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
describe('autocomplete-matches', function () {
'use strict';
const fixture = document.getElementById('fixture');
const queryFixture = axe.testUtils.queryFixture;
const rule = axe.utils.getRule('autocomplete-valid');
afterEach(function () {
fixture.innerHTML = '';
});
it('is a function', function () {
assert.isFunction(rule.matches);
});
it('returns true for input elements', function () {
const vNode = queryFixture('<input id="target" autocomplete="foo">');
assert.isTrue(rule.matches(null, vNode));
});
it('returns true for select elements', function () {
const vNode = queryFixture('<select id="target" autocomplete="foo">');
assert.isTrue(rule.matches(null, vNode));
});
it('returns true for textarea elements', function () {
const vNode = queryFixture('<textarea id="target" autocomplete="foo">');
assert.isTrue(rule.matches(null, vNode));
});
it('returns false for buttons elements', function () {
const vNode = queryFixture('<button id="target" autocomplete="foo">');
assert.isFalse(rule.matches(null, vNode));
});
it('should return false for non-form field elements', function () {
const vNode = queryFixture('<div id="target" autocomplete="foo">');
assert.isFalse(rule.matches(null, vNode));
});
it('returns false for input buttons', function () {
['reset', 'submit', 'button'].forEach(function (type) {
const vNode = queryFixture(
'<input id="target" type="' + type + '" autocomplete="foo">'
);
assert.isFalse(rule.matches(null, vNode));
});
});
it('returns false for elements with an empty autocomplete', function () {
const vNode = queryFixture('<input id="target" autocomplete=" ">');
assert.isFalse(rule.matches(null, vNode));
});
it('returns false for intput[type=hidden]', function () {
const vNode = queryFixture(
'<input id="target" type="hidden" autocomplete="foo">'
);
assert.isFalse(rule.matches(null, vNode));
});
it('returns false for disabled fields', function () {
['input', 'select', 'textarea'].forEach(function (tagName) {
const vNode = queryFixture(
'<' + tagName + ' id="target" disabled autocomplete="foo">'
);
assert.isFalse(rule.matches(null, vNode));
});
});
it('returns false for aria-disabled=true fields', function () {
['input', 'select', 'textarea'].forEach(function (tagName) {
const vNode = queryFixture(
'<' + tagName + ' id="target" aria-disabled="true" autocomplete="foo">'
);
assert.isFalse(rule.matches(null, vNode));
});
});
it('returns true for aria-disabled=false fields', function () {
['input', 'select', 'textarea'].forEach(function (tagName) {
const vNode = queryFixture(
'<' + tagName + ' id="target" aria-disabled="false" autocomplete="foo">'
);
assert.isTrue(rule.matches(null, vNode));
});
});
it('returns false for non-widget roles with tabindex=-1', function () {
const nonWidgetRoles = ['application', 'fakerole', 'main'];
nonWidgetRoles.forEach(function (role) {
const vNode = queryFixture(
'<input id="target" role="' +
role +
'" tabindex="-1" autocomplete="foo">'
);
assert.isFalse(
rule.matches(null, vNode),
'Expect role=' + role + ' to be ignored when it has tabindex=-1'
);
});
});
it('returns true for form fields with a widget role with tabindex=-1', function () {
const nonWidgetRoles = ['button', 'menuitem', 'slider'];
nonWidgetRoles.forEach(function (role) {
const vNode = queryFixture(
'<input id="target" role="' +
role +
'" tabindex="-1" autocomplete="foo">'
);
assert.isTrue(rule.matches(null, vNode));
});
});
it('returns true for form fields with tabindex=-1', function () {
['input', 'select', 'textarea'].forEach(function (tagName) {
const vNode = queryFixture(
'<' + tagName + ' id="target" tabindex="-1" autocomplete="foo">'
);
assert.isTrue(rule.matches(null, vNode));
});
});
it('returns false for off screen and hidden form fields with tabindex=-1', function () {
const vNode = queryFixture(
'<div aria-hidden="true">' +
'<input id="target" tabindex="-1" style="position:absolute; top:-9999em" autocomplete="foo">' +
'</div>'
);
assert.isFalse(rule.matches(null, vNode));
});
it('returns false if readonly attribute is placed whether autocomplete is not valid', function () {
var vNode = queryFixture(
'<input readonly autocomplete="some invalid value" id="target" />'
);
assert.isFalse(rule.matches(null, vNode));
});
it('returns false if aria-readonly attribute is true whether autocomplete is not valid', function () {
var vNode = queryFixture(
'<input aria-readonly="true" autocomplete="some invalid value" id="target" />'
);
assert.isFalse(rule.matches(null, vNode));
});
it('returns true if aria-readonly attribute is false whether autocomplete is not valid', function () {
var vNode = queryFixture(
'<input aria-readonly="false" autocomplete="some invalid value" id="target" />'
);
assert.isTrue(rule.matches(null, vNode));
});
});