Dropdown Itemのaria-checkedをcheckboxタイプ限定に修正

shoelace-style/webawesome

wa-dropdown-itemコンポーネントで、type="checkbox"以外の通常メニューアイテムに誤ってaria-checked属性が付与されていた問題を修正しました。これにより、aria-allowed-attr規則に違反するアクセシビリティ問題が解消されます。

背景

通常のwa-dropdown-itemrole="menuitem")にaria-checked属性が付与されるというアクセシビリティ違反が報告されていました(#2179)。WAI-ARIAの仕様では、aria-checkedrole="menuitemcheckbox"にのみ有効な属性であり、role="menuitem"に付与することは不正です。

Issue #2179 によれば、この問題はchecked属性のデフォルト値がfalseに設定されていることに起因しています。これによりtypecheckboxでないアイテムに対してもaria-checked="false"が書き込まれていました。公式ドキュメントのDropdownページで実際に再現可能であり、通常のメニューアイテムを開発者ツールで確認するとaria-checked=falseが付与された状態になっていました。

技術的な変更

updated()メソッド内の2箇所に条件分岐を追加し、aria-checkedの操作をtype === 'checkbox'の場合のみに限定しました。

checkedプロパティ変更時の処理(変更前):

if (changedProperties.has('checked')) {
  this.setAttribute('aria-checked', this.checked ? 'true' : 'false');
  this.customStates.set('checked', this.checked);
}

checkedプロパティ変更時の処理(変更後):

if (changedProperties.has('checked')) {
  if (this.type === 'checkbox') {
    this.setAttribute('aria-checked', this.checked ? 'true' : 'false');
  } else {
    this.removeAttribute('aria-checked');
  }
  this.customStates.set('checked', this.checked);
}

typeプロパティ変更時の処理(変更後):

if (changedProperties.has('type')) {
  if (this.type === 'checkbox') {
    this.setAttribute('role', 'menuitemcheckbox');
    this.setAttribute('aria-checked', this.checked ? 'true' : 'false');
  } else {
    this.setAttribute('role', 'menuitem');
    this.removeAttribute('aria-checked');
  }
}

type変更時の処理ではaria-checkedの追加・削除も同時に行うようになりました。これにより、typecheckboxからnormalへ(またはその逆へ)動的に切り替わった場合も、rolearia-checkedが常に整合した状態になります。

あわせて4つのテストケースが追加されています:

  • 通常アイテムにaria-checkedが存在しないこと
  • type="checkbox"のアイテムにaria-checked="false"が付与されること
  • type="checkbox" checkedのアイテムにaria-checked="true"が付与されること
  • typecheckboxからnormalに変更したときaria-checkedが削除されること

まとめ

本PRは、checked属性のデフォルト値に起因するアクセシビリティ違反を、最小限の条件分岐で修正したものです。typecheckedの両変更ハンドラにガードを配置することで、動的なtype切り替えを含むあらゆるケースでrolearia-checkedの整合性が保証されるようになりました。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
ee6a2fcb

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術的変更(各論)→まとめ(結論)の3部構成が明確に適用されており、各セクションが必要な情報を過不足なく含んでいます。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```typescript:path/to/file```)とGitHubのIssueリンク記法([#2179](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

aria属性やコンポーネントのライフサイクルメソッドなど、専門的な用語を前提としており、対象読者であるエンジニアに適した技術レベルで記述されています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフが「総論→各論」の構造で書かれており、トピックセンテンスが先頭にあるため非常に読みやすいです。1段落1トピックの原則も守られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されている変更前・変更後のコードブロックは、提供されたDiff情報と完全に一致しており、正確に内容を反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`aria-checked`, `role`, `menuitemcheckbox`, `WAI-ARIA`などの技術用語が正確かつ適切な文脈で使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

「`aria-checked`は`role="menuitem"`に付与できない」というアクセシビリティの仕様や、`type`の動的変更時の挙動など、技術的な説明が正確かつ論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(問題の背景、修正内容、テストケースの追加など)は、PRのTitle, Description, Diff, および参照されているIssueの情報によって裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2180)とIssue番号(#2179)が正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルはPRの主題「aria-checkedをcheckboxタイプに限定する」を的確に表現しており、内容との整合性が取れています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事に含まれる情報はすべてPRおよび関連Issueに基づいています。LTSやリリース予定など、PRに記載のない外部知識の追加はありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「報告されていました」のように、過去の事象を正しく表現しており、時間表現の歪曲はありません。