Skip to content

Commit

Permalink
fix: Fixing the issue of errors caused by multiple values in the role…
Browse files Browse the repository at this point in the history
…, when multiple roles exist, check each role.

fix #9856
  • Loading branch information
iamyunsin committed Jan 30, 2024
1 parent 70fdf1a commit 3e0b491
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
---

When multiple roles exist, check each role. Fixing the issue of errors caused by multiple values in the role.
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 3e0b491

Please sign in to comment.