Page MenuHomeSealhub
Authored By
kuba-orlik
Jun 1 2024, 19:30
Size
17 KB
Referenced Files
None
Subscribers
None
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.register = void 0;
const axe_core_1 = require("axe-core");
const utils_types_1 = require("@hint/utils-types");
const utils_network_1 = require("@hint/utils-network");
const i18n_import_1 = require("../i18n.import");
/**
* Accumulates registrations via 'can-evaluate::script' until 'scan::end'.
* Groups registrations by unique engine key, then by resource URL.
* Ensures only registrations for the same resource in the same scan are
* processed together in a single execution of `axe-core`.
*/
const registrationMap = new Map();
const getElement = (context, node) => {
var _a;
let selector = node.target[0];
// Contrary to types, axe-core can return an array of strings. Take the first.
/* istanbul ignore next */
if (Array.isArray(selector)) {
selector = selector[0];
}
return (_a = context.pageDOM) === null || _a === void 0 ? void 0 : _a.querySelector(selector);
};
/** Validate if an axe check result has data associated with it. */
const hasCheckData = (result) => {
return !!result.data;
};
/** Retrieve the message from an axe check result. */
const toCheckMessage = (result) => {
return result.message;
};
/**
* Combine only the node sub-check results containing data to
* create a summary. This avoids including sub-check messages
* stating static facts which are typically redundant with the
* help text for a rule.
*
* E.g. color contrast includes specific data about the calculated
* contrast value whereas checking for the lang on <html> just
* restates that the lang attribute was not found.
*/
const getSummary = (node) => {
const summary = [...node.all, ...node.any, ...node.none]
.filter(hasCheckData)
.map(toCheckMessage)
.join(' ');
return summary;
};
/**
* Save a registration to process in a batched call to `axe-core` later.
*/
const queueRegistration = (registration, map) => {
const engineKey = registration.context.engineKey;
const resource = registration.event.resource;
const registrationsByResource = map.get(engineKey) || new Map();
const registrations = registrationsByResource.get(resource) || [];
registrations.push(registration);
registrationsByResource.set(resource, registrations);
map.set(engineKey, registrationsByResource);
};
/**
* Retrieve the registrations for a particular engine instance and resource.
* Removes returned registrations from the map as they are no longer needed.
*/
const useRegistrations = (engineKey, resource, map) => {
const registrationsByResource = map.get(engineKey);
if (!registrationsByResource) {
return null;
}
const registrations = registrationsByResource.get(resource);
/* istanbul ignore next */
if (!registrations) {
return null;
}
registrationsByResource.delete(resource);
if (!registrationsByResource.size) {
map.delete(engineKey);
}
return registrations;
};
/* istanbul ignore next */
const toSeverity = (impact) => {
if (impact === 'minor') {
return utils_types_1.Severity.hint;
}
if (impact === 'moderate' || impact === 'serious') {
return utils_types_1.Severity.warning;
}
if (impact === 'critical') {
return utils_types_1.Severity.error;
}
// In case axe adds a new `impact` that is not tracked above
return utils_types_1.Severity.warning;
};
const withQuotes = (ruleId) => {
return `'${ruleId}'`;
};
const evaluateAxe = async (context, event, rules) => {
const { document, resource } = event;
/**
* iframes scan is ignored for local files due to error:
* 'allowedOrigins value "null" is not a valid origin'
*
* This is caused by an axe-core bug which is currently tracked here:
* https://github.com/dequelabs/axe-core/issues/3002
*/
const uri = (0, utils_network_1.getAsUri)(resource);
const shouldScanIframes = !(uri && uri.protocol.includes('file'));
/* istanbul ignore next */
try {
const target = document.isFragment ?
'document.body' :
'document';
return await context.evaluate(`(function(module) {
${axe_core_1.source}
var target = ${target};
return window.axe.run(target, {
iframes: ${shouldScanIframes},
runOnly: {
type: 'rule',
values: [${rules.map(withQuotes).join(',')}]
}
});
})()`);
}
catch (e) {
const err = e;
let message;
console.error(`Running axe-core failed: ${err.message}\n${err.stack}`);
if (err.message.includes('evaluation exceeded')) {
message = (0, i18n_import_1.getMessage)('notFastEnough', context.language);
}
else {
message = (0, i18n_import_1.getMessage)('errorExecuting', context.language, err.message);
}
message = (0, i18n_import_1.getMessage)('tryAgainLater', context.language, message);
context.report(resource, message, { severity: utils_types_1.Severity.warning });
return null;
}
};
const normalizeOptions = (options) => {
if (Array.isArray(options)) {
const normalizedOptions = options.reduce((newOptions, axeRuleId) => {
newOptions[axeRuleId] = 'default';
return newOptions;
}, {});
return normalizedOptions;
}
return options || {};
};
/**
* Register a given set of axe rules to be queued for evaluation on
* `can-evaluate::script`. These rules will be aggregated across axe
* sub-hints and executed in a single batch for a given resource on
* `scan::end` (for performance). Results will then be split out and
* reported back via their original context.
*/
const register = (context, rules, disabled) => {
const options = normalizeOptions(context.hintOptions);
const { engineKey } = context;
const enabledRules = rules.filter((rule) => {
if (options[rule]) {
return options[rule] !== 'off';
}
return !disabled.includes(rule);
});
context.on('traverse::end', (event) => {
queueRegistration({ context, enabledRules, event, options }, registrationMap);
});
// Used when we have to evaluate axe in a different context (e.g. connector-puppeteer and nearly everything else).
context.on('scan::end', async ({ resource }) => {
var _a;
const registrations = useRegistrations(engineKey, resource, registrationMap);
if (!registrations) {
return;
}
const ruleToRegistration = new Map();
for (const registration of registrations) {
for (const rule of registration.enabledRules) {
ruleToRegistration.set(rule, registration);
}
}
const document = registrations[0].event.document;
const rules = Array.from(ruleToRegistration.keys());
let result = null;
if (document.defaultView) {
// If we're in the same context as the document, run axe directly (e.g. utils-worker).
const target = document.isFragment ? document.body : document.documentElement;
result = await (0, axe_core_1.run)(target, {
runOnly: {
type: 'rule',
values: rules
}
});
}
else {
// Otherwise evaluate axe in the provided context (e.g. connector-puppeter, everything else).
result = await evaluateAxe(context, { document, resource }, rules);
}
/* istanbul ignore next */
if (!result || !Array.isArray(result.violations)) {
throw new Error(`Unable to parse axe results ${result}`);
}
for (const violation of result.violations) {
for (const node of violation.nodes) {
const summary = getSummary(node);
const message = summary ? `${violation.help}: ${summary}` : violation.help;
const registration = ruleToRegistration.get(violation.id);
const element = getElement(context, node);
const ruleSeverity = (_a = utils_types_1.Severity[registration.options[violation.id]]) !== null && _a !== void 0 ? _a : utils_types_1.Severity.default;
const forceSeverity = ruleSeverity !== utils_types_1.Severity.default;
const severity = !forceSeverity ?
toSeverity(violation.impact) :
ruleSeverity;
registration.context.report(resource, message, {
documentation: [{
link: violation.helpUrl,
text: (0, i18n_import_1.getMessage)('learnMore', context.language)
}],
element,
forceSeverity,
severity,
codeSnippet: node.html,
codeLanguage: "html"
});
}
}
});
};
exports.register = register;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWwvYXhlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUEwSDtBQUsxSCxtREFBNkM7QUFDN0MsdURBQStDO0FBRS9DLGdEQUE0QztBQWlCNUM7Ozs7O0dBS0c7QUFDSCxNQUFNLGVBQWUsR0FBb0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUVuRCxNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQW9CLEVBQUUsSUFBbUIsRUFBa0MsRUFBRTs7SUFDN0YsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5Qiw4RUFBOEU7SUFDOUUsMEJBQTBCO0lBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN6QixRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFCO0lBRUQsT0FBTyxNQUFBLE9BQU8sQ0FBQyxPQUFPLDBDQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwRCxDQUFDLENBQUM7QUFFRixtRUFBbUU7QUFDbkUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFtQixFQUFXLEVBQUU7SUFDbEQsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztBQUN6QixDQUFDLENBQUM7QUFFRixxREFBcUQ7QUFDckQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFtQixFQUFVLEVBQUU7SUFDbkQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFCLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBbUIsRUFBVSxFQUFFO0lBQy9DLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FD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

File Metadata

Mime Type
text/html
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
492789
Custom Alt Text
Forked in https://github.com/webhintio/hint/pull/5876/files. This is supposed to be a drop-in replacement for the axe.js file until upstream merges this
Default Alt Text
axe.js (17 KB)

Event Timeline

kuba-orlik changed the visibility from "All Users" to "Public (No Login Required)".Jun 1 2024, 19:31
kuba-orlik set the alternate text for this file to Forked in https://github.com/webhintio/hint/pull/5876/files. This is supposed to be a drop-in replacement for the axe.js file until upstream merges this.