nemo-accessibility
Version:
nemo-accessibility is a nemo plugin aimed to run accessibility scans during nemo tests. nemo-accessibility plugin uses axe-core, htmlcode smiffer and chrome engines to run accessibility scans on a given page or on a given element on a page.
170 lines (152 loc) • 6.98 kB
JavaScript
function chromeDevTool(ifrDoc){
//Chrome Developer Tools
//https://github.com/GoogleChrome/accessibility-developer-tools
var configuration = new axs.AuditConfiguration();
configuration.showUnsupportedRulesWarning = false;
configuration.scope = ifrDoc.body;
var results = axs.Audit.run(configuration);
var audit = results.map(function (result) {
console.log(result)
var DOMElements = result.elements;
var message = '';
if(result.result ==='FAIL'){
if (DOMElements !== undefined) {
var maxElements = Math.min(DOMElements.length, 5);
for (var i = 0; i < maxElements; i++) {
var el = DOMElements[i];
message += '\n';
try {
message += axs.utils.getQuerySelectorText(el);
} catch (err) {
message += ' tagName:' + el.tagName;
message += ' id:' + el.id;
}
}
}
return {
heading: result.rule.heading,
result: result.result,
severity: result.rule.severity,
elements: message
};
} //Return Failures only
});
// var report = axs.Audit.createReport(results);
for (var i=audit.length;i--;){
if (audit[i] == null) audit.splice(i,1);
}
var chromeDiv = document.getElementById('chromeres');
var chromeres = document.createElement("div");
chromeres.setAttribute("id", "chromeres");
chromeres.appendChild( buildHtmlTable( audit ,'Chrome Accessibility Plugin','yes') );
chromeDiv.parentNode.replaceChild(chromeres, chromeDiv);
}
//Axe-core https://github.com/dequelabs/axe-core
function axeTool(ifrDoc){
axe.run(ifrDoc.body, function (err, results) {
// console.log(ifrDoc.body, results);
var violations = results.violations
for (var i=violations.length;i--;){
delete violations[i].helpUrl;
delete violations[i].tags;
// console.log(violations[i].nodes)
var nodes= violations[i].nodes
for (var j=nodes.length;j--;){
violations[i].target = JSON.stringify(nodes[j].target) +'<br>'+violations[i].target;
}
delete violations[i].nodes;
}
var axeDiv = document.getElementById('axeres');
var axeres = document.createElement("div");
axeres.setAttribute("id", "axeres");
axeres.appendChild( buildHtmlTable( results.violations ,'Axe validator from Deque','no' ) );
axeDiv.parentNode.replaceChild(axeres, axeDiv);
// window.stop();
});
}
//https://github.com/squizlabs/HTML_CodeSniffer.git
function htmlcsTool(ifrDoc, options){
var standard = options.standard || 'WCAG2A';
var source = ifrDoc.body;
// console.log(options.standard, source)
HTMLCS.process(standard, source, function() {
var msgs = HTMLCS.getMessages();
var content = [];
var heading = "";
var type = '';
var outerHTML = '';
var htmlcsDiv = document.getElementById('htmlcsres');
var htmlcsres = document.createElement("div");
htmlcsres.setAttribute("id", "htmlcsres");
htmlcsDiv.innerHTML='';
try {
var principles = {
'Principle1': 'Perceivable',
'Principle2': 'Operable',
'Principle3': 'Understandable',
'Principle4': 'Robust'
};
if (msgs.length === 0) {
content.push({'message':'No violations found'});
return;
}
var errors = 0;
var warnings = 0;
var notices = 0;
var count=1;
for (var i = 0; i < msgs.length; i++) {
var msg = msgs[i];
var temp_obj = {};
switch (msg.type) {
case HTMLCS.ERROR:
type = 'Error';
break;
case HTMLCS.WARNING:
type = 'Warning';
warnings++;
break;
case HTMLCS.NOTICE:
type = 'Notice';
notices++;
break;
default:
type = 'Unknown:' + msg.type +' ';
break;
}
if (msg.element.innerHTML && msg.element.innerHTML.length > 50) {
var outerHTML = msg.element.outerHTML.replace(msg.element.innerHTML, msg.element.innerHTML.substr(0, 50) + '...');
} else {
var outerHTML = msg.element.outerHTML;
}
// Get the success criterion so we can provide a link.
var msgParts = msg.code.split('.');
var principle = msgParts[1];
var sc = msgParts[3].split('_').slice(0, 3).join('_');
var techniques = msgParts[4];
techniques = techniques.split(',');
msgParts.shift();
msgParts.unshift('[Standard]');
var noStdMsgParts = msgParts.join('.');
// if(type !== "Warning" && type !== "Notice" && prtyArr.indexOf(priority) !=-1 ) { //&& prtyArr.indexOf(priority) === 0
errors += 1;
temp_obj["type"] = type.toLowerCase();
temp_obj["msg"] = msg.msg;
temp_obj["code"] = splitLine(outerHTML.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'), 30);
temp_obj["principle"] = '<a href="http://www.w3.org/TR/WCAG20/#' + principles[principle].toLowerCase() + '" target="_blank">' + principles[principle] + '</a>';
var technique='';
for (var j = 0; j < techniques.length; j++) {
technique += '<a href="http://www.w3.org/TR/WCAG20-TECHS/' + techniques[j] + '" target="_blank">' + techniques[j] + '</a>';
}
temp_obj["techniques"] = technique;
count++;
content.push(temp_obj);
// }
} //Closing for loop
} catch (e) {
console.log('Error:', e.toString());
}
htmlcsres.appendChild(buildHtmlTable(content , 'HTML CodeSniffer from SquizLabs','yes' ) );
htmlcsDiv.parentNode.replaceChild(htmlcsres, htmlcsDiv);
window.stop();
});
} //End htmlcsTool