注意
この文書は、W3C / WAI が公開している2009年2月24日付の「WAI-ARIA 1.0 User Agent Implementation Guide」(原文は英語)を、W3Cの定めた事項に従い株式会社日立製作所がボランティアとして日本語に翻訳したものです。 正式な文書は、あくまで W3C のサイト上で公開されている英語版であり、この日本語訳文書には翻訳上の間違い、あるいは不適切な表現が含まれている可能性がありますのでご注意ください。また、リンク先が英語の場合、あるいはダミーのページである場合もあります。ご了承ください。 その他のWAI-ARIA関連文書の日本語訳をご覧になりたい場合はWAI-ARIA(日本語訳)をご覧ください。

[目次]

W3C

WAI-ARIA 1.0 ユーザーエージェント実装ガイド

W3Cワーキングドラフト 2009年2月24日

本バージョン:
http://www.w3.org/TR/2009/WD-wai-aria-implementation-20090224/
最新のバージョン:
http://www.w3.org/TR/wai-aria-implementation/
編集者:
アーロン レベンサール、IBM
マイケル・クーパー、W3C

Abstract

この文書は、WAI-ARIA [ARIA]によって、ウェブコンテンツ内で提供されるロール(role)、ステート(state)、プロパティに対して、ユーザーエージェントがどのように応答すべきかを説明するものである。これらの機能は、アクセシブルなリッチ・インターネット・アプリケーションの開発者によって使用される。ユーザーはページから情報を得たり、ページを操作したりするために、プラットフォームのアクセシビリティAPIに依存した支援技術を使ってコンテンツにアクセスすることが多い。WAI-ARIA 1.0 ユーザーエージェント実装ガイドは、アクセシビリティAPIにエクスポーズするためにコンテンツをどのように実装すべきかを定義している。これによって、情報を開発者の意図どおりの方法で表すことができるようになる。 この文書は、ARIA概略で説明されているWAI-ARIA文書一式の一部と位置付けられている。

この文書のステータス

このセクションは、この文書の発行時点でのステータスを説明したものであり、この文書に取って代わる他の文書がすでに存在している可能性もある。W3Cの現行の発行物およびこの技術報告書の最新改訂版は、W3C技術報告書の索引W3C technical reports index at http://www.w3.org/TR/で見つけることができる。

この文書は、 ウェブ・アクセシビリティ・イニシアティブ(WAI)プロトコル・フォーマット・ワーキンググループ(PFWG)が作成した 最初の公開ワーキングドラフトである。アクセシブル・リッチ・インターネット・アプリケーション(WAI-ARIA) [[ARIA] ] 仕様をサポートし、ユーザーエージェントがARIAの機能をプラットフォームのアクセシビリティAPIにどのように伝えるべきかについて情報を提供している。サードパーティーの支援技術と連携して動作する主なユーザーエージェントの実装者はこの文書の手法に従うべきである。

プロトコル・フォーマット・ワーキンググループでは、この文書の中のアドバイスが、最終的な規定つまりARIAに準拠するユーザーエージェントがこの文書に準拠しなければならないものとするか、または、 参考情報つまりユーザーエージェントが互換性の確保のために従うべきだが、何らかの理由があれば逸脱してもよいというアドバイスを提供するものであるかは、まだ決まっていない。現時点ではこの文書はW3Cの勧告に至るステップではなく、ワーキンググループノートとなる予定である。

リッチ・インターネット・アプリケーションが、すべての情報や操作に対するアクセスを提供し、最終的に成功するためには、この文書の情報に対するフィードバックが、きわめて重要な役割を果たす。PFWGでは、特に以下のような点を知りたいと考えている。

この文書に対するコメントは、public-pfwg-comments@w3.org (アーカイブ)で受け付けている。コメントは2009年3月24日とはいえ、それ以降に届いたコメントも、検討させていただく。この文書についての進行中の更新は、公開エディターズドラフトでご覧いただける。

ワーキングドラフトとしての公開は、W3Cメンバーによって是認されたことを意味するものではない。この文書は、ドラフト文書であって、他の文書によって随時更新、置換されるか、また旧バージョンとなる可能性がある。この文書は、未完成の文書という扱いにおいてのみ、引用すべきである。

この文書は、2004年2月5日W3C特許方針に則って活動するグループによって作成された。 このグループでは、この文書が. W3Cでは、このグループの作成物に関連する全開示特許の公開リスト を作成しており、そのページには、特許開示にあたっての指示も含まれている。エッセンシャルクレイム を含んでいると思われる特許について実際の知識を持っている人は、W3C特許方針のセクション6に従ってその情報を開示しなければならない。

このグループの参加者に課される開示の義務は、グループの設立趣意書で説明されている。

目次

  1. 1. はじめに
    1. 1.1. アクセシビリティAPI
    2. 1.2. アクセシブルツリーとDOM ツリー - これらの関係について
  2. 2. キーボードナビゲーションのサポート
    1. 2.1. タブインデックスによるフォーカスの管理
    2. 2.2. ARIAを用いたフォーカスの管理
    3. 2.3. 支援技術からのフォーカスの変更の取り扱い
  3. 3. ARIAとAPIとのマッピング
    1. 3.1. ARIAセマンティクスをエクスポーズするための一般原則
    2. 3.2. ネイティブなマークアップセマンティクスとARIAとの衝突
    3. 3.3. アクセシビリティAPIのプロパティに直接マッピングされない属性のエクスポーズ
    4. 3.4. ロール(role)のマッピング
    5. 3.5. ステート(state)とプロパティのマッピング
    6. 3.6. 追加計算を必要とする特別な処理
      1. 3.6.1. 名前と記述
      2. 3.6.2. ウィジェットの値
      3. 3.6.3. リレーション
      4. 3.6.4. グループの位置
  4. 4. 管理されたステート(state)
    1. 4.1. 付加的なインタフェースをエクスポーズする
    2. 4.2. アクション
    3. 4.3. 文書のコンテンツまたはノードの可視性に対する変更
    4. 4.4. 選択
    5. 4.5. MSAAあるいはIAccessible2のメニュー
  5. 5. 特別な文書の処理手順
    1. 5.1. 文書、frameと iframe要素の操作
    2. 5.2. CSS セレクタ
  6. 6. エラー処理
    1. 6.1. 定義
    2. 6.2. バリュータイプ: IDREFと IDREFS
    3. 6.3. バリュータイプ:10進型
    4. 6.4. ユーザーエージェントでの検証
    5. 6.5. ロール(Role)
    6. 6.6. ステート(state)とプロパティ
    7. 6.7. 支援技術にエラーを伝達する
  7. 7. 補足資料
    1. 7.1. 参考文献
    2. 7.2. 謝意
      1. 7.2.1. プロトコル・フォーマット・ワーキンググループの参加者(発行時点)
      2. 7.2.2. プロトコル・フォーマット・ワーキンググループの過去のアクティブな参加者およびARIA仕様への協力者
      3. 7.2.3. 資金援助

1. はじめに

ユーザーエージェントが、あるプラットフォーム上のアクセシビリティAPIを経由して静的なコンテンツをエクスポーズしている場合、ARIAが行う残りの作業は3つに分けられる。

  1. 以前はフォーカスを設定できなかった要素上でフォーカス及びタブナビゲーションが行えるようにする。
  2. ARIAのロール(role)とプロパティを、あるプラットフォーム上のアクセシビリティAPIのロール(role)やステート(state)、及び他のプロパティを取得するものにマッピングする。
  3. 内部情報を複合したものから計算される、管理されたステート(state)やイベントを計算する。

一般論として、ARIAのプロパティは、コンテンツがプラットフォームのアクセシビリティAPIにどのようにマッピングされるかにのみ作用すべきである。仕様で推奨されているように、スタイルシートで意図的にARIAの属性をキーオフしてる場合を除いて、コンテンツの視覚的なレンダリングや主なデスクトップブラウザの動作に作用すべきではない。 これによって、ARIAの主要な原則の一つが維持される。つまり、コンテンツはARIAをサポートしていないレガシーブラウザのユーザーの大多数と同じようにレンダリングし、動作する。

1.1. アクセシビリティAPI

この文書でカバーしているアクセシビリティAPIは以下の通り。

ARIAを、Mac OS X Accessibility ProtocolやUI Automation、または他のアクセシビリティAPIにエクスポーズする最良の方法に関する情報はまだない。しかし、この文書中の情報に対する何らかのフィードバックがあれば歓迎する。他のアクセシビリティAPIに対してエクスポーズさせたい場合は、支援技術の開発者と密接に連携し合うことを推奨する

1.2. アクセシブルツリーとDOM ツリー - これらの関係について

アクセシブルツリーとDOMツリーは、並列構造である。おおまかに言うと、アクセシブルツリーは、DOMツリーのサブセットである。アクセシブルなオブジェクトは、アクセシブルなイベントを起動するため、または引き渡される必要のあるプロパティ、リレーションシップ、あるいは機能があるため、のいずれかの理由により、支援技術に引き渡されるべき個々のDOM要素に対して、アクセシブルなツリー内に生成される。一般的に言って、もし何か手を加えるとすればパフォーマンスの向上や簡潔さのためであろう。例えば、スタイルの変更のみでセマンティクスを含まない<span>要素では、それ自体のアクセシブルなオブジェクトではなく、スタイルの変更はAccessibleTextインタフェースの“text attribute run”を通じてエクスポーズされることになる。

通常のアクセシブルツリーに加え、要素に次のプロパティのうち一つがある場合は、ARIAではその要素も引継がれるよう求めている。

アクセシブルな階層(子孫も含む)から取り除かれるべきオブジェクト

子孫の削除が起きたとき、残っているルートオブジェクトに対してAccessible Hypertextインタフェースもエクスポーズされないようにすべきである。子孫が残っていると、これらのロール(role)に対する子孫には対応していない支援技術によっては混乱してしまうので、子孫は削除される。(例、JAWSのバーチャルバッファーはアクセス可能な名前を2度話す、あるいはスライダーのつまみをイメージとして表してしまうこともあるだろう)

文書規約

注:以下のセクションでは、IAccessible2とATKのブーリアンのステート(state)は全て大文字で表示される。 例、FOCUSABLE

2. キーボードナビゲーションのサポート

ウェブアプリケーションをキーボードで操作できるようにすることが、アクセシブルなウェブアプリケーションを実現する第一歩となる。スクリプト・ウィジェットをアクセシブルにする2つのメカニズムがある。tabindexaria-activedescendantである。ARIAウィジェット開発における他の多くの局面では、キーボードナビゲーションを適切に機能させることにかかっている。

支援技術は、しばしばフォーカスを設定する必要がある。例えば、音声入力ソフト、オンスクリーンキーボード、及びスクリーンリーダーはページ中の要素に移動するための追加的なコマンドを提供するなど、独自の構造化されたナビゲーションモードを提供している。ユーザーエージェントもウェブページも、これを巧みに処理する必要がある。スクリプトコンテナウィジェットは、キーボードまたはマウスクリックからのみフォーカスの変化が発生すると想定することはできない。フォーカスの変化があった場合には、フォーカスまたはaria-activedescendantの変化を感知し、そのステート(state)を更新する必要がある。

2.1. タブインデックスによるフォーカスの管理

ARIAをサポートするユーザーエージェントは、tabindexfocus、及び blurをHTMLのすべての要素で使えるように、それらの使用法を拡張する。HTML5のワーキングドラフトでは、この手法を採用しているので、次のバージョンのHTMLにおいては仕様通りとなる見込みである。

HTML4およびそれ以前のものでは、タブ順序にはリンクとフォームのコントロールのみがあり、フォーカスを受け取ることができた。focusメソッドを用いたスクリプトを使用しても、他の要素にフォーカスを設定することは不可能であった。tabindexを用いてタブ順序に加えることが可能であっても、フォーカス可能にしてタブ順序に入れないことはできなかった。この問題を乗り越えるために、ユーザーエージェントはtabindex属性の値と適用範囲を拡張する。

基本的に、divspanまたはimgといったどのような要素も、tabindex="0"と設定することで、デフォルトのタブ順序に加えることができる。さらに、tabindex="-1"を伴ったアイテムは、スクリプトまたはマウスクリック経由でフォーカスを置くことができる。しかし、デフォルトのタブ順序の一部にはならない。

スライダーのような単純ウィジェットから、メニューバー、ツリービュー、またはスプレッドシートといったコンテナウィジェットに至るまで、キーボードでアクセス可能なカスタムウィジェットを開発する一つの方法を、tabindexシステムは提供する。このシステムは、IE5.5までのInternet Explorerの古いバージョンでも動作する。

ユーザーエージェントにおける実装に際し、tabindexを全ての要素で可能にするために、次のことをしなければならない

  1. 1. それぞれの要素は、a)フォーカス可能ではない(タブ移動もできない)、b)フォーカス可能だが、タブ移動はできない、c)フォーカス可能で、かつ、タブ移動できる、のいずれかになる。従来はフォーカス可能ではなかった要素に対しても、tabindex属性の存在と値が作用しなければならない。ユーザーエージェントの中のマスククリックでの操作とタブナビゲーションのコードはこの情報を活用しなければならない
  2. それぞれのHTML要素は、element.tabIndexプロパティをエクスポーズ しなければならない
  3. focus及びblurメソッドが、HTML要素インタフェースに追加されるべきである(あらゆる要素のタイプに対してスクリプト可能となる)。
  4. フォーカスを受け取ることができる要素は、focus及びblurイベントを起動しなければならない
  5. デフォルトのスタイルシートは、擬似クラス:focusを持った要素であればフォーカスoutlineプロパティを受け取ることができるように、ルールを規定しなければならない
  6. .他のブラウザとの互換性のために、keydownイベントをキャンセルする場合は、keypress イベントもキャンセルしなければならない。これは必要なことで、なぜなら、Internet Explorerをサポートする開発者は、キーストロークの処理を行うためにkeydownイベントを使用しなければならず、非英数キーに対しては、keypressではなく、keydownイベントを起動しているためである。ウェブページの開発者が、キーボードにスクリプト制御を実装する際には、keydownイベントを使用可能にするが、矢印キーなどのキーストロークによる影響を打ち消す必要がある。
  7. フォーカス可能なすべての要素が、アクセシブルなオブジェクトの階層内にエクスポーズされ、フォーカスを受け取った際には、アクセシビリティ・イベントを起動するオブジェクトがあるようにする。
  8. 必要に応じて、アクセシビリティ階層内のあらゆる要素に対する、FOCUSEDFOCUSABLEのアクセシビリティAPIのステート(state)、focus のアクセシビリティAPIイベントをエクスポーズする。
  9. 場合によっては、フォーカスの置かれた要素上でEnterを押下することは、クリックと同様の操作となるべきである ([HTML5], セクション 3.4.1.7).

HTML5仕様では、tabindexの拡張された振る舞いがどうあるべきか ([HTML5]、 セクション 6.5.1)を文書化している。どのような振る舞いであるべきかに関するGeckoの文書は「キー操作可能なカスタムDHTMLウィジェット」にある。IEのtabindexの振る舞いに関する文書は、「MSDN:tabindexプロパティ」。また、Operaには、いくつかの簡単なテストケースがある。

2.2. ARIAを用いたフォーカスの管理

aria-activedescendantプロパティもまた、あらゆるタイプのARIA要素において、キーボードのアクセシビリティを確保するために使われることもありうる。それは、しばしば、コンテナウイジェットキーボード・ナビゲーションを提供する、より便利な方法である(タブ順序においてはウィジェット全体で1回のみとなるが、ユーザーはキーストロークを使ってコンテナに含まれる子孫アイテムをナビゲートすることができる)。

一般的な使用方法は以下を用い、そして開発者は、コンテナの要素にtabindex="0"と、現在アクティブな子孫のIDを示すためにaria-activedescendantを用いる。現在のアクティブな子孫にキーボードフォーカスが置かれていることを示すために表示スタイルを定義するのは、ユーザーエージェントではなく、開発者の責任となる(実際のフォーカスはコンテナに置かれているので:focusメソッドによってではない)。

aria-activedescendant実装するために、ユーザーエージェントは以下のことを行わなければならない

  1. HTML 5 Tabindexのtabindexの推奨事項を実装する。 コンテナウィジェットはタブ順序に含まれなければならないので、開発者がaria-activedescendantのシステムを用いることができるように、全ての要素においてtabindex="0"をサポートしなければならない
  2. DOM内でフォーカスが置かれ、かつ、有効なIDを示しているaria-activedescendantを持つ要素については、アクセシビリティAPI内でフォーカスが置かれているようにマークしてはならない。(つまり、FOCUSED またはFOCUSABLEのステート(state)を使ってはならない)
  3. aria-activedescendant属性が、現在DOMフォーカスのある要素上で変化する際、新しいアクティブな子孫上でアクセシビリティAPIのFOCUSイベントを起動する。aria-activedescendantがクリアされるか、または現在の文書内の要素を指していない場合は、属性の変更が起こったコンテナオブジェクトに対してfocusイベントを起動する。
  4. aria-activedescendant属性を伴った要素の子孫で、ID属性を持った要素については、オブジェクトがアクセシブルとなるように、ターゲットに対して次のステート(state)を適用する。
    1. FOCUSABLE。要素がARIAのロール(role)も持っている場合。なぜなら、コンテナの aria-activedescendantが潜在的にそれを示す可能性があるためである。ロール(role)がない際には、これをチェックする必要があるとはかぎらない。なぜなら、フォーカスを受け取るであろう実際のHTML要素が、既にフォーカス可能なことがあるためである。
    2. ACTIVE。コンテナ要素がaria-activedescendantを子孫のIDとマッチするよう設定する場合。
    3. FOCUSEDACTIVEaria-activedescendantを伴ったコンテナウィジェットが、真のDOMフォーカスを受け取っている場合。
  5. 支援技術がaria-activedescendantを伴ったコンテナの子孫にフォーカスを設定するときは、当該の項目を示すようにaria-activedescendantの値を変更するよう実装すべきである。

開発者向け注記:次の子孫にフォーカスを移動させる際は、scrollIntoView()メソッドを用いて、フォーカスを受け取る子孫全体が画面上に表示されるようにスクロールさせること([HTML5]、 セクション 6.4)。

2.3. 支援技術からのフォーカス移動の操作

代替入力ソフトは、FOCUSABLEとしてエクスポーズされたアイテムにフォーカスを置くことができる必要がある。スクリーンリーダー、音声入力ソフト、及びオンスクリーンキーボードは、そのソフトウェアに実装されているユーザーコマンドに基づいてフォーカスを設定することができる。これを、MSAAベースの支援技術ではaccSelect(SELFLAG_TAKEFOCUS)メソッド経由で行い、ATKではAtkComponent::grab_focus経由で行っている。

開発者向け注記: 代替入力を可能にするために、onfocusハンドラが必要になるかもしれない。例えば、フォーカス可能なリスト項目のあるlistbox を実装している場合、新しいリスト項目がフォーカスを受け取ることのできる手段は、マウスクリックまたはキーの押下だけであると考えないこと。したがって、フォーカスの置かれた要素に対する直接的などのようなスタイルの変更も、クリック及びkeypressハンドラではなく、onfocusハンドラによって行われるべきであるaria-activedescendantを使う場合、これらの属性の変更に対応するために、DOMAttrModifed (IEではonpropertychange)を注視すること。

3. ARIAとAPIとのマッピング

3.1. ARIAセマンティクスをエクスポーズするための一般原則

可能であれば、ARIAのセマンティクスは、デスクトップアクセシビリティAPIの標準的なメカニズムを通じてエクスポーズされるべきである。例えば、ARIAウィジェットの場合、同様なデスクトップウィジェットではどのようにウィジェットがエクスポーズされるか比較してみる。一般的に、ほとんどのARIAウィジェットの機能は、ロール(role)、値、ブーリアンのステート(state)、及びアクセシビリティAPIとの関係などを通じてエクスポーズされる。

ユーザーエージェントは、支援技術にステート(state)の変更を知らせるべきである。反対に、プロパティ変更の支援技術による通知は、支援技術がユーザーエージェントと情報伝達する手法に依存する。例えば、aria-multilineプロパティはしばしば変更されるものではないが、一方で、aria-checkedのステート(state)はユーザーの入力に反応して頻繁に変更される。

3.2. ネイティブなマークアップセマンティクスとARIAとの衝突

ロール(role)やname、ステート(state)、値といったアクセシビリティAPIのコアなプロパティは、それぞれ唯一のものである。衝突が起こると、通常、ARIAが勝つ。なぜなら、ARIAは基本的に他を無効にするものだからである。つまり、ネイティブなマークアップがリンクがあると言っても、ARIAのマークアップでボタンであると言っていれば、ボタンとしてエクスポーズされるべきである

3.3. アクセシビリティAPIのプロパティに直接マッピングされない属性のエクスポーズ

ARIAのロール(role)、ステート(state)、及びプロパティ がアクセシビリティAPIと直接マッピングされない場合、ARIAの加工されていないデータをテキスト文字列としてエクスポーズさせるメカニズムを提供する。ユーザーエージェントは、アクセシビリティAPIと直接マッピングするかしないかにかかわらず、ARIAの加工されていないデータをこのAPIを通じて常にエクスポーズすることができる

また、ARIAは、デスクトップアクセシビリティAPIが現在カバーしていない新しい機能もエクスポーズする。ARIAは、アクセシビリティAPI には従来見られなかったセマンティクスをエクスポーズするのに、オブジェクトの属性を使う。 オブジェクトの属性は、大まかに特定されるname-valueのペアで、柔軟性があるためアクセシビリティAPIがインタフェースを備えていないものをエクスポーズできる。例えば、aria-live属性は、アクセシビリティAPIにはそのようなプロパティが存在しないため、オブジェクトの属性を経由してエクスポーズされなければならない。オブジェクトの属性のname-valueのペアをエクスポーズさせるための特定の規則は、この文書で説明されている。そして記載されていない一般的なケースに対する規則については、ステート(States)及びObjectプロパティに記載されている。

それ自体が"オブジェクトの属性"を持たないアクセシビリティAPIに対しては、類似のメカニズムあるいはname-valueのペアをエクスポーズするための新しいインタフェースを開発するのが有用である。Mac OS X Accessibility Protocolでは、全ての取得物はすでにシンプルなname-valueのペアであり、必要に応じて新しいセマンティクスをエクスポーズすることが可能である。新しいセマンティクスに対するサポートを得るには、支援技術の開発者との共同作業が必要になることに留意すること。

3.4. ロール(role)のマッピング

ARIAでは、ロール(role)属性が複数のロールを示すことがある。ロール(role)の値は、スペースで区切られたトークンの順序を持ったセットで、各々のトークンは有効なロール(role)のトークンでなければならない。ARIAには、landmark及び先進的なウィジェットのようなロール(role)が含まれており、これらは従来のアクセシビリティAPIにはない。さらに、ARIAの将来のバージョンでは、開発者が定義したロール(role)がロール文字列の中で利用可能になるであろう。その場合は、ロール文字列の中で、カスタムロールの後に万一のための代替ロール(role)が提供されることになると考えられる。

プラットフォームのアクセシビリティAPIには、そのプラットフォーム上で支援技術が求める既定のロール一式がある。ARIAのロール(role)は、プラットフォームのアクセシビリティAPIのロール(role)と常に完全に一致するわけではない。

もう一つの相違点は、プラットフォームアクセシビリティAPIにおいては、従来のロール(role)のメカニズムを通じて1~2個のロール(role)しかエクスポーズできないことである。これに対して、ARIAでは、複数のロール(role)がエクスポーズできる。追加的なロールはおそらく万一のための代替ロール(role)であろう。これは、カスタムロール(role)がある実装において検出されなかったときのためのバックアップとなる。あるいは、landmarkロール(role)となる。landmarkは、一般にプラットフォームのアクセシビリティAPIとのマッピングを持たないため、どのように最初のウィジェットロール(role)がエクスポーズされるかに影響を及ぼすことなく、landmarkはロール(role)文字列のどこにでも存在しうる。

ユーザーエージェントは、ロール(role)文字列全体が解析可能であっても、アクセシビリティAPIの標準的なロール(role)のメカニズムが最もフィットするウィジェットロール(role)を提供できるように、ロール(role)をエクスポーズすべきである

  1. アクセシビリティAPIの標準的なロール(role)のメカニズムを経由してアクセシビリティAPIとマッピングする際は、(複数の)アクセシビリティAPIと既にマッピングが取れている最初のロール(role)のトークンが使用されるべきである。下記のロール(role)一覧表を使用し、特定できる特別なケースについてのルールを適用する。
  2. ARIAの仕様において "abstract"と定義されているロール(role)は、アクセシビリティAPIの標準的なロール(role)のメカニズムを経由してマッピングされるべきではない。abstractのロール(role)は以下のようになる。
  3. プラットフォームのアクセシビリティAPIの標準的なロール(role)とマッピングがない場合、プラットフォームのアクセシビリティAPIのロール(role)のマッピングに使用されるアルゴリズムはロール(role)属性が提示されていないかのように動作すべきである。つまり、ユーザーエージェントが、ロール(role)属性を伴った要素に対する基本的なマークアップの通常の処理に頼ることになる。例えば、<table role="log">に対しては、プラットフォームのアクセシビリティAPIのどのロール(role)を使用すべきか判断するためにタグ名の"table"を使うこと。<input type="text" role="search">の場合は、テキスト入力のためにプラットフォームのアクセシビリティAPIを使用すること。
  4. ロール(role)文字列全体が、オブジェクトの属性の"xml-roles"にエクスポーズされるべきである。これによって、支援技術がロール(role)に対する付加的な処理を行うことができる。

動的なロール(role)の変更は、WAI-ARIAの仕様ではエラーであると考えられており、 エラーへの対処の項で説明されている。

ARIAのロール(role)MSAAのロール(role)IAccessible2のロール(role)(MSAAと異なる場合)ATKのロール(role)

NSAccessibilityのロール(role)

"alert"ROLE_SYSTEM_ALERT ATK_ROLE_ALERT
"alertdialog"ROLE_SYSTEM_ALERT ATK_ROLE_ALERT
"application"ROLE_SYSTEM_APPLICATION ATK_ROLE_EMBEDDED
"button"ROLE_SYSTEM_PUSHBUTTON"button"のARIAのステート(state)がaria-haspopup="true"となっている場合は、ROLE_SYSTEM_BUTTONMENUとしてエクスポーズされるべきである"button"のaria-pressedundefinedではない場合、IA2にIA2_ROLE_TOGGLE_BUTTONとしてエクスポーズされるべきであるATK_ROLE_PUSH_BUTTONNSAccessibilityButtonRole
"checkbox"ROLE_SYSTEM_CHECKBUTTON + object attribute checkable="true" ATK_ROLE_CHECK_BOX + object attribute checkable="true"NSAccessibilityCheckBoxRole
"columnheader"ROLE_SYSTEM_COLUMNHEADER ATK_ROLE_COLUMN_HEADER
"combobox"ROLE_SYSTEM_COMBOBOX + STATE_SYSTEM_HASPOPUParia-expanded != "true"であれば STATE_SYSTEM_COLLAPSEDをエクスポーズする。 ATK_ROLE_COMBO_BOX + ATK_STATE_EXPANDABLE + object attribute haspopup="true"NSAccessibilityComboBoxRole
"description"ロール(role)のマッピングがないのでxml-rolesを使用することIA2_ROLE_TEXT_FRAMEATK_ROLE_TEXT
"dialog"ROLE_SYSTEM_DIALOG ATK_ROLE_DIALOG
"document"ROLE_SYSTEM_DOCUMENT ATK_ROLE_DOCUMENT_FRAME
"grid"ROLE_SYSTEM_TABLE ATK_ROLE_TABLE
"gridcell"ROLE_SYSTEM_CELL ATK_ROLE_TABLE_CELL
"group"ROLE_SYSTEM_GROUPING ATK_ROLE_PANELNSAccessibilityGroupRole
"heading"該当無し、xml-rolesを使用することIA2_ROLE_HEADINGATK_ROLE_HEADING
"img"ROLE_SYSTEM_GRAPHIC ATK_ROLE_IMAGENSAccessibilityImageRole
"label"ROLE_SYSTEM_STATICTEXTIA2_ROLE_LABELATK_ROLE_LABEL
"link"ROLE_SYSTEM_LINKさらに、リンクとその全ての子孫に対してSTATE_LINKEDをエクスポーズする特別なルールを適用すること。 ATK_ROLE_LINKNSAccessibilityLinkRole
"list"ROLE_SYSTEM_LIST + STATE_SYSTEM_READONLY ATK_ROLE_LIST
"listbox"ROLE_SYSTEM_LIST ATK_ROLE_LIST。特例:"listbox"が親を持っているかaria-ownsにより"combobox"の子となっている場合はATK_ROLE_MENU.でエクスポーズされるべきであるNSAccessibilityListRole
"listitem"ROLE_SYSTEM_LISTITEM + STATE_SYSTEM_READONLY ATK_ROLE_LISTITEM
"marquee"ロールのマッピングがないのでxml-rolesを使用すること ATK_ROLE_PANE
"menu"ROLE_SYSTEM_MENUPOPUP ATK_ROLE_MENU.親メニュー項目がサブメニューをを包含している場合は、これらのオブジェクトはサブメニューとしてエクスポーズされるべきではないNSAccessibilityMenuRole
"menubar"ROLE_SYSTEM_MENUBAR ATK_ROLE_MENU_BARNSAccessibilityGroupRole
"menuitem"ROLE_SYSTEM_MENUITEM ATK_ROLE_MENU_ITEM
  • aria-checkedundefinedではない場合、オブジェクトの属性"checkable"="true"をサポートする。

"option"の親がgroupのロール(role)を持っている場合、NSAccessibilityMenuButtonRoleに対してrole="menuitem" がマッピングする

"option"の親がmenuのロール(role)を持っている場合、NSAccessibilityMenuItemRoleに対してrole="menuitem"がマッピングする

"menuitemcheckbox"ROLE_SYSTEM_MENUITEM + object attribute checkable=trueIA2_ROLE_CHECK_MENU_ITEM + object attribute checkable="true"ATK_ROLE_CHECK_MENU_ITEM + object attribute checkable="true"NSAccessibilityMenuItemRole
"menuitemradio"ROLE_SYSTEM_MENUITEM + object attribute checkable=trueIA2_ROLE_RADIO_MENU_ITEM + object attribute checkable="true"ATK_ROLE_RADIO_MENU_ITEM + object attribute checkable="true"NSAccessibilityMenuItemRole
"option"ROLE_SYSTEM_LISTITEM +aria-checkedが+undefinedではない場合、オブジェクトの属性checkable"="true"をサポートする。 ATK_ROLE_LIST_ITEM
  • If aria-checkedundefinedではない場合、オブジェクトの属性checkable"="true"をサポートする。
  • 特例:optionがATK_ROLE_MENUとしてエクスポーズされている親を持っている場合は、ATK_ROLE_MENU_ITEMとしてエクスポーズされるべきである

"option"の親がmenuのロール(role)を持っている場合、NSAccessibilityMenuItemRoleに対して role="option"がマッピングする。

"option"の親がlistboxのロール(role)を持っている場合、NSAccessibilityStaticTextRoleに対して、role="option" がマッピングする。

"presentation"フォーカス可能な場合以外は、このオブジェクトはエクスポーズしてはならない。 フォーカス可能な場合以外は、このオブジェクトはエクスポーズしてはならない。
"progressbar"ROLE_SYSTEM_PROGRESSBAR + READONLY ATK_ROLE_PROGRESS_BAR + READONLYNSAccessibilityProgressIndicatorRole
"radio"ROLE_SYSTEM_RADIOBUTTON ATK_ROLE_RADIO_BUTTONNSAccessibilityRadioButtonRole
"radiogroup"ROLE_SYSTEM_GROUPING ATK_ROLE_PANENSAccessibilityRadioGroupRole
"region"ROLE_SYSTEM_PANE ATK_ROLE_PANE
"row"ROLE_SYSTEM_ROW 内部が"tree" または"treegrid"の場合以外はROLE_SYSTEM_OUTLINEITEM ATK_ROLE_LIST_ITEM
"rowheader"ROLE_SYSTEM_ROWHEADER ATK_ROLE_ROW_HEADER
"section"ないのでxml-rolesを使用することIA2_ROLE_SECTIONATK_ROLE_SECTION
"separator"ROLE_SYSTEM_SEPARATOR ATK_ROLE_SEPARATOR
"slider"ROLE_SYSTEM_SLIDER ATK_ROLE_SLIDERNSAccessibilitySliderRole
"spinbutton"ROLE_SYSTEM_SPINBUTTON ATK_ROLE_SPIN_BUTTONNSAccessibilityProgressIndicatorRole
"status"ROLE_SYSTEM_STATUSBAR ATK_ROLE_STATUSBAR
"tab"ROLE_SYSTEM_PAGETABaria-labelledbyに関連づけられたtabpanelの中にフォーカスが置かれている場合、SELECTEDのステート(state)をエクスポーズさせる。 ATK_ROLE_PAGE_TABaria-labelledbyに関連づけられたtabpanelの中にフォーカスが置かれている場合、SELECTED ステート(state)をエクスポーズさせる。
"tablist"ROLE_SYSTEM_PAGETABLIST ATK_ROLE_PAGE_TAB_LIST
"tabpanel"ROLE_SYSTEM_PROPERTYPAGE ATK_ROLE_SCROLL_PANE
"textbox"ROLE_SYSTEM_TEXT + IA2_STATE_SINGLE_LINE of aria-multiline は"true"ではない ATK_ROLE_ENTRY + ATK_STATE_SINGLE_LINE of aria-multilineは"true"ではないNSAccessibilityTextAreaRole
"toolbar"ROLE_SYSTEM_TOOLBAR ATK_ROLE_TOOL_BAR
"tooltip"ROLE_SYSTEM_TOOLTIP ATK_ROLE_TOOL_TIP
"tree"ROLE_SYSTEM_OUTLINE ATK_ROLE_TREE
"treegrid"ROLE_SYSTEM_OUTLINE ATK_ROLE_TREE_TABLE
"treeitem"ROLE_SYSTEM_OUTLINEITEM +aria-checkedundefinedではない場合、オブジェクトの属性"checkable"="true"をサポートする。 ATK_ROLE_LIST_ITEM + aria-checkedundefinedではない場合、オブジェクトの属性"checkable"="true"をサポートする。

3.5. ステート(state)とプロパティのマッピング

このセクションでは、付加的なステート(state)及びこの文書の前のセクションでは扱わなかったオブジェクトのプロパティのエクスポーズ方法について解説する。可能であれば、APIの標準的なステート(state)を用いる。用いることができないときは、オブジェクトの属性(または同様のメカニズム)が必要となる。

  1. VISIBLE/INVISIBLESHOWING/OFFSCREENなどのような管理されたステート(state)を計算する。一般的にAIRAの属性を持たない通常の要素に対して行われる場合と同様に行われる。FOCUSABLE/FOCUSEDについては、aria-activedescendantによる影響を受けることがあるので、aria-activedescendantにおけるルールを参照のこと。
  2. 基本的なマークアップに対して、アクセシビリティの実装よってサポートされているステート(state)及びオブジェクトの属性を加える。
  3. 主要なロール(role)のための特例のルールを適用する。例えば、ロール(role)によっては、エクスポーズされるべき付加的なステート(state)を必要とする。主要なマッピングされたロール(role)については、Role(role)にあるロール(role)一覧表で、エクスポーズすべき付加的なステート(state)及びオブジェクトの属性を確認できる。
  4. 関連のあるAIRAのプロパティのステート(state)を計算する。関連のあるARIAのプロパティを判断するためには、グローバルなステート(state)及びプロパティ のリストを、カレント要素にあるロール(role)によってサポートされている特定のステート(state)とプロパティと組み合わせる。 例えば、全ての要素がaria-requiredをサポートしているが、role="checkbox"のように、aria-checkedプロパティをサポートしているロール(role)は限られている。プロパティの計算については、以下の一覧表を参照のこと。
  5. 将来のバージョンにおける新しいARIAのプロパティとの上位互換性のために、この表にはないすべてのプロパティでオブジェクトの属性があるものは、名前から"aria-"という接頭辞を取り除いてエクスポーズする。例えば、aria-foo="bar"は、オブジェクトの属性であるfoo=barを伴ってエクスポーズされる。それは、aria-fooが仕様上は既知のARIAプロパティではないからである(具体的なマッピングのルールによってまだカバーされていない)。

ARIAのプロパティのマッピングルールに関する一覧表

重要な注記:ARIAの属性が、提示されていない、長さがゼロの文字列に設定されている、又はundefinedである場合、BooleanまたはNMTOKENの型のAIRAプロパティはどれも"undefined"である。これは、文字列10進型IDREF、またはIDREFSの型であるプロパティには影響を及ぼさない。

また、グローバルでないステート(state)及びプロパティは、それらをサポートするロール(role)を伴った要素上でのみ計算されるようにする。

ARIAのステート(state)エクスポーズすべきもの
aria-activedescendant

aria-activedescendantで説明されているようにエクスポーズする。そして、支援技術がこの属性のあるコンテナ内でフォーカス変更を行うときに適切に設定する。undefinedではない場合は、支援技術からのフォーカス変更への対処で説明されているようにエクスポーズする。

ユニバーサルアクセス:AXFocusedがtrueならば、aria-activedescendantの値が変化したとき、 "NSAccessibilityFocusedUIElementChangedNotification" の通知を発信する。

aria-atomic

undefinedでもfalseでもない場合、atomic="true"をエクスポーズする。さらに、全ての子孫のcontainer-atomic="true"をエクスポーズする。文書のコンテンツまたはノードの可視性に対する変更で説明されているように、RELATION_MEMBER_OFも同様に、この要素(アトミックなルート)を指定してエクスポーズする。

aria-autocomplete
  • undefined ではない、またはnoneの場合、autocompleteと呼ばれるオブジェクトの属性にある値をエクスポーズし、SUPPORTS_AUTOCOMPLETIONの同等なステート(state)をエクスポーズする。
aria-busy
  • falseの場合、BUSYステート(state)をクリアする。そうでなければ、undefined でない場合はBUSYステート(state)をエクスポーズする。
aria-checked
  • falseの場合、CHECKEDステート(state)をクリアする。そうでなければ、undefined でない場合はCHECKEDステート(state)を設定する。
  • aria-checked が"mixed"の場合、"radio" あるいは"menuitemradio"のロール以外はATK_STATE_INDETERMINATE/STATE_SYSTEM_MIXEDをエクスポーズする。("radio" あるいは"menuitemradio"の場合はfalseとして扱う)
  • 更に、aria-checkedundefined でなければ、オブジェクトの属性checkable="true"をエクスポーズする。
  • ユニバーサルアクセス: "false" => AXValue="0"; "true" => AXValue="1"; "mixed" => AXValue="0.5"
aria-controlsリレーションで説明されているようにリレーションをエクスポーズする。
aria-describedbyリレーションで説明されているようにリレーションをエクスポーズする。
  • MSAAでは、accDescription経由でエクスポーズする。
  • ユニバーサルアクセス:プロパティ値によって求められる要素のテキストの値にAXDescriptionを設定する。
aria-disabled
  • MSAAでは、aria-disabledが "false"の場合、 STATE_SYSTEM_UNAVAILABLEをクリアし、そうでなければ、undefinedでない場合はSTATE_SYSTEM_UNAVAILABLEを設定する。
  • 全てのAPIでは、aria-disabled= "true"の場合は、SENSITIVE + ENABLEDをエクスポーズする。
  • さらに、aria-disabledには、要素の子孫でFOCUSABLEを置くことができるもの全てに広まるという特別なプロパティがある。
  • ユニバーサルアクセス:AXEnabled を!aria-disabledに設定する。
aria-dropeffectオブジェクトの属性"dropeffect"としてエクスポーズする。
aria-expanded
  • MSAAでは、undefined の場合、何もしない。そうでなければ、falseの場合はSTATE_SYSTEM_COLLAPSEDを設定し、それ以外ではSTATE_SYSTEM_EXPANDEDを設定する。
  • ATKでは、undefinedでない場合は、ATK_STATE_EXPANDABLEをエクスポーズし、undefined でもfalseでもない場合はATK_STATE_EXPANDEDをエクスポーズする。
aria-flowtoリレーションで説明されているように、リレーションをエクスポーズする。
aria-hiddenプラットフォームのアクセシビリティAPIへのマッピングでは使用されていない。しかし、レイアウトシステムからの情報を用いて、要素がhiddenかどうかを判断している。助言:aria-hidden="true"のある要素が視覚的に認識できる場合、それはARIAにおいての正しい用法ではない。aria-hiddenプロパティは、可視、不可視の状態の変更をDOMベースの支援機器に伝達する場合にのみエクスポーズされる。しかし、レイアウトは真にhiddenとなっているすべてのノードの最も完全なセットを提供することができる。
aria-invalidfalseの場合、INVALID_ENTRY または同等のステート(state)をクリアし、falseでもundefinedでもない場合は、INVALID_ENTRYを設定する。さらに、falseではない、または undefined の場合、text属性(オブジェクトの属性ではなく)として値をエクスポーズする。現在の取り得る値はtrue、spellingまたはgrammarである。
aria-haspopup

falseの場合、HASPOPUPステート(state)(MSAAのみ)とオブジェクトの属性(両方)をクリアする。それ以外でundefinedの場合は:

  • MSAAではSTATE_SYSTEM_HASPOPUPとしてエクスポーズする。
  • ATKではオブジェクトの属性をhaspopup="true"としてエクスポーズする。
  • ユニバーサルアクセスではAXShowMenu actionをエクスポーズする。
付加的なルール?MSAAに対してエクスポーズされる最後のロール(role)に影響がある。プッシュボタン上の場合は、{HT、ロール(role)をROLE_SYSTEM_BUTTONMENUに変更する)
aria-labelアクセシブルな名前でエクスポーズする。
aria-labelledbyアクセシブルな名前及びリレーションで説明されているとおり、リレーションをエクスポーズする。
aria-levellevelオブジェクトの属性、及びIAccessible2のgroupPositionにある値をエクスポーズする。treeアイテムで使用した場合は、RELATION_NODE_CHILD_OFに影響を与えることがある。“Group Position”の項参照。
aria-live

undefinedでない場合、“live”という名前のついたobjectの属性の値をエクスポーズする。文書コンテンツあるいはノードの可視状態の変更で説明されているように、"container-live" オブジェクトの属性を、全ての子孫の値とともにエクスポーズする。

aria-multiline

falseの場合、MULTI_LINEのステート(state)をクリアし、SINGLE_LINEを設定する。undefinedではない場合、MULTI_LINEステート(state)を設定し、SINGLE_LINEをクリアする。

ユニバーサルアクセス: "textbox" ロール(role)をAXTextAreaとして伝える。

aria-multiselectable

falseの場合、MULTISELECTABLEのステート(state)をクリアし、undefinedではない場合は、MULTISELECTABLEステート(state)を設定する。
MSAAでは、MULTISELECTABLEと正確にマッチするように、STATE_SYSTEM_EXTSELECTABLEをエクスポーズする。
AccessibleSelection インタフェースをエクスポーズする。Selectionを参照。

aria-ownsリレーションで説明されているように、リレーションをエクスポーズする。
aria-pressed
  • aria-pressed="false"の場合、PRESSEDステート(state)をクリアし、undefinedでない場合は、PRESSEDステート(state)を設定する。
  • aria-pressedが "mixed" の場合、ATK_STATE_INDETERMINATE/STATE_SYSTEM_MIXEDをエクスポーズする。
  • さらに、aria-pressedundefined ではない場合、オブジェクトの属性のcheckable="true"をエクスポーズする。
  • このプロパティは、プラットフォームのアクセシビリティAPI経由でエクスポーズされる最後のロール(role)に影響を与える可能性がある。undefinedでない場合、ボタン上(ARIA/HTML/XUL)ではIA2_ROLE_TOGGLE_BUTTON/ATK_ROLE_TOGGLE_BUTTONと変更してロールをエクスポーズする。
aria-posinset"posinset"オブジェクトの属性、 及びIAccessible2のgroupPositionにある値をエクスポーズする。
aria-readonly

MSAAでは、STATE_SYSTEM_READONLYとしてエクスポーズする。

編集可能な要素上、例えばENTRYまたは、EditableText インタフェースをサポートしている場合、EDITABLEREADONLYとは論理的に反対に設定されるように配慮する。

aria-relevantundefinedでない場合、“relevant”と名の付くオブジェクトの属性の値をエクスポーズする。文書コンテンツあるいはノードの可視状態の変更で説明されているように、全ての子孫の値とともに"container-relevant" オブジェクトの属性をエクスポーズする。
aria-requiredREQUIREDステート(state)としてエクスポーズする。
aria-selected
  • aria-selectedがfalseの場合、SELECTEDをクリアし、undefined ではない場合、SELECTEDをエクスポーズする。
  • undefined ではない場合、SELECTABLEもエクスポーズする。
  • SELECTABLEでありDISABLEDではない場合、選択で説明されているように、aria-multiselectableを伴った祖先にAccessible Selectionインタフェースを使用しているときは、必要に応じて"true" と"false"を切替える。
  • ユニバーサルアクセス:AXSelected 属性を設定する。
aria-setsize"setsize"オブジェクトの属性及び IAccessible2のgroupPositionの値をエクスポーズする。
aria-sort”sort”オブジェクトの属性の値をエクスポーズする。
aria-valuemax

で説明されているように、AccessibleValueインタフェース経由でエクスポーズする。

ユニバーサルアクセス:AXMaxValue 属性を設定する。

aria-valuemin

で説明されているように、AccessibleValueインタフェース経由でエクスポーズする。

ユニバーサルアクセス:AXMinValue属性を設定する。

aria-valuenow

で説明されているように、AccessibleValueインタフェース経由でエクスポーズする。そして、DISABLEDREADONLYのいずれでもなく、正当な値が選択されている要素に支援技術がValueインタフェースを使って値を設定するときに、設定すること。MSAAでは、aria-valuetextを使って値のテキスト等価物を置き換える場合を除いて、get_accValue経由でもエクスポーズする。

ユニバーサルアクセス:AXValueを設定し、必要に応じてNSAccessibilityValueChangedNotificationをポストする。

aria-valuetext

で説明されているように、"valuetext"オブジェクトの属性にエクスポーズする。

[アーロン:これで合っていると思うが?... ユニバーサルアクセス:NSAccessibilityValueDescription属性をvaluetext変数に設定する。]

動的なARIAのプロパティの変更には、例えばstate changeイベントのようなイベントをエクスポーズして変化が起こったことを示す。簡潔さと性能のために、ユーザーエージェントは、支援技術が通常は無視するプロパティに対する変更イベントを取り除いても よい。 しかし、少なくとも、state changeイベントは、次の変更に対して実行されるべきである

他の変更のタイプ

3.6. 追加的な計算が必要とする特別な処理

3.6.1. 名前と記述

3.6.1.1. テキスト等価物の計算

この計算は、後に説明する「名前」と「記述」の両方の計算で言及されている。

  • カレントノード - テキスト等価物を計算するために現在走査しているDOMノード
  • カレントトータルテキスト - カレントノードに達するまでに計算していたテキスト等価物

要素のテキスト等価物を計算するには、

  1. 必要であれば先頭にスペースを追加する:カレントノードが要素であり、display: inlineを用いてスタイルを指定していない場合、もしテキスト等価物の結果の文字列が現在empty値でなければ、末尾にスペースを追加する。
  2. カレントノードのためのテキスト等価物を計算する。
    1. カレントノードが非表示で、テキスト等価物の走査で使用されているaria-labelledbyまたはaria-describedbyによって現在直接指定されていない場合は、ノードをスキップする。

    2. それ以外で、カレントノードがテキストノードの場合は、テキストコンテンツを末尾に追加する。空白が正規化されていれば、一般的にレンダリングされたテキストコンテンツを末尾に追加するのが好ましい。

    3. それ以外で、aria-labelがある場合は、aria-labelのプロパティの値をこのノードのテキスト等価物に使用する。

    4. それ以外で、aria-labelledbyがあり、このノードがaria-labelledbyの一部またはアクセシブルな名前の計算の一部にまだなっていない場合は、このノードのテキスト等価物を生成するために aria-labelledbyの処理を行う。aria-labelledbyの値の中で、発生順にIDの処理を行い、文書中の要素上で特定されないIDは無視する。要素に関連付けられたそれぞれのIDのために、ステップ1から始まるこのテキスト等価物の計算を実装する。計算結果が集められて行くに従って、トータルテキスト等価物の結果の文字列に計算結果を末尾に追加していく。例えば、

      <button aria-labelledby="span" id="btn" /> Text equivalent = "text"?これはテキスト等価物を計算するためのルートノードであるためaria-labelledbyをたどっていく。
      <button aria-labelledby="btn" />テキスト等価物はない。なぜなら、上記の一つめのaria-labelledbyはたどっていくが、この二つめはテキスト等価物を計算するためのルートノードではないので、たどっていかないからである。
      <span id="span">text</span>

    5. それ以外で、ネイティブのマークアップでテキスト等価物が提供されている場合は、テキスト等価物に追加する。ネイティブのマークアップにおけるテキスト等価物の例は、HTMLの<img>要素のalt属性値またはfor属性のある<label for>要素で示されるラベルである。しかしながら、ここではツールチップのマークアップは使わないこと。hの項にあるように基本的には最後の手段として使用するからだ。

    6. このノードのユーザーが入力したカレントな値をテキスト等価物の末尾に追加する。しかしながら、同じテキストが繰り返して提示されることを避けるために、このテキストが同じノードに対するテキスト等価物の計算の最初か最後になる場合は付け加えないこと。例として、

      <span role="checkbox" id="cb">Want <input type="text" aria-labelledby="cb"> for breakfast</span>
      <span role="checkbox" id="cb"><input type="text" aria-labelledby="cb"> wants breakfast</span>
      <span role="checkbox" id="cb">I want to eat <input type="text" aria-labelledby="cb"></span>

      結果:

      下の<span role="checkbox"> 要素に対するテキスト等価物は常に内部のテキストフィールドを使用する。なぜならば、テキストフィールドは異なるノード(the<span role="checkbox>)のためのテキスト等価物の計算の一部なのである。

      <input>に対するテキスト等価物には、下に示す番号1の事例でのみ、自分自身のlabelに対して値に使用している。これはテキスト等価物の計算の途中にある。値はテキスト等価物の途中で発生するので、より大きなテキスト等価物の文脈の中に提示する必要がある。

    7. このノードに対するテキスト等価物が空値で、カレントノードのロール(role)が"Name From: subtree"を許可する場合またはカレントノードがコントロールではないがラベルあるいは記述の一部である場合は、個々の子にこの名前の計算を再帰的に実装すること。ステップ1から開始して、名前文字列の結果の合計に集められて行くに従って結果を末尾に追加していく。この再帰法の結果がホワイトスペースのみとなった場合は、empty文字列になるまで削減してゆき、代わりに以下のルールを適用する。

    8. それ以外で、このノードに対するテキストによる記述がまだemptyである場合合、カレントノードにいずれか(例、HTMLのtitle属性、XULのtooltiptext属性またはtooltip属性)がもしあれば、カレントノードに対する名前をツールチップから取得する

  3. 必要に応じてスペースを末尾に追加する。カレントノードが要素であり、display: inlineを用いてスタイルを指定していない場合、空白文字を末尾に追加する。
  4. 空白文字を正規化し、先頭と末尾のスペースを取り除き(以前のステップで加えられたものも含めて)、一文字のスペースになるまで他の空白文字も取り除く。
3.6.1.2. 名前の計算

要素に対してアクセシブルな名前を計算するには、まず空文字列から始める。

aria-labelが存在せず、aria-labelledbyが存在する場合、aria-labelledbyが示している要素に対するテキスト等価物の計算を使って名前を収集する。aria-labelledbyにあるIDを登場順に処理する。文書中の要素上で特定されていないIDは無視する。

これ以外では、aria-labelledbyが使われていないことを意味するので、カレントの要素上でテキスト等価物の計算を使ってアクセス可能な名前を計算すべきである

要素が <img> で、テキスト等価物が空値の場合、なんらかのラベル付けのための属性の存在を調べる。特にaria-labelaria-labelledby、altまたはtitleなどである。これらのいずれかが存在していたとすれば、装飾目的であったり、冗長なイメージのコンテンツに対して、空値のテキスト等価物を設定した開発者の意図をうかがわせる。いずれの属性も存在しない場合は、イメージに対して開発者が単にアクセシブルなラベルをつけなかったことを示唆しており、実装では""ではなくNULL値をアクセシブルな名前として返すべきである。これによって、提供されていないアクセシブルな名前を補うために、支援技術が独自の経験則に基づいた処理を行う必要があることを支援技術に対してほのめかすことになる。

3.6.1.3. 記述の計算

要素に対するアクセシブルな記述を計算するには、まず空文字列から始める。

aria-describedbyが存在していれば、aria-describedbyが示している要素から記述を収集する。aria-describedbyにあるIDを登場順に処理する。文書中の要素上で特定されていないIDは無視する。個々のIDに対してテキスト等価物の計算を用いる。

3.6.2. ウィジェットの値

要素上で使用されているロール(role)のためにaria-valuenow属性がサポートされているときは、エクスポーズするアクセシブルなオブジェクト上でAccessibleValueインタフェースがサポートされていなければならないaria-valueminaria-valuemaxはAccessibleValueインタフェースを経由してエクスポーズされるべきである

aria-valuetext プロパティを経由して設定される数値に対するテキスト等価物も存在しうる。それはvaluetextオブジェクト属性または、APIの中でオブジェクトの属性が利用できない場合は、同様なメカニズムを経由してエクスポーズされるべきであるaria-valuetextが存在しないときは、valuetextオブジェクトの属性にある aria-valuenowの文字列バージョンをエクスポーズする。

さらに、MSAAに対しては、文字列はIAccessible::get_accValueを経由してエクスポーズされるべきである

aria-valuenowに対する変更はvalue changeイベントを経由してエクスポーズされるべきである [デイビッド・ボルター氏コメント:ここで適用されるべきイベントを抑制するものはあるか、犠牲は多くならずにすむか(関連するグループポスト参照)]

値を取ることが必須の要素に値が設定されない場合、カレントの値はエラーを返すべきである。これはカレントの値が確定しないprogressbarに対する有効条件である。

AccessibleValueにより値を設定することがきる。オブジェクトがreadonly、disabledのいずれでもない場合に設定できるようにすべきであり、ユーザーエージェントは新しい値を反映させるためにaria-valuenowを設定すべきである。値が常にreadonlyとなるので、プログレスメーターの値を変更することは不可能である。実装では、aria-valueminより小さい値、及びaria-valuemaxを超える値を拒絶すべきである。オブジェクトがreadonlyまたはdisabledであるために値を設定できず、新しい値が禁じられている場合には、実装においては値を設定するのではなく例外として処理すべきである

開発者向け注記:aria-valuenowをサポートし、readonlydisabledのいずれでもないスクリプトウィジェットは、aria-valuenowの変化に注視すべきであり、変化があった場合は内部のステート(state)、(使用している場合)aria-valuetext、及びウィジェットの視覚に関するステート(state)をリセットする。

3.6.3. 関係属性

全ての関係属性はどのエレメントに対してもグローバルに適用することができる。そのため、計算する前にロール(role)をチェックすることは重要ではない。関係属性はIDリスト(スペース区切りされたIDのリスト)を使用する。関係属性のIDは、getElementByIdが引数として返したIDを持っている要素とマッチする。

関係属性をエクスポーズする

  • aria-controlsRELATION_CONTROLLER_FORとマッピングする
  • aria-describedbyRELATION_DESCRIBED_BYとマッピングする
  • aria-flowtoRELATION_FLOW_TOとマッピングする
  • aria-labelledbyRELATION_LABELLED_BYとマッピングする
  • aria-ownsはATK/AT-SPI、 IAccessible2とは標準APIで関係のマッピングを持たない。

関係属性を逆算する

  • 関係を逆算するために、ARIAの関係を使用しカレント要素のIDを示している他の要素をチェックする
  • If aria-controls属性がその要素を示している場合は、RELATION_CONTROLLED_BYをエクスポーズする
  • aria-describedby属性がその要素を示している場合は、RELATION_DESCRIPTION_FORをエクスポーズする
  • aria-flowto属性がその要素を示している場合は、RELATION_FLOW_FROMをエクスポーズする
  • aria-labelledby属性がその要素を示している場合は、RELATION_LABEL_FORをエクスポーズする。
  • aria-owns属性がその要素を示している場合は、RELATION_NODE_CHILD_OFをエクスポーズする。

aria-labelledby属性とHTMLの<label for=>の両方が使用されている場合は、ARIAの関係が勝り、HTMLのlabelの関係は無視される。

aria-ownsが使用されていない場合は、role="treeitem"については、RELATION_NODE_CHILD_OFを計算する。

  • カレントのtreeitemがaria-levelを使用している場合は、 より低いaria-levelを伴ったtreeitemが見つかるまでtreeを遡り、それを指定する。treeの一番上まで達した場合はtree自体を示す。
  • treeitemの親がrole="group"の場合は、treeitemが見つかるまでgroupから遡りそれを示す。これは、role="group"がtreeの階層を体系付けるのに使用されているケースである。

aria-atomic属性からRELATION_MEMBER_OF を計算する

  • aria-atomic="true"となっている先祖要素のチェーンをチェックする。その要素のアクセシブルなすべての子孫は、RELATION_MEMBER_OFの関係を使用し、aria-atomic="true"を設定している先祖を指定すべきである

3.6.4. グループの位置

要素上で使用されているロール(role)によって等価なARIAプロパティがサポートされているときは、"posinset"や"setsize"、"level" といったオブジェクトの属性はエクスポーズされるべきである。さらに、 IAccessible2では、同じ情報がIAccessible2::groupPositionを経由してエクスポーズされなければならない

階層が提供されていない場合は計算する。

  • role="treeitem" に対して、開発者からaria-levelが提供されていない場合は、リレーションで説明しているように、明示的、あるいは計算して得られたRELATION_NODE_CHILD_OFに従って計算しなければならない

posinsetとsetsizeが提供されていない場合に計算を行う際

  • role="treeitem"については、明示的または、計算して得られる階層がカレントアイテムの階層より少なくなるまで、ツリーの階層を行き来する。カレントアイテムと同じ階層になったに場合のみアイテムの数を数える。
  • そうでない場合は、親DOMの中を行き来して、同じロール(role)を持ったアイテムの数を数える。
  • posinsetはカレントアイテムとグループ内のその前にあるアイテムを含む。setsizeはカレントアイテム以降の同一グループ内のアイテム数を追加する。

これらのプロパティはすべて、1ベースである。オブジェクトのプロパティが存在しない際または値が“0”の際は、プロパティが計算されていないか、サポートされていないことを表している。

これらの値が1ベースであるので、カレントアイテムは計算に含まれなければならない。posinsetについては、DOMの中でカレントアイテムの前にある場合のみアイテムを追加する。setsizeについては、DOMのカレントアイテムの後のアイテムを追加する。

4. 管理されたステート(state)

4.1. 付加的なインタフェースをエクスポーズする

一般的に、アクセシブルなオブジェクトのためにどのインタフェースがエクスポーズされるかをベースマークアップで決定すべきである。しかしながら、次のような場合は、どちらのインタフェースがエクスポーズされるべきかをARIAのマークアップが変更している。

ARIA特有の事項ではないが、アクセシブルなウェブアプリケーションという目的のために、インタフェースをエクスポーズするための、いくつかの役に立つ追加的な規則について言及する価値がある。

4.2. アクション

アクションは以下の規則によってエクスポーズされる。

ARIAのロール(role)とアクションの対応表

ARIAのロール(role)

アクション
alertno
alertdialogno
applicationno
articleno
buttonclick
checkboxcheck/uncheck
columnheaderno
comboboxopen/close
descriptionno
dialogno
documentno
gridno
gridcellno
groupno
headingno
imgno
labelno
linkjump
listno
listboxno
listitemselect/unselect if parent role is listbox
mathno
menuno
menubarno
menuitemclick
menuitemcheckboxclick
menuitemradioclick
optionselect/unselect
presentationno
progressbarno
radioselect
regionno
rowno
rowheaderno
sectionno
separatorno
sliderno
spinbuttonno
statusno
tabswitch
tablistno
tabpanelno
textboxactivate
toolbarno
tooltipno
treeno
treegridno
treeitemactivate + expand/collapse

4.3. 文書のコンテンツまたはノードの可視性に対する変更

文書の変更を処理することはARIAに限らず重要である。しかしながら、多くの場合AIRAのマークアップを伴うAJAX及びその他のユースケースを有効にすることは極めて重大なので、本項でそれをどのように行うか文書化ている。

テキストの変更に対してこれらのイベントを駆動させる。

  1. テキストが取り除かれたとき、IA2_EVENT_TEXT_REMOVED(IA2) 及びtext_changed:delete (ATK)を駆動。
  2. テキストが挿入されたとき、IA2_EVENT_TEXT_INSERTED(IA2) と text_changed:insert (ATK)
  3. テキストが変更されたとき、削除イベントに続き、挿入イベントを駆動

問題のノードが要素であり、アクセシブルなオブジェクトを有しているノードの変化に対してこれらのイベントを駆動させる。

  1. サブツリーが削除または非表示となったとき、EVENT_OBJECT_HIDE(MSAA) 及び children_changed:remove (ATK)を駆動させる。MSAAのEVENT_OBJECT_DESTROYイベントは動作の安定性の問題が過去にあり、支援技術が避けているため使用しない。いずれの場合でも、ユーザーの視点では、非表示のものと無効化されたものとの間には違いはない。
  2. サブツリーが挿入、または展開されたとき、EVENT_OBJECT_SHOW(MSAA) 及び children_changed:add (ATK)とを駆動させる。
  3. サブツリーが移動されたときは、ある場所から削除されて他の場所へ挿入したように扱う。
  4. サブツリーが変更(例、replaceNode)されたときは、削除と挿入のように扱う。

ノードが要素ではない、またはアクセシブルなオブジェクトを持たない場合:

上で述べた変更イベントのいずれかを駆動するときは、(ページの読み込みなどによって引き起こされたタイムアウトとは反対に)ユーザーの入力によって変更が引き起こされたかどうかについての情報を提供するととても有用である。これによって支援技術はユーザーのアクションからの変更とは反対の実世界からの変更を提示するための別の規則を持つことができる。 マウスホバーは明確なユーザーの入力とはみなされない。なぜなら、マウスの偶発的な衝突で起こりうるからである。

変更がユーザーの入力によって起きたかどうかをエクスポーズするためには:

変更の状況についてのさらなる有益な情報をエクスポーズする:

追加的なMSAAイベントが必要になることがある:

4.4. 選択

選択には二つの場合がある。

単一選択の場合では、選択のイベントとステート(state)をフォーカスから切り離して管理することが常に必要というわけではない。なぜなら、選択 はfocusを反映するからである。一つの例外はタブリストに対してである。タブの場合、タブまたは関連付けられたタブパネルにフォーカスがある場合、タブはSELECTEDとみなされる。これを実装するには、フォーカスの当たっている箇所からタブパネルを見つけるまで親鎖を上がって行き、aria-labelledbyの関係をタブパネルから関連するタブまで全探索し、見つかったタブをフォーカスが当たっているとマークする。

aria-multiselectableプロパティをサポートするロールを持った要素でaria-multiselectable="true"のとき、複数選択の場合が発生する。これにはいくつかの重要な側面がある。

  1. コンテナの正しいステート(state)をエクスポーズする: MULTISELECTABLE及びMSAAではさらに EXTSELECTABLE
  2. aria-multiselectableを伴ったコンテナのAccessibleSelectionインタフェースをサポートすること。選択インタフェースは、支援技術が実際に子孫に選択を設定するのに使用することができる。 aria-selected定義されていない場合、すなわち、要素がSELECTABLEでない場合は、特定の子孫に対しては機能させないようにすべきである。特定の子孫が何らかの理由によりDISABLEDまたはREADONLYとなっている場合も機能させないようにすべきである。ある項目から選択をクリアする際は、aria-selected="false"と設定するが、属性は削除しないようにする。そうすることで依然としてSELECTABLEとなっている。開発者向け注記:スクリプトはaria-selectedの変化に留意する必要がある。なぜならば、選択は、マウスやキーボードではなく、支援技術によって発生することがあるからである。
  3. 子孫でaria-selectedに変更があった場合は、次のように、正しいイベントを駆動させる。
シナリオMSAA/IA2ATK/AT-SPI
aria-selectedがトグルカレントコンテナにEVENT_OBJECT_SELECTIONADD/EVENT_OBJECT_SELECTIONREMOVE + 項目にEVENT_OBJECT_STATECHANGE項目にobject::selection_changed + atk_object_notify_state_change()
focusに続いて選択EVENT_OBJECT_SELECTION、新たにフォーカスを取得した項目のステート(state)変更イベント、しかし、フォーカスを取得した項目にステート(state)の変更が発生しないようイベントを配置し、必要以上に選択の変更の通知を発生させないようにする。object:selection_changed + atk_object_notify_state_change()、しかし、フォーカスを取得した項目にステート(state)の変更が発生しないようイベントを配置し、必要以上に選択の変更の通知を発生させないようにする。
一度に多くのアイテムに対して選択または解除を行う。必要なもの全てに対してEVENT_OBJECT_SELECTIONWITHIN。ステート(state)の変更イベントは性能のために切り取ることができるobject:selection_changed。ステート(state)の変更イベントは性能のために切り取ることができる

4.5. MSAA/IAccessible2のメニュー

MSAA下では、メニューの開閉の度に特別なイベントが必須となる。これらのイベントは入れ子構造で対称性を持っていなければならない

メニューが開いているとき、ウィンドウズ上のスクリーンリーダーは一般にフォーカスイベントを無視するので、メニュー以外のものがフォーカスを受け取ったとき(例、メニューオプションを選択してダイアログを開く)、EVENT_SYSTEM_MENUPOPUPENDに続けて、対称のEVENT_SYSTEM_MENUPOPUPENDを駆動させることが重要である。実際、スクリーンリーダーは正しいメニュー終了イベントが駆動しないと非常に混乱する。

つまり、完璧に対称性を持ったイベントを用いることは困難である。なぜなら、メニューはさまざまなテクニックを用いて可視と非表示にすることが可能なので、実装では発生するメニューイベントの経過を追い、対称化を確保することが望ましい。

5. 特別な文書の処理手順

5.1. frameiframe要素を扱った文書

アクセシブルな外部文書に対するアクセシブルな名前を計算する。

アクセシブルな内部文書に対するアクセシブルな名前を計算する。

  1. サブ文書の場合は、<frame> または<iframe>からaria-labelledbyを使って深さ優先の名前計算をする。名前がまだ空値ならば、<frame>または<iframe>からtitle属性を使用する。
  2. 名前が未だに空値の場合は、文書のARIAのルートノードにあるaria-labelledbyから深さ優先の名前計算を使うこと。もし、まだ空値ならばARIAのルートノードのtitile属性を使用すること。
  3. 名前が未だに空値で、<title>要素またはアクセシブルな名前を得るための他の手段が存在する場合、それを使用すること。

アクセシブルな内部文書に対するアクセシブルな説明を計算する。

  1. サブ文書の場合、<frame>または<iframe>からaria-describedbyを使用して深さ優先の説明計算をすること。
  2. 説明がまた空値の場合は、文書のARIAのルートノードのaria-describedbyから深さ優先の名前計算を使用する。

サブ文書中にあるノードのcontainer-fooを計算する:container-livecontainer-atomiccontainer-relevantcontainer-channel及びcontainer-busyについては、内部ノードが同一文書内にある外部ノードをオーバーライドする。なぜなら、内部のサブツリーはより意味のある文脈だからである。しかしながら、外部文書の作者は別人で、ライブのiframeに対してその文脈を定義したいと考えるかもしれないので、外部文書が内部文書をオーバーライドする。したがって、

  1. aria-livearia-atomicaria-relevant、及びaria-busyのプロパティからcontainer-[プロパティ]のオブジェクトの属性に流し込むためのプロパティを収集しながら、外部文書からの物も含めて、親チェーン全体を巡る
  2. ノードがあるオブジェクトの属性を設定している場合は、文書の中でそのオブジェクトの属性を再度変更させない値を持つステート(state)を設定する。
  3. 親文書に入った時は、これらのオブジェクトのそれぞれのプロパティを再度オーバーライドできるようにステート(state)をリフレッシュさせる。

アクセシブルな内部文書に対するその他のプロパティの計算

  1. ユーザーが制御するプロパティ(aria-selectedaria-valuenowaria-valuetextaria-activedescendant)に対しては、ARIAのルートノード上でのみARIAのマークアップを使用する
  2. 個別のプロパティベースで、アクセシブルな外部文書のARIAのプロパティが優位となる。
  3. アクセシブルな外部文書がプロパティを設定しない場合は、内部文書のARIAのルートノードを使用する。
  4. リレーションは連鎖的ではない。アクセシブルな外部文書が関係を設定する場合、内部文書のARIAのルートノードに設定されているものではなくそれを使用する。

5.2. CSS セレクタ

属性セレクタをサポートする際はARIA属性を含めなければならない。例えば、.fooMenuItem['aria-haspop=true'] は "fooMenuItem"クラス及びtrue値を持ったARIA属性"aria-haspopup"を伴った全ての要素を選択するべきである。表現はARIA属性の動的な変更に伴って更新されなければならない。これにより開発者はスタイリングとARIAのセマンティクスをマッチさせることができる。

6. エラー処理

6.1. 定義

6.2. バリュータイプ: IDREFと IDREFS

Q:無効なIDがARIAのプロパティに対して指定されている場合どうなるか。
A:ユーザーエージェントはIDを無視する。

Q:ARIAのプロパティの中に有効なIDと無効なIDが混在しているとどうなるか。
A:ユーザーエージェントは有効なIDに対応するオブジェクトのみを返す。

Q:同じIDに複数の要素がある場合どうなるか。
A:当該IDの最初に見つかった要素が使用される。挙動はgetElementByIdの場合と同様で、IDの一意性を保障するのはweb開発者の責任である。

Q:IDREFS型の単一のARIAのリレーションにおいて、同一の要素が複数回指定されるとどうなるか。
A:[言い換える必要があるかもしれないが、アクセシブルなオブジェクトに対するポインターの配列が戻り値だと思う。]ユーザーエージェントは同一オブジェクトに対して複数のポインターを返すことになる。

Q:単一のIDREF型のプロパティに対して複数のID(スペースで区切られたリスト)が指定されているとどうなるか。
A:ユーザーエージェントは(スペースで区切らずに)文字列全体を使用し、そのIDをもつ要素を参照しようとする。例えば、aria-activedescendant="foo bar"はid="foo bar"とマッチするであろう。

[IE特有] Q:IE7と互換性があるため、開発者が“id”ではなく“name”属性を使っている場合どうなるか。
A:文書のバージョンに関係なく、IEでは“id”属性にのみマッチする。“id”属性にのみマッチングするのが正しい挙動だと思う。

6.3. バリュータイプ:decimal(10 進型)

Q:10進型に対して非数値の値が指定されているとどうなるか。
A:プロパティの文字列バージョンが求められている場合は、ユーザーエージェントは開発者によって指定された文字を単純に返す。しかしながら、明確に10進型が要求されている場合は、ユーザーエージェントは文字列を10進型に変換できず、デフォルトの値を返す。

6.4. ユーザーエージェントでの検証

一般的に、ユーザーエージェントはARIAのプロパティのバリデーションをあまり行わない。要求に応じて小さなバリデーションが起動される。たとえば、有効なIDがARIAのリレーションに対して指定されているか確かめたり、aria-posinsetを(aria-setsizeも含めて)1以内にするといったことである。ユーザーエージェント次のような論理的なバリデーションに対しては責任がない。

  1. リレーションによって生み出される循環参照。例えば、2つの要素がお互いを親子関係として指定するなど。
  2. DOMツリー構造に関する正しい使用法。例えば、リレーションを伴った要素の子孫DOMとなっているaria-activedescendant
  3. ARIAのロール(role)を伴った要素が指定されたロール(role)を正しく実装する。例えば、ユーザーエージェントはrole=”checkbox”を伴った要素が実際にチェックボックスのように挙動するかは検証しない。

6.5. ロール(Role)

Q. 抽象ロール(role)、またはプラットフォームのアクセシビリティAPIのための標準的なロール(role)にマップしないロール(role)を開発者が使用したらどうなるか。
A:これについては仕様に定義されている:

http://www.w3.org/TR/2009/WD-wai-aria-20090224/#ua_role_identifyロール(role)属性の任意のロール(role)が抽象である、またはマッピングがない場合は、そのロール(role)をスキップする。ロール属性の中に既知のロール(role)がない場合は、xml-rolesのオブジェクトの属性の中のロール(role)の属性値をエクスポーズする以外は、ユーザーエージェントは、そのロール(role)が欠落しているかのように振舞う。

Q.開発者が要素のロール(role)を動的に変更したらどうなるか。
A.これはARIAの仕様では正しくない実装方法であり、、オブジェクトによってサポートされている必要があるアクセシブルなインタフェースに変化を引き起こす。これは、支援技術にとっては予期せぬことである。したがって、動的なロール(role)に対処する最もお金のかからない方法が用いられる。ロール(role)の変更に伴い、オブジェクトに対して適切な無効化イベントを発生させ、支援技術がキャッシュあるいはバーチャルバッファーを更新できるようにする。関連する無効化イベントは次の通り。

6.6. ステート(state)とプロパティ

Q.ARIAのプロパティにはグローバルでないものがあり、特定のロール(role)でのみサポートされているものがある。サポートされていない従属的なARIAのプロパティを使った場合、何をマップすべきか。
A. ユーザーエージェントはARIAのプロパティが欠落しているかのように振舞うべきであり、プラットフォームのアクセシビリティAPIを経由してそのARIAのプロパティをマップさせるべきではない。例えば、aria-checkedは<div role="grid">ではCHECKEDとしてエクスポーズすべきでない

Q. ARIAのプロパティが未知の値、または認められていない値を持っているとき、プラットフォームのアクセシビリティAPIに何をエクスポーズすべきか。
A.1 オブジェクトの属性としてエクスポーズするとき、未知の値をエクスポーズすること。可能性のある値に照らし合わせて入念に調べないこと。
A.2 プラットフォームAPIのブーリアン・ステート(state)としてエクスポーズするとき、""、 "undefined" または値がない場合はfalseとして扱うこと。他の値はtrueとして扱うこと。
A.3 さもないときは、値を無視してプロパティは存在しないものとして扱うこと。

Q. 未知のARIAのプロパティが使われたとき、プラットフォームのアクセシビリティAPIに対して何をエクスポーズすべきか。
A. "aria-"の接頭辞を取り去った同じ名前とともにオブジェクトの属性をエクスポーズすること。オブジェクトの属性値はARIAのプロパティの値に等しくなるべきである。これは将来のバージョンの新しいARIAのプロパティとの上位互換性の助けとなる。

Q. aria-hiddenが実際のノードの表示、非表示とマッチしないときはどうするか。
A.この誤った状態は確認する必要はない。なぜなら、レイアウトAPIがより完璧な情報を提供する場合、aria-hiddenは必要ない。忠告:aria-hidden="true"を伴った要素が見えるならば、ARIAの間違った使用方法である。aria-hiddenプロパティはDOMベースの支援技術が可視状態の変化の情報を受け取ることができるようにするためのみにエクスポーズすべきである。なぜなら、実際に非表示となっているすべてのノードの最も完全なセットはレイアウトAPIが提供するからであり、aria-hidden属性ではなくそれらを使用すべきである

Q. aria-valuenowを変更するために支援技術がプラットフォームのアクセシビリティAPIセッターを使用しているならば、ユーザーエージェントはaria-valueminaria-valuemaxによって設定される制限の中に新しい値が入っていることを保障すべきか。
A. その通り。制限を越えている場合は値を設定してはならない。しかしながら、ユーザーデータの妥当性を保障するのはwebアプリケーションの最終的な責任であることに留意すること。

Q.aria-valuenowを取得するために支援技術がプラットフォームのアクセシビリティAPIゲッターを使用している場合、ユーザーエージェントはaria-valueminaria-valuemaxによって設定される制限の中に入っていることを保障すべきか。
A. いいえ。制限外か否かに関わらず、単にaria-valuenowをエクスポーズすればよい。

Q. 要素がaria-valuetextプロパティのセットは持っているが、aria-valuenowは持っていない場合どうなるか。
A. このガイドで説明されているようににvaluetextをエクスポーズする。しかし、10進型のみを返すバリューゲッターに対してはエラーを返すこと。

Q.aria-valuenowを変更するために支援技術がプラットフォームのアクセシビリティAPIセッターを使用している場合、ユーザーエージェントはカレント要素が無効または読み取り専用になっていないことを保障すべきか。
A. その通り。カレント要素が無効または読み取り専用となっている場合は値を設定しないこと。

Q. 支援技術が要素の選択状態を変更するためにアクセシビリティのプラットフォームAPIを使用する場合、ユーザーエージェントは要素が無効になっていないことを保障すべきか。
A. その通り。(読み取り専用の要素に対して選択状態を変更しても問題ないが)カレント要素が無効となっている場合は、選択状態の設定または解除をしてはならない。

Q. ユーザーエージェントはaria-activedescendantが実際に子孫を指定しているかどうかをチェックすべきか。
A. いいえ。

Q. aria-levelaria-setsizeまたはaria-posinsetが0またはマイナスの場合はどうするか。
A. 1を返す。

Q. aria-posinsetaria-setsizeより大きい場合はどうするか。
A.aria-posinsetの代わりにaria-setsizeを返す。

Q. 任意のウィジェットのために必須のariaのプロパティ(例、ロール(role)が必須としている)が欠落している場合はどうするか。
A.

6.7. 支援技術にエラーを伝達する

ARIAのために引き起こされるエラーの多くは、callerには伝達されない。例えば、IDREFSのリスト中に無効なIDを見つけても、callerに対してエラーコードを返す理由とはならない。伝達可能なエラーはARIAの特定のプロパティに限った場合である。

  1. 子ID及びaria-ownsaria-ownsは要素に子のリストを付加する。無効な子IDを特定する時、同様なことが起きるが、新しい有効な範囲の外にある子IDを指定する場合もエラーを返す。

7. 補足資料

このセクションは、参考情報である。

7.1. 参考文献

このセクションは、参考情報である。

[ARIA]
Accessible Rich Internet Applications (WAI-ARIA) Version 1.0. L. Seeman、 M. Cooper、 R. Schwerdtfeger、 L. Pappas編集、W3C ワーキングドラフト (作業進行中), 2008年2月4日。 このバージョンのWAI-ARIAはhttp://www.w3.org/TR/2008/WD-wai-aria-20080204/で入手できる。最新バージョンのWAI-ARIAはhttp://www.w3.org/TR/wai-aria/で入手できる。
[HTML5]
HTML 5、 D. Hyatt、 I. Hickson編集、W3C ワーキングドラフト(作業進行中)、2008年1月22日、http://www.w3.org/TR/2008/WD-html5-20080122/。 最新バージョンの HTML 5はhttp://www.w3.org/TR/html5/で入手できる。

7.2. 謝意

このセクションは、参考情報である。

この文書の策定にあたっては、以下の方々からの協力を仰いだ。

7.2.1. プロトコル・フォーマット・ワーキンググループの参加者(発行時点)

  • ジム・アラン(Jim Allan)(客員専門家、Texas School for the Blind)
  • クリス・ブラウチ(Chris Blouch)(AOL)
  • デイビッド・ボルター(David Bolter)(客員専門家、トロント大学Adaptive Technology Resource Centre)
  • サリー・ケーン(Sally Cain)(Royal National Institute of Blind People)
  • チャールズ・チェン(Charles Chen)(Google, Inc.)
  • マイケル・クーパー(Michael Cooper)(W3C/マサチューセッツ工科大学)
  • ジェームズ・クレイグ(James Craig)(Apple, Inc.)
  • ディミター・デネブ(Dimitar Denev) (Frauenhofer Gesellschaft)
  • ドナルド・エバンズ(Donald Evans)(AOL)
  • スティーブ・フォークナー(Steve Faulkner)(客員専門家、The Paciello Group)
  • ケンタロウ・フクダ(Kentarou Fukuda)(IBM Corporation)
  • アンドレ・ゴンザレス(Andres Gonzalez)(Adobe Systems Inc.)
  • ジョルジオ・グリゴリアディ(Georgios Grigoriadis) (SAP AG)
  • ジョン・ガンダーソン(Jon Gunderson)(客員専門家、UIUC)
  • ショーン・ヘイズ(Sean Hayes)(Microsoft Corporation)
  • ジョン・ハーバティン(John Hrvatin)(Microsoft Corporation)
  • ケニー・ジョハー(Kenny Johar)(Vision Australia)
  • マサヒコ・カネコ(Masahiko Kaneko)(Microsoft Corporation)
  • ディエゴ・ラ・モニカ(Diego La Monica)(International Webmasters Association / HTML Writers Guild (IWA-HWG))
  • アーロン・レベンサール(Aaron Leventhal)(IBM Corporation)
  • アレックス・リー(Alex Li)(SAP AG)
  • ウィリアム・ローボロ(William Loughborough)(客員専門家)
  • アンダース・マークッセン(Anders Markussen)(Opera Software)
  • マシュー・メイ(Matthew May)(Adobe Systems Inc.)
  • チャールズ・マックキャシーネビル(Charles McCathieNevile)(Opera Software)
  • ジェームズ・ナーセン(James Nurthen)(Oracle Corporation)
  • ジョシュ・オコーナー(Joshue O'Connor)(客員専門家)
  • リサ・パパス(Lisa Pappas)(Society for Technical Communication (STC))
  • サイモン・ピーターズ(Simon Pieters)(Opera Software)
  • デイビッド・ポールマン(David Poehlman)(Invited Expert)
  • T・V・ラマン(T.V. Raman)(Google, Inc.)
  • グレゴリー・ロスマイタ(Gregory Rosmaita)(客員専門家)
  • トニー・ロス(Tony Ross)(Microsoft Corporation)
  • ジャニナ・サジカ(Janina Sajka)(客員専門家、The Linux Foundation)
  • マーティン・シャウス(Martin Schaus)(SAP AG)
  • ジョセフ・シューハマー(Joseph Scheuhammer)(客員専門家、トロント大学Adaptive Technology Resource Centre)
  • ステファン・シュナベル(Stefan Schnabel)(SAP AG)
  • リチャード・シュワードフェジャー(Richard Schwerdtfeger)(IBM Corporation)
  • リサ・シーマン(Lisa Seeman)(客員専門家、Aqueous)
  • シンシア・シェリー(Cynthia Shelly)(Microsoft Corporation)
  • マーク・シルビー(Marc Silbey)(Microsoft Corporation)
  • へニー・スワン(Henny Swan)(Opera Software)
  • ゴットフリード・ジマーマン(Gottfried Zimmermann)(客員専門家、Access Technologies Group)

7.2.2. プロトコル・フォーマット・ワーキンググループの過去のアクティブな参加者およびARIA仕様への協力者

アーロン・レベンサール(Aaron Leventhal)の尽力と見識に特別な謝意を表明したい。アクセシビリティAPIバインディングの実践的なプロトタイプの実装は彼によるものである。

また、サイモン・ベイツ(Simon Bates)、ジュディ・ブリューワー(Judy Brewer)(W3C/マサチューセッツ工科大学)、クリスチャン・コース(Christian Cohrs)、ベッキー・ギブソン(Becky Gibson)(IBM)、アルフレッド・S・ギルマン(Alfred S. Gilman)、アンドレ・ゴンザレス(Andres Gonzalez)(Adobe)、ジェフ・グライムズ(Jeff Grimes)(Oracle)、バーバラ・ハーテル(Barbara Hartel)、アール・ジョンソン(Earl Johnson)(Sun)、ジャエル・クルツ(Jael Kurz)、リンダ・マオ(Linda Mao)(Microsoft)、シェーン・マッキャロン(Shane McCarron)(ApTest)、デイブ・ポーソン(Dave Pawson)(RNIB)、ヘンリー・シボネン(Henri Sivonen)(Mozilla)、ビタリー・スリコフ(Vitaly Sourikov)、マイク・スクイラス(Mike Squillace)(IBM)、ライアン・ウィリアムズ(Ryan Williams)(Oracle)、トム・ウロドコウスキ(Tom Wlodkowski)の各位にもお礼を申しあげる。

7.2.3. 資金援助

この発行物は、米国教育省、国立障がい・リハビリテーション研究所(NIDRR)が歳出した政府資金によって一部賄われている(契約番号:ED05CO0039)。この発行物の内容は、必ずしも米国教育省の見方または方針を反映したものではなく、また、商号、商用製品、組織についての言及も、必ずしも米国政府による是認を意味するものではない。