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

Commit a9bff13

Browse files
feat: use requestIdleCallback when possible (#61)
This patch builds on #59 (hat tip to @agreene-coursera!!) and uses `requestIdleCallback` rather than `setTimeout` in environments that support it. If the host environment does not support `requestIdleCallback`, a shim will be used (via [`npmjs.com/requestidlecallback`](https://www.npmjs.com/package/requestidlecallback)). Closes #59.
1 parent f605d9d commit a9bff13

File tree

3 files changed

+74
-60
lines changed

3 files changed

+74
-60
lines changed

index.js

Lines changed: 67 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
/* global document, window, Promise */
22
var axeCore = require('axe-core');
3+
var rIC = require('requestidlecallback');
34
var after = require('./after');
5+
6+
var requestIdleCallback = rIC.request;
7+
var cancelIdleCallback = rIC.cancel;
8+
49
var React = undefined;
510
var ReactDOM = undefined;
611

@@ -11,7 +16,7 @@ var moderate = 'color:orange;font-weight:bold;';
1116
var minor = 'color:orange;font-weight:normal;';
1217
var defaultReset = 'font-color:black;font-weight:normal;';
1318

14-
var timer;
19+
var idleId;
1520
var timeout;
1621
var _createElement;
1722
var components = {};
@@ -108,75 +113,78 @@ function createDeferred() {
108113
}
109114

110115
function checkAndReport(node, timeout) {
111-
if (timer) {
112-
clearTimeout(timer);
113-
timer = undefined;
116+
if (idleId) {
117+
cancelIdleCallback(idleId);
118+
idleId = undefined;
114119
}
115120

116121
var deferred = createDeferred();
117122

118123
nodes.push(node);
119-
timer = setTimeout(function() {
120-
var n = getCommonParent(nodes);
121-
if (n.nodeName.toLowerCase() === 'html') {
122-
// if the only common parent is the body, then analyze the whole page
123-
n = document;
124-
}
125-
axeCore.run(n, { reporter: 'v2' }, function(error, results) {
126-
if (error) {
127-
return deferred.reject(error);
124+
idleId = requestIdleCallback(
125+
function() {
126+
var n = getCommonParent(nodes);
127+
if (n.nodeName.toLowerCase() === 'html') {
128+
// if the only common parent is the body, then analyze the whole page
129+
n = document;
128130
}
131+
axeCore.run(n, { reporter: 'v2' }, function(error, results) {
132+
if (error) {
133+
return deferred.reject(error);
134+
}
129135

130-
results.violations = results.violations.filter(function(result) {
131-
result.nodes = result.nodes.filter(function(node) {
132-
var key = node.target.toString() + result.id;
133-
var retVal = !cache[key];
134-
cache[key] = key;
135-
return retVal;
136+
results.violations = results.violations.filter(function(result) {
137+
result.nodes = result.nodes.filter(function(node) {
138+
var key = node.target.toString() + result.id;
139+
var retVal = !cache[key];
140+
cache[key] = key;
141+
return retVal;
142+
});
143+
return !!result.nodes.length;
136144
});
137-
return !!result.nodes.length;
138-
});
139-
if (results.violations.length) {
140-
console.group('%cNew aXe issues', serious);
141-
results.violations.forEach(function(result) {
142-
var fmt;
143-
switch (result.impact) {
144-
case 'critical':
145-
fmt = critical;
146-
break;
147-
case 'serious':
148-
fmt = serious;
149-
break;
150-
case 'moderate':
151-
fmt = moderate;
152-
break;
153-
case 'minor':
154-
fmt = minor;
155-
break;
156-
default:
157-
fmt = minor;
158-
break;
159-
}
160-
console.groupCollapsed(
161-
'%c%s: %c%s %s',
162-
fmt,
163-
result.impact,
164-
defaultReset,
165-
result.help,
166-
result.helpUrl
167-
);
168-
result.nodes.forEach(function(node) {
169-
failureSummary(node, 'any');
170-
failureSummary(node, 'none');
145+
if (results.violations.length) {
146+
console.group('%cNew aXe issues', serious);
147+
results.violations.forEach(function(result) {
148+
var fmt;
149+
switch (result.impact) {
150+
case 'critical':
151+
fmt = critical;
152+
break;
153+
case 'serious':
154+
fmt = serious;
155+
break;
156+
case 'moderate':
157+
fmt = moderate;
158+
break;
159+
case 'minor':
160+
fmt = minor;
161+
break;
162+
default:
163+
fmt = minor;
164+
break;
165+
}
166+
console.groupCollapsed(
167+
'%c%s: %c%s %s',
168+
fmt,
169+
result.impact,
170+
defaultReset,
171+
result.help,
172+
result.helpUrl
173+
);
174+
result.nodes.forEach(function(node) {
175+
failureSummary(node, 'any');
176+
failureSummary(node, 'none');
177+
});
178+
console.groupEnd();
171179
});
172180
console.groupEnd();
173-
});
174-
console.groupEnd();
175-
}
181+
}
176182

177-
deferred.resolve();
178-
});
179-
}, timeout);
183+
deferred.resolve();
184+
});
185+
},
186+
{ timeout: timeout }
187+
);
180188

181189
return deferred.promise;
182190
}

package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
"author": "Dylan Barrell (dylan@barrell.com)",
3737
"license": "MPL-2.0",
3838
"dependencies": {
39-
"axe-core": "^3.0.0"
39+
"axe-core": "^3.0.0",
40+
"requestidlecallback": "^0.3.0"
4041
},
4142
"devDependencies": {
4243
"cypress": "^3.0.3",

0 commit comments

Comments
 (0)