Skip to content

Commit 0ceeeea

Browse files
committed
chore: do not disable fieldset legend
1 parent 319f463 commit 0ceeeea

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

packages/playwright-core/src/server/injected/roleUtils.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -1005,13 +1005,12 @@ function isNativelyDisabled(element: Element) {
10051005
return isNativeFormControl && (element.hasAttribute('disabled') || belongsToDisabledFieldSet(element));
10061006
}
10071007

1008-
function belongsToDisabledFieldSet(element: Element | null): boolean {
1009-
if (!element)
1008+
function belongsToDisabledFieldSet(element: Element): boolean {
1009+
const fieldSetElement = element?.closest('FIELDSET[DISABLED]');
1010+
if (!fieldSetElement)
10101011
return false;
1011-
if (elementSafeTagName(element) === 'FIELDSET' && element.hasAttribute('disabled'))
1012-
return true;
1013-
// fieldset does not work across shadow boundaries.
1014-
return belongsToDisabledFieldSet(element.parentElement);
1012+
const legendElement = fieldSetElement.querySelector(':scope > LEGEND');
1013+
return !legendElement || !legendElement.contains(element);
10151014
}
10161015

10171016
function hasExplicitAriaDisabled(element: Element | undefined): boolean {

tests/page/selectors-role.spec.ts

+42
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,48 @@ test('should support disabled', async ({ page }) => {
243243
]);
244244
});
245245

246+
test('should support disabled fieldset', async ({ page }) => {
247+
await page.setContent(`
248+
<fieldset disabled>
249+
<input></input>
250+
<button data-testid="inside-fieldset-element">x</button>
251+
<legend>
252+
<button data-testid="inside-legend-element">legend</button>
253+
</legend>
254+
</fieldset>
255+
256+
<fieldset disabled>
257+
<legend>
258+
<div>
259+
<button data-testid="nested-inside-legend-element">x</button>
260+
</div>
261+
</legend>
262+
</fieldset>
263+
264+
<fieldset disabled>
265+
<div></div>
266+
<legend>
267+
<button data-testid="first-legend-element">x</button>
268+
</legend>
269+
<legend>
270+
<button data-testid="second-legend-element">x</button>
271+
</legend>
272+
</fieldset>
273+
274+
<fieldset disabled>
275+
<fieldset>
276+
<button data-testid="deep-button">x</button>
277+
</fieldset>
278+
</fieldset>
279+
`);
280+
281+
await expect.soft(page.getByTestId('inside-legend-element')).toBeEnabled();
282+
await expect.soft(page.getByTestId('nested-inside-legend-element')).toBeEnabled();
283+
await expect.soft(page.getByTestId('first-legend-element')).toBeEnabled();
284+
await expect.soft(page.getByTestId('second-legend-element')).toBeDisabled();
285+
await expect.soft(page.getByTestId('deep-button')).toBeDisabled();
286+
});
287+
246288
test('should support level', async ({ page }) => {
247289
await page.setContent(`
248290
<h1>Hello</h1>

0 commit comments

Comments
 (0)