From 4298372d569ec15d6344730e53b9072db3f5dabd Mon Sep 17 00:00:00 2001 From: Pengoose Date: Tue, 17 Dec 2024 05:11:22 +0900 Subject: [PATCH] feat: ignore InputElement.validity when irrelevant --- .../playwright-core/src/server/injected/roleUtils.ts | 12 +++++++++++- tests/page/expect-misc.spec.ts | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/playwright-core/src/server/injected/roleUtils.ts b/packages/playwright-core/src/server/injected/roleUtils.ts index 6bd3b8069b..222d7a0cc8 100644 --- a/packages/playwright-core/src/server/injected/roleUtils.ts +++ b/packages/playwright-core/src/server/injected/roleUtils.ts @@ -461,6 +461,16 @@ export function getElementAccessibleDescription(element: Element, includeHidden: 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 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) || ''; if (!role || !kAriaInvalidRoles.includes(role)) return 'false'; - if (element instanceof HTMLInputElement && element.validity) + if (element instanceof HTMLInputElement && hasValidationAttributes(element) && element.validity) return element.validity.valid ? 'false' : 'true'; const ariaInvalid = element.getAttribute('aria-invalid'); if (!ariaInvalid || ariaInvalid.trim() === '' || ariaInvalid.toLocaleLowerCase() === 'false') diff --git a/tests/page/expect-misc.spec.ts b/tests/page/expect-misc.spec.ts index a54447adf6..25c24fc44d 100644 --- a/tests/page/expect-misc.spec.ts +++ b/tests/page/expect-misc.spec.ts @@ -528,7 +528,7 @@ test('toHaveAccessibleErrorMessage should handle multiple aria-errormessage refe 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'; async function setupPage(page, ariaInvalidValue: string | null) {