Open15

testing-libraryの中身追ってみる

mugimugi

雰囲気使っているライブラリの中身を追ってみようシリーズ

mugimugi

ByRole

mugimugi
mugimugi

実際試してみるとこんな感じ

import { computeAccessibleName } from "dom-accessibility-api";
import { JSDOM } from "jsdom";

const { document } = new JSDOM(`
  <button><img alt="foo" /></button>
`).window;

console.log(computeAccessibleName(document.querySelector("button") as Element));
mugimugi

aria-query
https://github.com/A11yance/aria-query

Programmatic access to the WAI-ARIA 1.2 Roles Model. This package tracks the W3C Recommendation (last update: 6 June 2023).

mugimugi

WAI-ARIA 1.2 Roles Model に、各Roleについての仕様が定義されている。
これにはRoleとDOMの対応や、暗黙的に保持するaria属性が何かといった情報が含まれる。

この定義をJavaScriptから簡単にアクセスできるようにしたものが aria-queryらしい。

たとえば、const role = allRoles.get("alert") などでアクセスすると、alert ロールの情報を参照できる。alert ロールは暗黙的に aria-atomic が true となるが、コード上 alert.props["aria-atomic"] を参照すると "true" が取得できる。

mugimugi

基本的には dom-accessibility-api と aria-query の組み合わせで取得しているようだが、getByRoleには他にもいくつかオプションがある。

https://testing-library.com/docs/queries/byrole

たとえば、hidden を true にすると、不可視状態のものでも取得できる。
これはどうやってるのか

mugimugi

まとめとしては、dom-accessibility-api と aria-query に頼りつつ、その他は独自で実装しているという具合っぽかった。わかりやすかった