Skip to content

Commit c7b3fa4

Browse files
committed
Iframe error merging logic added
1 parent 7b42677 commit c7b3fa4

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed

lib/core/public/load.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
/*global a11yEngine*/
12
import Audit from '../base/audit';
23
import cleanup from './cleanup';
34
import runRules from './run-rules';
45
import respondable from '../utils/respondable';
56
import nodeSerializer from '../utils/node-serializer';
7+
import mergeErrors from '../utils/merge-errors';
68

79
/**
810
* Sets up Rules, Messages and default options for Checks, must be invoked before attempting analysis
@@ -36,6 +38,21 @@ function runCommand(data, keepalive, callback) {
3638
(results, cleanupFn) => {
3739
// Serialize all DqElements
3840
results = nodeSerializer.mapRawResults(results);
41+
42+
//a11y-engine iframe rules error merging logic
43+
const errors = a11yEngine.getErrors();
44+
if (Object.keys(errors).length !== 0) {
45+
if (results[results.length - 1].errorsObj) {
46+
const error = results.pop();
47+
delete error.errorsObj;
48+
const mergedErrors = mergeErrors(error, errors);
49+
results.push({ ...mergedErrors, errorsObj: true });
50+
} else {
51+
results.push({ ...errors, errorsObj: true });
52+
}
53+
}
54+
a11yEngine.clearErrors();
55+
3956
resolve(results);
4057
// Cleanup AFTER resolve so that selectors can be generated
4158
cleanupFn();

lib/core/public/run-rules.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export default function runRules(context, options, resolve, reject) {
4141
a11yEngine.setup(options.a11yEngineConfig);
4242
}
4343

44-
if (context.frames.length && options.iframes !== false) {
44+
if (context.frames.length && options.iframes === true) {
4545
q.defer((res, rej) => {
4646
collectResultsFromFrames(context, options, 'rules', null, res, rej);
4747
});
@@ -64,6 +64,13 @@ export default function runRules(context, options, resolve, reject) {
6464

6565
// after should only run once, so ensure we are in the top level window
6666
if (context.initiator) {
67+
// Return a11y-engine errors when at top level window
68+
if (results[results.length - 1].errorsObj) {
69+
const error = results.pop();
70+
delete error.errorsObj;
71+
a11yEngine.mergeErrors(error);
72+
}
73+
6774
results = audit.after(results, options);
6875

6976
results.forEach(publishMetaData);

lib/core/utils/merge-errors.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Function to merge errors for a11y-engine.
2+
// Handles errors differently for check_errors and other errors.
3+
// It also adds the target selector to the errors for better identification.
4+
5+
function mergeErrors(mergedErrors, frameErrors, frameSpec) {
6+
for (const [key, value] of Object.entries(frameErrors)) {
7+
if (key === 'check_errors') {
8+
if (!mergedErrors[key]) {
9+
mergedErrors[key] = {};
10+
}
11+
12+
for (const [checkNameKey, checkNameValue] of Object.entries(value)) {
13+
// Add the target if not present. If present then append parents target.
14+
checkNameValue.forEach(checkNameValueError => {
15+
if (!checkNameValueError.target && frameSpec) {
16+
checkNameValueError.target = frameSpec?.selector;
17+
} else if (checkNameValueError.target && frameSpec) {
18+
checkNameValueError.target = [
19+
...frameSpec.selector,
20+
...checkNameValueError.target
21+
];
22+
}
23+
});
24+
if (mergedErrors[key][checkNameKey]) {
25+
mergedErrors[key][checkNameKey].push(...checkNameValue);
26+
} else {
27+
mergedErrors[key][checkNameKey] = Array.isArray(checkNameValue)
28+
? [...checkNameValue]
29+
: [checkNameValue];
30+
}
31+
}
32+
} else {
33+
// Add the target if not present. If present then append parents target.
34+
value.forEach(errorValue => {
35+
if (!errorValue.target && frameSpec) {
36+
errorValue.target = frameSpec?.selector;
37+
} else if (errorValue.target && frameSpec) {
38+
errorValue.target = [...frameSpec.selector, ...errorValue.target];
39+
}
40+
});
41+
if (mergedErrors[key]) {
42+
mergedErrors[key] = [...mergedErrors[key], ...value];
43+
} else {
44+
mergedErrors[key] = value;
45+
}
46+
}
47+
}
48+
49+
return mergedErrors;
50+
}
51+
52+
export default mergeErrors;

0 commit comments

Comments
 (0)