Skip to content

Commit

Permalink
Fixes audit when multiple role values exist. (#9857)
Browse files Browse the repository at this point in the history
* fix: Fixing the issue of errors caused by multiple values in the role, when multiple roles exist, check each role.

fix #9856

* Update .changeset/eight-flowers-remain.md

---------

Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
  • Loading branch information
iamyunsin and natemoo-re authored Feb 13, 2024
1 parent 2168635 commit 73bd900
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 17 deletions.
5 changes: 5 additions & 0 deletions .changeset/eight-flowers-remain.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"astro": patch
---

Fixes false positives in the dev overlay audit when multiple `role` values exist.
44 changes: 27 additions & 17 deletions packages/astro/src/runtime/client/dev-toolbar/apps/audit/a11y.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ import { aria, roles } from 'aria-query';
import { AXObjectRoles, elementAXObjects } from 'axobject-query';
import type { AuditRuleWithSelector } from './index.js';

const WHITESPACE_REGEX = /\s+/;

const a11y_required_attributes = {
a: ['href'],
area: ['alt', 'aria-label', 'aria-labelledby'],
Expand Down Expand Up @@ -496,13 +498,17 @@ export const a11y: AuditRuleWithSelector[] = [
if (is_semantic_role_element(role, element.localName, getAttributeObject(element))) {
return;
}
const { requiredProps } = roles.get(role)!;
const required_role_props = Object.keys(requiredProps);
const missingProps = required_role_props.filter((prop) => !element.hasAttribute(prop));
if (missingProps.length > 0) {
(element as any).__astro_role = role;
(element as any).__astro_missing_attributes = missingProps;
return true;

const elementRoles = role.split(WHITESPACE_REGEX) as ARIARoleDefinitionKey[];
for(const elementRole of elementRoles) {
const { requiredProps } = roles.get(elementRole)!;
const required_role_props = Object.keys(requiredProps);
const missingProps = required_role_props.filter((prop) => !element.hasAttribute(prop));
if (missingProps.length > 0) {
(element as any).__astro_role = elementRole;
(element as any).__astro_missing_attributes = missingProps;
return true;
}
}
},
},
Expand All @@ -522,16 +528,20 @@ export const a11y: AuditRuleWithSelector[] = [
match(element) {
const role = getRole(element);
if (!role) return false;
const { props } = roles.get(role)!;
const attributes = getAttributeObject(element);
const unsupportedAttributes = aria.keys().filter((attribute) => !(attribute in props));
const invalidAttributes: string[] = Object.keys(attributes).filter(
(key) => key.startsWith('aria-') && unsupportedAttributes.includes(key as any)
);
if (invalidAttributes.length > 0) {
(element as any).__astro_role = role;
(element as any).__astro_unsupported_attributes = invalidAttributes;
return true;

const elementRoles = role.split(WHITESPACE_REGEX) as ARIARoleDefinitionKey[];
for(const elementRole of elementRoles) {
const { props } = roles.get(elementRole)!;
const attributes = getAttributeObject(element);
const unsupportedAttributes = aria.keys().filter((attribute) => !(attribute in props));
const invalidAttributes: string[] = Object.keys(attributes).filter(
(key) => key.startsWith('aria-') && unsupportedAttributes.includes(key as any)
);
if (invalidAttributes.length > 0) {
(element as any).__astro_role = elementRole;
(element as any).__astro_unsupported_attributes = invalidAttributes;
return true;
}
}
},
},
Expand Down

0 comments on commit 73bd900

Please sign in to comment.