aria-api 0.2.7 → 0.4.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.
- package/README.md +20 -3
- package/dist/aria.js +799 -473
- package/index.js +4 -0
- package/lib/atree.js +90 -0
- package/lib/attrs.js +115 -0
- package/lib/constants.js +471 -253
- package/lib/name.js +31 -65
- package/lib/query.js +26 -121
- package/package.json +5 -4
- package/CHANGES.md +0 -102
- package/dist/aria.min.js +0 -1
- package/lib/util.js +0 -28
package/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
var query = require('./lib/query.js');
|
|
2
2
|
var name = require('./lib/name.js');
|
|
3
|
+
var atree = require('./lib/atree.js');
|
|
3
4
|
|
|
4
5
|
module.exports = {
|
|
5
6
|
getRole: query.getRole,
|
|
@@ -11,4 +12,7 @@ module.exports = {
|
|
|
11
12
|
querySelector: query.querySelector,
|
|
12
13
|
querySelectorAll: query.querySelectorAll,
|
|
13
14
|
closest: query.closest,
|
|
15
|
+
|
|
16
|
+
getParentNode: atree.getParentNode,
|
|
17
|
+
getChildNodes: atree.getChildNodes,
|
|
14
18
|
};
|
package/lib/atree.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
var attrs = require('./attrs');
|
|
2
|
+
|
|
3
|
+
var _getOwner = function(node) {
|
|
4
|
+
if (node.nodeType === node.ELEMENT_NODE && node.id) {
|
|
5
|
+
var owner = document.querySelector('[aria-owns~="' + CSS.escape(node.id) + '"]');
|
|
6
|
+
if (owner) {
|
|
7
|
+
return owner;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
var _getParentNode = function(node) {
|
|
13
|
+
return _getOwner(node) || node.parentNode;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
var detectLoop = function(node) {
|
|
17
|
+
var tmp = _getParentNode(node);
|
|
18
|
+
while (tmp) {
|
|
19
|
+
if (tmp === node) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
tmp = _getParentNode(tmp);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
var getOwner = function(node) {
|
|
27
|
+
if (node.nodeType === node.ELEMENT_NODE && node.id) {
|
|
28
|
+
var owner = document.querySelector('[aria-owns~="' + CSS.escape(node.id) + '"]');
|
|
29
|
+
if (owner && !detectLoop(node)) {
|
|
30
|
+
return owner;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
var getParentNode = function(node) {
|
|
36
|
+
return getOwner(node) || node.parentNode;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
var isHidden = function(node) {
|
|
40
|
+
return node.nodeType === node.ELEMENT_NODE && attrs.getAttribute(node, 'hidden');
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
var getChildNodes = function(node) {
|
|
44
|
+
var childNodes = [];
|
|
45
|
+
|
|
46
|
+
for (var i = 0; i < node.childNodes.length; i++) {
|
|
47
|
+
var child = node.childNodes[i];
|
|
48
|
+
if (!getOwner(child) && !isHidden(child)) {
|
|
49
|
+
childNodes.push(child);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (node.nodeType === node.ELEMENT_NODE) {
|
|
54
|
+
var owns = attrs.getAttribute(node, 'owns') || [];
|
|
55
|
+
for (var i = 0; i < owns.length; i++) {
|
|
56
|
+
var child = document.getElementById(owns[i]);
|
|
57
|
+
// double check with getOwner for consistency
|
|
58
|
+
if (child && getOwner(child) === node && !isHidden(child)) {
|
|
59
|
+
childNodes.push(child);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return childNodes;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
var walk = function(root, fn) {
|
|
68
|
+
fn(root);
|
|
69
|
+
getChildNodes(root).forEach(function(child) {
|
|
70
|
+
walk(child, fn);
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
var searchUp = function(node, test) {
|
|
75
|
+
var candidate = getParentNode(node);
|
|
76
|
+
if (candidate) {
|
|
77
|
+
if (test(candidate)) {
|
|
78
|
+
return candidate;
|
|
79
|
+
} else {
|
|
80
|
+
return searchUp(candidate, test);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
module.exports = {
|
|
86
|
+
'getParentNode': getParentNode,
|
|
87
|
+
'getChildNodes': getChildNodes,
|
|
88
|
+
'walk': walk,
|
|
89
|
+
'searchUp': searchUp,
|
|
90
|
+
};
|
package/lib/attrs.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
var constants = require('./constants.js');
|
|
2
|
+
|
|
3
|
+
// candidates can be passed for performance optimization
|
|
4
|
+
var getRole = function(el, candidates) {
|
|
5
|
+
if (el.hasAttribute('role')) {
|
|
6
|
+
return el.getAttribute('role');
|
|
7
|
+
}
|
|
8
|
+
for (var role in constants.roles) {
|
|
9
|
+
var selector = (constants.roles[role].selectors || []).join(',');
|
|
10
|
+
if (selector && (!candidates || candidates.includes(role)) && el.matches(selector)) {
|
|
11
|
+
return role;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (!candidates ||
|
|
16
|
+
candidates.includes('banner') ||
|
|
17
|
+
candidates.includes('contentinfo')) {
|
|
18
|
+
if (!el.matches(constants.scoped)) {
|
|
19
|
+
if (el.matches('header')) {
|
|
20
|
+
return 'banner';
|
|
21
|
+
}
|
|
22
|
+
if (el.matches('footer')) {
|
|
23
|
+
return 'contentinfo';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
var hasRole = function(el, roles) {
|
|
30
|
+
var candidates = [].concat.apply([], roles.map(function(role) {
|
|
31
|
+
return (constants.roles[role] || {}).subRoles || [role];
|
|
32
|
+
}));
|
|
33
|
+
var actual = getRole(el, candidates);
|
|
34
|
+
return candidates.includes(actual);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
var getAttribute = function(el, key) {
|
|
38
|
+
if (constants.attributeStrongMapping.hasOwnProperty(key)) {
|
|
39
|
+
var value = el[constants.attributeStrongMapping[key]];
|
|
40
|
+
if (value) {
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (key === 'readonly' && el.contentEditable) {
|
|
45
|
+
return false;
|
|
46
|
+
} else if (key === 'invalid' && el.checkValidity) {
|
|
47
|
+
return !el.checkValidity();
|
|
48
|
+
} else if (key === 'hidden') {
|
|
49
|
+
// workaround for chromium
|
|
50
|
+
if (el.matches('noscript')) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
var style = window.getComputedStyle(el);
|
|
54
|
+
if (style.display === 'none' || style.visibility === 'hidden') {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
var type = constants.attributes[key];
|
|
60
|
+
var raw = el.getAttribute('aria-' + key);
|
|
61
|
+
|
|
62
|
+
if (raw) {
|
|
63
|
+
if (type === 'bool') {
|
|
64
|
+
return raw === 'true';
|
|
65
|
+
} else if (type === 'tristate') {
|
|
66
|
+
return raw === 'true' ? true : raw === 'false' ? false : 'mixed';
|
|
67
|
+
} else if (type === 'bool-undefined') {
|
|
68
|
+
return raw === 'true' ? true : raw === 'false' ? false : undefined;
|
|
69
|
+
} else if (type === 'id-list') {
|
|
70
|
+
return raw.split(/\s+/);
|
|
71
|
+
} else if (type === 'integer') {
|
|
72
|
+
return parseInt(raw, 10);
|
|
73
|
+
} else if (type === 'number') {
|
|
74
|
+
return parseFloat(raw);
|
|
75
|
+
} else if (type === 'token-list') {
|
|
76
|
+
return raw.split(/\s+/);
|
|
77
|
+
} else {
|
|
78
|
+
return raw;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// TODO
|
|
83
|
+
// autocomplete
|
|
84
|
+
// contextmenu -> aria-haspopup
|
|
85
|
+
// indeterminate -> aria-checked="mixed"
|
|
86
|
+
// list -> aria-controls
|
|
87
|
+
|
|
88
|
+
if (key === 'level') {
|
|
89
|
+
for (var i = 1; i <= 6; i++) {
|
|
90
|
+
if (el.tagName.toLowerCase() === 'h' + i) {
|
|
91
|
+
return i;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
} else if (constants.attributeWeakMapping.hasOwnProperty(key)) {
|
|
95
|
+
return el[constants.attributeWeakMapping[key]];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (key in constants.attrsWithDefaults) {
|
|
99
|
+
var role = getRole(el);
|
|
100
|
+
var defaults = (constants.roles[role] || {}).defaults;
|
|
101
|
+
if (defaults && defaults.hasOwnProperty(key)) {
|
|
102
|
+
return defaults[key];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (type === 'bool' || type === 'tristate') {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
module.exports = {
|
|
112
|
+
getRole: getRole,
|
|
113
|
+
hasRole: hasRole,
|
|
114
|
+
getAttribute: getAttribute,
|
|
115
|
+
};
|