From b816c399d79b77e0027d7a5615766fc498c03193 Mon Sep 17 00:00:00 2001 From: Thomas Marshall Date: Tue, 3 Nov 2020 13:46:37 +0000 Subject: [PATCH 1/2] Ensure hidden inputs are not labelable The `labels` property on `input` elements of type `hidden` is `null` rather than `NodeList` [1]. This meant the `getRealLabels` function would return `null` causing `queryAllByLabelText` to throw an error when it tried to call `length` on `null` [2]. This commit fixes the issue by ensuring the element is labelable before calling `labels` on it, and adds a test case for this specific scenario. [1]: https://html.spec.whatwg.org/multipage/forms.html#dom-lfe-labels [2]: https://github.com/testing-library/dom-testing-library/blob/62f4e5e09a4b81ef66679560b540523edccdef98/src/queries/label-text.js#L52 --- src/__tests__/label-helpers.js | 7 +++++++ src/__tests__/queries.find.js | 1 + src/label-helpers.js | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 src/__tests__/label-helpers.js diff --git a/src/__tests__/label-helpers.js b/src/__tests__/label-helpers.js new file mode 100644 index 00000000..4fd2448f --- /dev/null +++ b/src/__tests__/label-helpers.js @@ -0,0 +1,7 @@ +import {getRealLabels} from '../label-helpers' + +test('hidden inputs are not labelable', () => { + const element = document.createElement('input') + element.type = 'hidden' + expect(getRealLabels(element)).toEqual([]) +}) diff --git a/src/__tests__/queries.find.js b/src/__tests__/queries.find.js index f8c48f1f..6372f957 100644 --- a/src/__tests__/queries.find.js +++ b/src/__tests__/queries.find.js @@ -35,6 +35,7 @@ test('find asynchronously finds elements', async () => {
header
+ `) await expect(findByLabelText('test-label')).resolves.toBeTruthy() diff --git a/src/label-helpers.js b/src/label-helpers.js index 52c5dc99..d1711edb 100644 --- a/src/label-helpers.js +++ b/src/label-helpers.js @@ -34,10 +34,10 @@ function getLabelContent(node) { // Based on https://github.com/eps1lon/dom-accessibility-api/pull/352 function getRealLabels(element) { - if (element.labels !== undefined) return element.labels - if (!isLabelable(element)) return [] + if (element.labels !== undefined) return element.labels + const labels = element.ownerDocument.querySelectorAll('label') return Array.from(labels).filter(label => label.control === element) } From a6605d17c440435fc134656d579d28478b428778 Mon Sep 17 00:00:00 2001 From: Thomas Marshall Date: Tue, 3 Nov 2020 18:49:51 +0000 Subject: [PATCH 2/2] squash! Ensure hidden inputs are not labelable This commit fixes the issue by retuning an empty array if the `labels` property is `null`, and adds a test case for this specific scenario. --- src/label-helpers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/label-helpers.js b/src/label-helpers.js index d1711edb..d71b4f8e 100644 --- a/src/label-helpers.js +++ b/src/label-helpers.js @@ -34,9 +34,9 @@ function getLabelContent(node) { // Based on https://github.com/eps1lon/dom-accessibility-api/pull/352 function getRealLabels(element) { - if (!isLabelable(element)) return [] + if (element.labels !== undefined) return element.labels ?? [] - if (element.labels !== undefined) return element.labels + if (!isLabelable(element)) return [] const labels = element.ownerDocument.querySelectorAll('label') return Array.from(labels).filter(label => label.control === element)