Skip to content
This repository was archived by the owner on Mar 19, 2021. It is now read-only.

Commit 151c906

Browse files
fix: use a semaphore to avoid running axe concurrently (#33)
A previous commit (1d4bd8d) removed our pseudo-semaphore which prevented us from running aXe concurrently. This patch adds back our "timer" semaphore and ensures we do not can `axe.run()` more than once on the same tick. Closes #32.
1 parent 1893f39 commit 151c906

File tree

1 file changed

+35
-8
lines changed

1 file changed

+35
-8
lines changed

index.js

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ var moderate = 'color:orange;font-weight:bold;';
1111
var minor = 'color:orange;font-weight:normal;';
1212
var defaultReset = 'font-color:black;font-weight:normal;';
1313

14+
var timer;
15+
var timeout;
1416
var _createElement;
1517
var components = {};
1618
var nodes = [];
@@ -92,16 +94,37 @@ function failureSummary(node, key) {
9294
}
9395
}
9496

95-
function checkAndReport(node) {
97+
function createDeferred () {
98+
var deferred = {};
99+
100+
deferred.promise = new Promise(function (resolve, reject) {
101+
deferred.resolve= resolve
102+
deferred.reject = reject
103+
})
104+
105+
return deferred;
106+
}
107+
108+
function checkAndReport(node, timeout) {
109+
if (timer) {
110+
clearTimeout(timer);
111+
timer = undefined;
112+
}
113+
114+
var deferred = createDeferred()
115+
96116
nodes.push(node);
97-
return new Promise(function(res, rej) {
117+
timer = setTimeout(function () {
98118
var n = getCommonParent(nodes);
99119
if (n.nodeName.toLowerCase() === 'html') {
100120
// if the only common parent is the body, then analyze the whole page
101121
n = document;
102122
}
103123
axeCore.run(n, { reporter: 'v2' }, function (error, results) {
104-
if (error) { throw rej(error); }
124+
if (error) {
125+
return deferred.reject(error)
126+
}
127+
105128
results.violations = results.violations.filter(function (result) {
106129
result.nodes = result.nodes.filter(function (node) {
107130
var key = node.target.toString() + result.id;
@@ -141,16 +164,19 @@ function checkAndReport(node) {
141164
});
142165
console.groupEnd();
143166
}
144-
res();
167+
168+
deferred.resolve()
145169
});
146-
});
170+
}, timeout);
171+
172+
return deferred.promise;
147173
}
148174

149175
function checkNode(component) {
150176
var node = ReactDOM.findDOMNode(component);
151177

152178
if (node) {
153-
checkAndReport(node);
179+
checkAndReport(node, timeout);
154180
}
155181
}
156182

@@ -166,9 +192,10 @@ function addComponent(component) {
166192
}
167193
}
168194

169-
var reactAxe = function reactAxe(_React, _ReactDOM, conf) {
195+
var reactAxe = function reactAxe(_React, _ReactDOM, _timeout, conf) {
170196
React = _React;
171197
ReactDOM = _ReactDOM;
198+
timeout = _timeout;
172199

173200
if (conf) {
174201
axeCore.configure(conf);
@@ -198,7 +225,7 @@ var reactAxe = function reactAxe(_React, _ReactDOM, conf) {
198225
};
199226
}
200227

201-
return checkAndReport(document.body);
228+
return checkAndReport(document.body, timeout);
202229
};
203230

204231
module.exports = reactAxe;

0 commit comments

Comments
 (0)