diff --git a/lib/rules/color-contrast-matches.js b/lib/rules/color-contrast-matches.js
index 6377556636..7fbf47be76 100644
--- a/lib/rules/color-contrast-matches.js
+++ b/lib/rules/color-contrast-matches.js
@@ -35,8 +35,12 @@ if (nodeName === 'FIELDSET' && node.disabled || axe.commons.dom.findUp(node, 'fi
var nodeParentLabel = axe.commons.dom.findUp(node, 'label');
if (nodeName === 'LABEL' || nodeParentLabel) {
var relevantNode = node;
+ var relevantVirtualNode = virtualNode;
+
if (nodeParentLabel) {
relevantNode = nodeParentLabel;
+ // we need an input candidate from a parent to account for label children
+ relevantVirtualNode = axe.utils.getNodeFromTree(axe._tree[0], nodeParentLabel);
}
// explicit label of disabled input
let doc = axe.commons.dom.getRootNode(relevantNode);
@@ -45,7 +49,7 @@ if (nodeName === 'LABEL' || nodeParentLabel) {
return false;
}
- var candidate = axe.utils.querySelectorAll(virtualNode, 'input:not([type="hidden"]):not([type="image"])' +
+ var candidate = axe.utils.querySelectorAll(relevantVirtualNode, 'input:not([type="hidden"]):not([type="image"])' +
':not([type="button"]):not([type="submit"]):not([type="reset"]), select, textarea');
if (candidate.length && candidate[0].actualNode.disabled) {
return false;
diff --git a/test/rule-matches/color-contrast-matches.js b/test/rule-matches/color-contrast-matches.js
index 77979cad30..a18d6a9ec5 100644
--- a/test/rule-matches/color-contrast-matches.js
+++ b/test/rule-matches/color-contrast-matches.js
@@ -149,7 +149,18 @@ describe('color-contrast-matches', function () {
var target = fixture.querySelector('input');
var tree = axe._tree = axe.utils.getFlattenedTree(fixture);
assert.isFalse(rule.matches(target, axe.utils.getNodeFromTree(tree[0], target)));
+ });
+ it('should not match a disabled implicit label child', function () {
+ fixture.innerHTML = '';
+ var target = fixture.querySelector('#target');
+ var tree = axe._tree = axe.utils.getFlattenedTree(fixture);
+ var result = rule.matches(target, axe.utils.getNodeFromTree(tree[0], target));
+ assert.isFalse(result);
});
it('should not match