Skip to content

Commit dd179c7

Browse files
committed
feat(getByRole): Allow filter by disabled
1 parent 39a64d4 commit dd179c7

File tree

4 files changed

+37
-0
lines changed

4 files changed

+37
-0
lines changed

src/__tests__/ariaAttributes.js

+22
Original file line numberDiff line numberDiff line change
@@ -379,3 +379,25 @@ test('`expanded: true|false` matches `expanded` elements with proper role', () =
379379
expect(getByRole('button', {expanded: true})).toBeInTheDocument()
380380
expect(getByRole('button', {expanded: false})).toBeInTheDocument()
381381
})
382+
383+
test('`expected: true|false` matches `disabled` buttons', () => {
384+
const {getByRole} = renderIntoDocument(
385+
`<div>
386+
<button disabled />
387+
<button />
388+
</div>`,
389+
)
390+
expect(getByRole('button', {disabled: true})).toBeInTheDocument()
391+
expect(getByRole('button', {disabled: false})).toBeInTheDocument()
392+
})
393+
394+
test('`expected: true|false` matches `aria-disabled` buttons', () => {
395+
const {getByRole} = renderIntoDocument(
396+
`<div>
397+
<button aria-disabled="true" />
398+
<button aria-disabled="false" />
399+
</div>`,
400+
)
401+
expect(getByRole('button', {disabled: true})).toBeInTheDocument()
402+
expect(getByRole('button', {disabled: false})).toBeInTheDocument()
403+
})

src/queries/role.ts

+5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
computeAriaValueMin,
2121
computeAriaValueText,
2222
computeHeadingLevel,
23+
computeDisabled,
2324
getImplicitAriaRoles,
2425
prettyRoles,
2526
isInaccessible,
@@ -53,6 +54,7 @@ const queryAllByRole: AllByRole = (
5354
pressed,
5455
current,
5556
level,
57+
disabled,
5658
expanded,
5759
value: {
5860
now: valueNow,
@@ -233,6 +235,9 @@ const queryAllByRole: AllByRole = (
233235
if (level !== undefined) {
234236
return level === computeHeadingLevel(element)
235237
}
238+
if (disabled !== undefined) {
239+
return disabled === computeDisabled(element)
240+
}
236241
if (
237242
valueNow !== undefined ||
238243
valueMax !== undefined ||

src/role-helpers.js

+9
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,14 @@ function computeAriaValueText(element) {
370370
return valueText === null ? undefined : valueText
371371
}
372372

373+
/**
374+
* @param {Element} element
375+
* @returns {boolean | undefined}
376+
*/
377+
function computeDisabled(element) {
378+
return element.disabled || element.getAttribute('aria-disabled') === 'true'
379+
}
380+
373381
export {
374382
getRoles,
375383
logRoles,
@@ -387,5 +395,6 @@ export {
387395
computeAriaValueMax,
388396
computeAriaValueMin,
389397
computeAriaValueText,
398+
computeDisabled,
390399
computeHeadingLevel,
391400
}

types/queries.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ export interface ByRoleOptions {
135135
| RegExp
136136
| string
137137
| ((accessibleDescription: string, element: Element) => boolean)
138+
disabled?: boolean
138139
}
139140

140141
export type AllByRole<T extends HTMLElement = HTMLElement> = (

0 commit comments

Comments
 (0)