Skip to content

Commit b9a324a

Browse files
AutoSpongeWilcoFiers
authored andcommitted
fix(multiple-label): considers explicit labels in the same shadow tree (#1584)
1 parent 381cadb commit b9a324a

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

lib/checks/label/multiple-label.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const id = axe.utils.escapeSelector(node.getAttribute('id'));
2-
let labels = Array.from(document.querySelectorAll(`label[for="${id}"]`));
32
let parent = node.parentNode;
3+
let root = axe.commons.dom.getRootNode(node);
4+
root = root.documentElement || root;
5+
let labels = Array.from(root.querySelectorAll(`label[for="${id}"]`));
46

57
if (labels.length) {
68
// filter out CSS hidden labels because they're fine

test/checks/label/multiple-label.js

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ describe('multiple-label', function() {
22
'use strict';
33

44
var fixture = document.getElementById('fixture');
5-
5+
var shadowSupported = axe.testUtils.shadowSupport.v1;
66
var checkContext = axe.testUtils.MockCheckContext();
77

88
afterEach(function() {
@@ -176,4 +176,62 @@ describe('multiple-label', function() {
176176
var target = fixture.querySelector('#Q');
177177
assert.isTrue(checks['multiple-label'].evaluate.call(checkContext, target));
178178
});
179+
180+
(shadowSupported ? it : xit)(
181+
'should consider labels in the same document/shadow tree',
182+
function() {
183+
fixture.innerHTML = '<div id="target"></div>';
184+
var target = document.querySelector('#target');
185+
var shadowRoot = target.attachShadow({ mode: 'open' });
186+
shadowRoot.innerHTML =
187+
'<input id="myinput" /><label for="myinput">normal</label>';
188+
var shadowTarget = target.shadowRoot;
189+
assert.isFalse(
190+
checks['multiple-label'].evaluate.call(
191+
checkContext,
192+
shadowTarget.firstElementChild
193+
)
194+
);
195+
}
196+
);
197+
198+
(shadowSupported ? it : xit)(
199+
'should return false for valid multiple labels in the same document/shadow tree',
200+
function() {
201+
fixture.innerHTML = '<div id="target"></div>';
202+
var target = document.querySelector('#target');
203+
var shadowRoot = target.attachShadow({ mode: 'open' });
204+
var innerHTML = '<input type="checkbox" id="D" aria-labelledby="E"/>';
205+
innerHTML += '<label for="D" aria-hidden="true">Please</label>';
206+
innerHTML += '<label for="D" id="E">Excuse</label>';
207+
shadowRoot.innerHTML = innerHTML;
208+
var shadowTarget = target.shadowRoot;
209+
assert.isFalse(
210+
checks['multiple-label'].evaluate.call(
211+
checkContext,
212+
shadowTarget.firstElementChild
213+
)
214+
);
215+
}
216+
);
217+
218+
(shadowSupported ? it : xit)(
219+
'should return true for invalid multiple labels in the same document/shadow tree',
220+
function() {
221+
fixture.innerHTML = '<div id="target"></div>';
222+
var target = document.querySelector('#target');
223+
var shadowRoot = target.attachShadow({ mode: 'open' });
224+
var innerHTML = '<input type="checkbox" id="Q"/>';
225+
innerHTML += '<label for="Q" aria-hidden="true"></label>';
226+
innerHTML += '<label for="Q" >Excuse</label>';
227+
shadowRoot.innerHTML = innerHTML;
228+
var shadowTarget = target.shadowRoot;
229+
assert.isTrue(
230+
checks['multiple-label'].evaluate.call(
231+
checkContext,
232+
shadowTarget.firstElementChild
233+
)
234+
);
235+
}
236+
);
179237
});

0 commit comments

Comments
 (0)