feat: ignore InputElement.validity when irrelevant
This commit is contained in:
parent
934271548d
commit
4298372d56
|
|
@ -461,6 +461,16 @@ export function getElementAccessibleDescription(element: Element, includeHidden:
|
||||||
return accessibleDescription;
|
return accessibleDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/input.html#the-input-element
|
||||||
|
export const kInputValidityAttributes = ['required', 'pattern', 'min', 'max', 'minlength', 'maxlength', 'step', 'type', 'value'];
|
||||||
|
|
||||||
|
export function hasValidationAttributes(element: Element): boolean {
|
||||||
|
if (!(element instanceof HTMLInputElement))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return kInputValidityAttributes.some(attr => element.hasAttribute(attr));
|
||||||
|
}
|
||||||
|
|
||||||
// https://www.w3.org/TR/wai-aria-1.2/#aria-invalid
|
// https://www.w3.org/TR/wai-aria-1.2/#aria-invalid
|
||||||
export const kAriaInvalidRoles = ['application', 'checkbox', 'combobox', 'gridcell', 'listbox', 'radiogroup', 'slider', 'spinbutton', 'textbox', 'tree', 'columnheader', 'rowheader', 'searchbox', 'switch', 'treegrid'];
|
export const kAriaInvalidRoles = ['application', 'checkbox', 'combobox', 'gridcell', 'listbox', 'radiogroup', 'slider', 'spinbutton', 'textbox', 'tree', 'columnheader', 'rowheader', 'searchbox', 'switch', 'treegrid'];
|
||||||
|
|
||||||
|
|
@ -468,7 +478,7 @@ export function getAriaInvalid(element: Element): 'false' | 'true' | 'grammar' |
|
||||||
const role = getAriaRole(element) || '';
|
const role = getAriaRole(element) || '';
|
||||||
if (!role || !kAriaInvalidRoles.includes(role))
|
if (!role || !kAriaInvalidRoles.includes(role))
|
||||||
return 'false';
|
return 'false';
|
||||||
if (element instanceof HTMLInputElement && element.validity)
|
if (element instanceof HTMLInputElement && hasValidationAttributes(element) && element.validity)
|
||||||
return element.validity.valid ? 'false' : 'true';
|
return element.validity.valid ? 'false' : 'true';
|
||||||
const ariaInvalid = element.getAttribute('aria-invalid');
|
const ariaInvalid = element.getAttribute('aria-invalid');
|
||||||
if (!ariaInvalid || ariaInvalid.trim() === '' || ariaInvalid.toLocaleLowerCase() === 'false')
|
if (!ariaInvalid || ariaInvalid.trim() === '' || ariaInvalid.toLocaleLowerCase() === 'false')
|
||||||
|
|
|
||||||
|
|
@ -528,7 +528,7 @@ test('toHaveAccessibleErrorMessage should handle multiple aria-errormessage refe
|
||||||
await expect(locator).not.toHaveAccessibleErrorMessage(/This should not be considered./i);
|
await expect(locator).not.toHaveAccessibleErrorMessage(/This should not be considered./i);
|
||||||
});
|
});
|
||||||
|
|
||||||
test.describe.only('toHaveAccessibleErrorMessage should handle aria-invalid attribute', () => {
|
test.describe('toHaveAccessibleErrorMessage should handle aria-invalid attribute', () => {
|
||||||
const errorMessageText = 'Error message';
|
const errorMessageText = 'Error message';
|
||||||
|
|
||||||
async function setupPage(page, ariaInvalidValue: string | null) {
|
async function setupPage(page, ariaInvalidValue: string | null) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue