From e2a964207729d7c712819d67e0ed27aa688179b6 Mon Sep 17 00:00:00 2001 From: Marcy Sutton Date: Thu, 20 Jul 2017 13:07:29 -0700 Subject: [PATCH] feat: add shadow support to group-labelledby Closes https://github.com/dequelabs/axe-core/issues/426 --- lib/checks/forms/labelledby.js | 7 +++--- test/checks/forms/labelledby.js | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/lib/checks/forms/labelledby.js b/lib/checks/forms/labelledby.js index a06ddd7ac4..a9b3e84263 100644 --- a/lib/checks/forms/labelledby.js +++ b/lib/checks/forms/labelledby.js @@ -3,7 +3,8 @@ this.data({ type: node.getAttribute('type') }); -var matchingNodes = document.querySelectorAll('input[type="' + +var doc = axe.commons.dom.getRootNode(node); +var matchingNodes = doc.querySelectorAll('input[type="' + axe.commons.utils.escapeSelector(node.type) + '"][name="' + axe.commons.utils.escapeSelector(node.name) + '"]'); if (matchingNodes.length <= 1) { return true; @@ -15,9 +16,9 @@ return [].map.call(matchingNodes, function (m) { return l ? l.split(/\s+/) : []; }).reduce(function (prev, curr) { return prev.filter(function (n) { - return curr.indexOf(n) !== -1; + return curr.includes(n); }); }).filter(function (n) { - var labelNode = document.getElementById(n); + var labelNode = doc.getElementById(n); return labelNode && axe.commons.text.accessibleText(labelNode); }).length !== 0; diff --git a/test/checks/forms/labelledby.js b/test/checks/forms/labelledby.js index 6525fa4b61..0c5c16f83b 100644 --- a/test/checks/forms/labelledby.js +++ b/test/checks/forms/labelledby.js @@ -3,6 +3,8 @@ describe('group-labelledby', function () { var fixture = document.getElementById('fixture'); var fixtureSetup = axe.testUtils.fixtureSetup; + var shadowSupport = axe.testUtils.shadowSupport.v1; + var checkContext = { _data: null, data: function (d) { @@ -10,6 +12,10 @@ describe('group-labelledby', function () { } }; + beforeEach(function () { + axe._tree = undefined; + }); + afterEach(function () { fixture.innerHTML = ''; checkContext._data = null; @@ -114,6 +120,38 @@ describe('group-labelledby', function () { }); }); + (shadowSupport ? it : xit) + ('should return false if label is outside of shadow boundary', function () { + fixture.innerHTML = '

Label

'; + var shadowRoot = fixture.querySelector('#container').attachShadow({ mode: 'open' }); + shadowRoot.innerHTML = '' + + '' + + ''; + + var tree = axe._tree = axe.utils.getFlattenedTree(fixture); + var shadowContent = shadowRoot.querySelector('#target'); + var virtualTarget = axe.utils.getNodeFromTree(tree[0], shadowContent); + + var params = [shadowContent, undefined, virtualTarget]; + assert.isFalse(check.evaluate.apply(checkContext, params)); + }); + + (shadowSupport ? it : xit) + ('should return true if all ' + type + ' components are in the shadow boundary', function () { + fixture.innerHTML = '
'; + + var shadowRoot = fixture.querySelector('#container').attachShadow({ mode: 'open' }); + shadowRoot.innerHTML = '

Label

' + + '' + + ''; + + var tree = axe._tree = axe.utils.getFlattenedTree(fixture); + var shadowContent = shadowRoot.querySelector('#target'); + var virtualTarget = axe.utils.getNodeFromTree(tree[0], shadowContent); + + var params = [shadowContent, undefined, virtualTarget]; + assert.isTrue(check.evaluate.apply(checkContext, params)); + }); }; }