blob: d82e840e74f108f660f0103d2255e509e082a676 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview using private properties isn't a Closure violation in tests.
* @suppress {accessControls}
*/
// These rules are disabled for one or more of the following reasons:
// * The rule is slow enough to cause flaky timeouts.
// * The rule has known issues.
// * The rule is low value so we disable it to improve overall test time.
// For performance issues see:
//
const DISABLED_RULES = {
// Slow rules
// https://github.com/dequelabs/axe-core/blob/develop/doc/API.md#section-4-performance
// (more performance investigation) https://github.com/dequelabs/axe-core/pull/1503
'aria-hidden-focus': {
enabled: false,
},
'aria-input-field-name': {
enabled: false,
},
'aria-toggle-field-name': {
enabled: false,
},
'color-contrast': {
enabled: false,
},
'image-redundant-alt': {
enabled: false,
},
// Rules with issues
// https://github.com/dequelabs/axe-core/issues/1444
'aria-required-children': {
enabled: false,
},
// Low value rules
'aria-allowed-role': {
enabled: false,
},
'aria-dpub-role-fallback': {
enabled: false,
},
'audio-caption': {
enabled: false,
},
'blink': {
enabled: false,
},
'form-field-multiple-labels': {
enabled: false,
},
'frame-tested': {
enabled: false,
},
'html-has-lang': {
enabled: false,
},
'html-lang-valid': {
enabled: false,
},
'html-xml-lang-mismatch': {
enabled: false,
},
'landmark-banner-is-top-level': {
enabled: false,
},
'landmark-complementary-is-top-level': {
enabled: false,
},
'landmark-contentinfo-is-top-level': {
enabled: false,
},
'landmark-main-is-top-level': {
enabled: false,
},
'landmark-no-duplicate-banner': {
enabled: false,
},
'landmark-no-duplicate-contentinfo': {
enabled: false,
},
'landmark-one-main': {
enabled: false,
},
'landmark-unique': {
enabled: false,
},
'marquee': {
enabled: false,
},
'meta-refresh': {
enabled: false,
},
'meta-viewport': {
enabled: false,
},
'meta-viewport-large': {
enabled: false,
},
'object-alt': {
enabled: false,
},
'page-has-heading-one': {
enabled: false,
},
'scrollable-region-focusable': {
enabled: false,
},
'video-caption': {
enabled: false,
},
'video-description': {
enabled: false,
},
'valid-lang': {
enabled: false,
},
};
const DEFAULT_CONFIG = {
checks: [
// This is a workaround for a bug in our version of axe-core
// which does not support aria-placeholder.
// Any attribute included in the options array will be
// ignored by the 'aria-valid-attr' rule.
// This should be removed after axe-core is updated.
// See: https://github.com/dequelabs/axe-core/issues/1457
{id: 'aria-valid-attr', options: ['aria-placeholder']}
],
runOnly: {type: 'tags', values: {include: ['wcag2a', 'best-practice'], exclude: ['experimental']}}
};
AxeCoreTestRunner.processAxeResult = function(violations) {
const result = violations.map(function(rule) {
return {
ruleDescription: rule.description,
helpUrl: rule.helpUrl,
ruleId: rule.id,
impact: rule.impact,
failedNodes: AxeCoreTestRunner.processAxeResultNodesArray(rule.nodes)
};
});
return JSON.stringify(result, undefined, 2);
};
AxeCoreTestRunner.processAxeResultNodesArray = function(nodes) {
const list = nodes.map(function(node) {
return {
target: node.target,
html: node.html,
failureSummary: node.failureSummary,
};
});
return list;
};
AxeCoreTestRunner.runValidation = async function(element, rules, config) {
axe.configure({...DEFAULT_CONFIG, ...config});
try {
const results = await axe.run(element, {rules: {...DISABLED_RULES, ...rules}});
const violations = AxeCoreTestRunner.processAxeResult(results.violations);
TestRunner.addResult(`aXe violations: ${violations}\n`);
} catch (e) {
TestRunner.addResult(`aXe threw an error: '${e}'`);
}
};