【注意】
この文書は、W3C / WAI が公開している2009年2月24日付の「WAI-ARIA 1.0 User Agent Implementation Guide」(原文は英語)を、W3Cの定めた事項に従い株式会社日立製作所がボランティアとして日本語に翻訳したものです。
正式な文書は、あくまで W3C のサイト上で公開されている英語版であり、この日本語訳文書には翻訳上の間違い、あるいは不適切な表現が含まれている可能性がありますのでご注意ください。また、リンク先が英語の場合、あるいはダミーのページである場合もあります。ご了承ください。
その他のWAI-ARIA関連文書の日本語訳をご覧になりたい場合はWAI-ARIA(日本語訳)をご覧ください。
[目次]
Copyright© 2009 すべての著作権は W3C® (MIT, ERCIM, Keio)に帰属します。 W3Cの 免責事項、商標 、 文書利用 に関する規定が適用されます。
この文書は、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に従ってその情報を開示しなければならない。
このグループの参加者に課される開示の義務は、グループの設立趣意書で説明されている。
ユーザーエージェントが、あるプラットフォーム上のアクセシビリティAPIを経由して静的なコンテンツをエクスポーズしている場合、ARIAが行う残りの作業は3つに分けられる。
一般論として、ARIAのプロパティは、コンテンツがプラットフォームのアクセシビリティAPIにどのようにマッピングされるかにのみ作用すべきである。仕様で推奨されているように、スタイルシートで意図的にARIAの属性をキーオフしてる場合を除いて、コンテンツの視覚的なレンダリングや主なデスクトップブラウザの動作に作用すべきではない。 これによって、ARIAの主要な原則の一つが維持される。つまり、コンテンツはARIAをサポートしていないレガシーブラウザのユーザーの大多数と同じようにレンダリングし、動作する。
この文書でカバーしているアクセシビリティAPIは以下の通り。
ARIAを、Mac OS X Accessibility ProtocolやUI Automation、または他のアクセシビリティAPIにエクスポーズする最良の方法に関する情報はまだない。しかし、この文書中の情報に対する何らかのフィードバックがあれば歓迎する。他のアクセシビリティAPIに対してエクスポーズさせたい場合は、支援技術の開発者と密接に連携し合うことを推奨する
アクセシブルツリーとDOMツリーは、並列構造である。おおまかに言うと、アクセシブルツリーは、DOMツリーのサブセットである。アクセシブルなオブジェクトは、アクセシブルなイベントを起動するため、または引き渡される必要のあるプロパティ、リレーションシップ、あるいは機能があるため、のいずれかの理由により、支援技術に引き渡されるべき個々のDOM要素に対して、アクセシブルなツリー内に生成される。一般的に言って、もし何か手を加えるとすればパフォーマンスの向上や簡潔さのためであろう。例えば、スタイルの変更のみでセマンティクスを含まない<span>要素では、それ自体のアクセシブルなオブジェクトではなく、スタイルの変更はAccessibleTextインタフェースの“text attribute run”を通じてエクスポーズされることになる。
通常のアクセシブルツリーに加え、要素に次のプロパティのうち一つがある場合は、ARIAではその要素も引継がれるよう求めている。
aria-activedescendant属性を伴った子孫がある。いずれかのケースでフォーカスが置かれ、フォーカスイベントが起動される必要がある。aria-hiddenは使用しない)。aria-controls、aria-describedby、aria-flowto、aria-labelledbyまたはaria-owns)を通して別の要素によって指定されたIDを持っている。アクセシブルな階層(子孫も含む)から取り除かれるべきオブジェクト
role="presentation"を伴った要素で、かつフォーカス可能ではない要素role="presentation"を伴っているテーブルセルで、かつフォーカス可能ではないテーブルセル子孫の削除が起きたとき、残っているルートオブジェクトに対してAccessible Hypertextインタフェースもエクスポーズされないようにすべきである。子孫が残っていると、これらのロール(role)に対する子孫には対応していない支援技術によっては混乱してしまうので、子孫は削除される。(例、JAWSのバーチャルバッファーはアクセス可能な名前を2度話す、あるいはスライダーのつまみをイメージとして表してしまうこともあるだろう)
注:以下のセクションでは、IAccessible2とATKのブーリアンのステート(state)は全て大文字で表示される。 例、FOCUSABLE。
ウェブアプリケーションをキーボードで操作できるようにすることが、アクセシブルなウェブアプリケーションを実現する第一歩となる。スクリプト・ウィジェットをアクセシブルにする2つのメカニズムがある。tabindexとaria-activedescendantである。ARIAウィジェット開発における他の多くの局面では、キーボードナビゲーションを適切に機能させることにかかっている。
支援技術は、しばしばフォーカスを設定する必要がある。例えば、音声入力ソフト、オンスクリーンキーボード、及びスクリーンリーダーはページ中の要素に移動するための追加的なコマンドを提供するなど、独自の構造化されたナビゲーションモードを提供している。ユーザーエージェントもウェブページも、これを巧みに処理する必要がある。スクリプトコンテナウィジェットは、キーボードまたはマウスクリックからのみフォーカスの変化が発生すると想定することはできない。フォーカスの変化があった場合には、フォーカスまたはaria-activedescendantの変化を感知し、そのステート(state)を更新する必要がある。
ARIAをサポートするユーザーエージェントは、tabindex、focus、及び blurをHTMLのすべての要素で使えるように、それらの使用法を拡張する。HTML5のワーキングドラフトでは、この手法を採用しているので、次のバージョンのHTMLにおいては仕様通りとなる見込みである。
HTML4およびそれ以前のものでは、タブ順序にはリンクとフォームのコントロールのみがあり、フォーカスを受け取ることができた。focusメソッドを用いたスクリプトを使用しても、他の要素にフォーカスを設定することは不可能であった。tabindexを用いてタブ順序に加えることが可能であっても、フォーカス可能にしてタブ順序に入れないことはできなかった。この問題を乗り越えるために、ユーザーエージェントはtabindex属性の値と適用範囲を拡張する。
基本的に、div、spanまたはimgといったどのような要素も、tabindex="0"と設定することで、デフォルトのタブ順序に加えることができる。さらに、tabindex="-1"を伴ったアイテムは、スクリプトまたはマウスクリック経由でフォーカスを置くことができる。しかし、デフォルトのタブ順序の一部にはならない。
スライダーのような単純ウィジェットから、メニューバー、ツリービュー、またはスプレッドシートといったコンテナウィジェットに至るまで、キーボードでアクセス可能なカスタムウィジェットを開発する一つの方法を、tabindexシステムは提供する。このシステムは、IE5.5までのInternet Explorerの古いバージョンでも動作する。
ユーザーエージェントにおける実装に際し、tabindexを全ての要素で可能にするために、次のことをしなければならない。
element.tabIndexプロパティをエクスポーズ しなければならない。focus及びblurメソッドが、HTML要素インタフェースに追加されるべきである(あらゆる要素のタイプに対してスクリプト可能となる)。focus及びblurイベントを起動しなければならない。:focusを持った要素であればフォーカスoutlineプロパティを受け取ることができるように、ルールを規定しなければならない。keydownイベントをキャンセルする場合は、keypress イベントもキャンセルしなければならない。これは必要なことで、なぜなら、Internet Explorerをサポートする開発者は、キーストロークの処理を行うためにkeydownイベントを使用しなければならず、非英数キーに対しては、keypressではなく、keydownイベントを起動しているためである。ウェブページの開発者が、キーボードにスクリプト制御を実装する際には、keydownイベントを使用可能にするが、矢印キーなどのキーストロークによる影響を打ち消す必要がある。FOCUSEDやFOCUSABLEのアクセシビリティAPIのステート(state)、focus のアクセシビリティAPIイベントをエクスポーズする。HTML5仕様では、tabindexの拡張された振る舞いがどうあるべきか ([HTML5]、 セクション 6.5.1)を文書化している。どのような振る舞いであるべきかに関するGeckoの文書は「キー操作可能なカスタムDHTMLウィジェット」にある。IEのtabindexの振る舞いに関する文書は、「MSDN:tabindexプロパティ」。また、Operaには、いくつかの簡単なテストケースがある。
aria-activedescendantプロパティもまた、あらゆるタイプのARIA要素において、キーボードのアクセシビリティを確保するために使われることもありうる。それは、しばしば、コンテナウイジェットキーボード・ナビゲーションを提供する、より便利な方法である(タブ順序においてはウィジェット全体で1回のみとなるが、ユーザーはキーストロークを使ってコンテナに含まれる子孫アイテムをナビゲートすることができる)。
一般的な使用方法は以下を用い、そして開発者は、コンテナの要素にtabindex="0"と、現在アクティブな子孫のIDを示すためにaria-activedescendantを用いる。現在のアクティブな子孫にキーボードフォーカスが置かれていることを示すために表示スタイルを定義するのは、ユーザーエージェントではなく、開発者の責任となる(実際のフォーカスはコンテナに置かれているので:focusメソッドによってではない)。
aria-activedescendant実装するために、ユーザーエージェントは以下のことを行わなければならない。
aria-activedescendantのシステムを用いることができるように、全ての要素においてtabindex="0"をサポートしなければならない。 aria-activedescendantを持つ要素については、アクセシビリティAPI内でフォーカスが置かれているようにマークしてはならない。(つまり、FOCUSED またはFOCUSABLEのステート(state)を使ってはならない)aria-activedescendant属性が、現在DOMフォーカスのある要素上で変化する際、新しいアクティブな子孫上でアクセシビリティAPIのFOCUSイベントを起動する。aria-activedescendantがクリアされるか、または現在の文書内の要素を指していない場合は、属性の変更が起こったコンテナオブジェクトに対してfocusイベントを起動する。aria-activedescendant属性を伴った要素の子孫で、ID属性を持った要素については、オブジェクトがアクセシブルとなるように、ターゲットに対して次のステート(state)を適用する。
FOCUSABLE。要素がARIAのロール(role)も持っている場合。なぜなら、コンテナの aria-activedescendantが潜在的にそれを示す可能性があるためである。ロール(role)がない際には、これをチェックする必要があるとはかぎらない。なぜなら、フォーカスを受け取るであろう実際のHTML要素が、既にフォーカス可能なことがあるためである。ACTIVE。コンテナ要素がaria-activedescendantを子孫のIDとマッチするよう設定する場合。FOCUSED。ACTIVEとaria-activedescendantを伴ったコンテナウィジェットが、真のDOMフォーカスを受け取っている場合。aria-activedescendantを伴ったコンテナの子孫にフォーカスを設定するときは、当該の項目を示すようにaria-activedescendantの値を変更するよう実装すべきである。開発者向け注記:次の子孫にフォーカスを移動させる際は、scrollIntoView()メソッドを用いて、フォーカスを受け取る子孫全体が画面上に表示されるようにスクロールさせること([HTML5]、 セクション 6.4)。
代替入力ソフトは、FOCUSABLEとしてエクスポーズされたアイテムにフォーカスを置くことができる必要がある。スクリーンリーダー、音声入力ソフト、及びオンスクリーンキーボードは、そのソフトウェアに実装されているユーザーコマンドに基づいてフォーカスを設定することができる。これを、MSAAベースの支援技術ではaccSelect(SELFLAG_TAKEFOCUS)メソッド経由で行い、ATKではAtkComponent::grab_focus経由で行っている。
aria-activedescendant属性を持った先祖が存在しているならば、DOMフォーカスを先祖に設定する。設定できたならば、その先祖にあるaria-activedescendant をカレント要素のIDに設定する。開発者向け注記: 代替入力を可能にするために、onfocusハンドラが必要になるかもしれない。例えば、フォーカス可能なリスト項目のあるlistbox を実装している場合、新しいリスト項目がフォーカスを受け取ることのできる手段は、マウスクリックまたはキーの押下だけであると考えないこと。したがって、フォーカスの置かれた要素に対する直接的などのようなスタイルの変更も、クリック及びkeypressハンドラではなく、onfocusハンドラによって行われるべきである。aria-activedescendantを使う場合、これらの属性の変更に対応するために、DOMAttrModifed (IEではonpropertychange)を注視すること。
可能であれば、ARIAのセマンティクスは、デスクトップアクセシビリティAPIの標準的なメカニズムを通じてエクスポーズされるべきである。例えば、ARIAウィジェットの場合、同様なデスクトップウィジェットではどのようにウィジェットがエクスポーズされるか比較してみる。一般的に、ほとんどのARIAウィジェットの機能は、ロール(role)、値、ブーリアンのステート(state)、及びアクセシビリティAPIとの関係などを通じてエクスポーズされる。
ユーザーエージェントは、支援技術にステート(state)の変更を知らせるべきである。反対に、プロパティ変更の支援技術による通知は、支援技術がユーザーエージェントと情報伝達する手法に依存する。例えば、aria-multilineプロパティはしばしば変更されるものではないが、一方で、aria-checkedのステート(state)はユーザーの入力に反応して頻繁に変更される。
ロール(role)やname、ステート(state)、値といったアクセシビリティAPIのコアなプロパティは、それぞれ唯一のものである。衝突が起こると、通常、ARIAが勝つ。なぜなら、ARIAは基本的に他を無効にするものだからである。つまり、ネイティブなマークアップがリンクがあると言っても、ARIAのマークアップでボタンであると言っていれば、ボタンとしてエクスポーズされるべきである。
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のペアであり、必要に応じて新しいセマンティクスをエクスポーズすることが可能である。新しいセマンティクスに対するサポートを得るには、支援技術の開発者との共同作業が必要になることに留意すること。
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)をエクスポーズすべきである。
動的なロール(role)の変更は、WAI-ARIAの仕様ではエラーであると考えられており、 エラーへの対処の項で説明されている。
EVENT_OBJECT_REORDERと共に、EVENT_OBJECT_HIDE 及びEVENT_OBJECT_SHOWが、そのイベントである。| 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-pressedがundefinedではない場合、IA2にIA2_ROLE_TOGGLE_BUTTONとしてエクスポーズされるべきである。 | ATK_ROLE_PUSH_BUTTON | NSAccessibilityButtonRole |
| "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_HASPOPUP。aria-expanded != "true"であれば STATE_SYSTEM_COLLAPSEDをエクスポーズする。 | ATK_ROLE_COMBO_BOX + ATK_STATE_EXPANDABLE + object attribute haspopup="true" | NSAccessibilityComboBoxRole | |
| "description" | ロール(role)のマッピングがないのでxml-rolesを使用すること | IA2_ROLE_TEXT_FRAME | ATK_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_PANEL | NSAccessibilityGroupRole | |
| "heading" | 該当無し、xml-rolesを使用すること | IA2_ROLE_HEADING | ATK_ROLE_HEADING | |
| "img" | ROLE_SYSTEM_GRAPHIC | ATK_ROLE_IMAGE | NSAccessibilityImageRole | |
| "label" | ROLE_SYSTEM_STATICTEXT | IA2_ROLE_LABEL | ATK_ROLE_LABEL | |
| "link" | ROLE_SYSTEM_LINKさらに、リンクとその全ての子孫に対してSTATE_LINKEDをエクスポーズする特別なルールを適用すること。 | ATK_ROLE_LINK | NSAccessibilityLinkRole | |
| "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_BAR | NSAccessibilityGroupRole | |
| "menuitem" | ROLE_SYSTEM_MENUITEM | ATK_ROLE_MENU_ITEM
| "option"の親が "option"の親が | |
| "menuitemcheckbox" | ROLE_SYSTEM_MENUITEM + object attribute checkable=true | IA2_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=true | IA2_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
| "option"の親が "option"の親が | |
| "presentation" | フォーカス可能な場合以外は、このオブジェクトはエクスポーズしてはならない。 | フォーカス可能な場合以外は、このオブジェクトはエクスポーズしてはならない。 | ||
| "progressbar" | ROLE_SYSTEM_PROGRESSBAR + READONLY | ATK_ROLE_PROGRESS_BAR + READONLY | NSAccessibilityProgressIndicatorRole | |
| "radio" | ROLE_SYSTEM_RADIOBUTTON | ATK_ROLE_RADIO_BUTTON | NSAccessibilityRadioButtonRole | |
| "radiogroup" | ROLE_SYSTEM_GROUPING | ATK_ROLE_PANE | NSAccessibilityRadioGroupRole | |
| "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_SECTION | ATK_ROLE_SECTION | |
| "separator" | ROLE_SYSTEM_SEPARATOR | ATK_ROLE_SEPARATOR | ||
| "slider" | ROLE_SYSTEM_SLIDER | ATK_ROLE_SLIDER | NSAccessibilitySliderRole | |
| "spinbutton" | ROLE_SYSTEM_SPINBUTTON | ATK_ROLE_SPIN_BUTTON | NSAccessibilityProgressIndicatorRole | |
| "status" | ROLE_SYSTEM_STATUSBAR | ATK_ROLE_STATUSBAR | ||
| "tab" | ROLE_SYSTEM_PAGETAB。aria-labelledbyに関連づけられたtabpanelの中にフォーカスが置かれている場合、SELECTEDのステート(state)をエクスポーズさせる。 | ATK_ROLE_PAGE_TAB。aria-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-checkedがundefinedではない場合、オブジェクトの属性"checkable"="true"をサポートする。 | ATK_ROLE_LIST_ITEM + aria-checkedがundefinedではない場合、オブジェクトの属性"checkable"="true"をサポートする。 |
このセクションでは、付加的なステート(state)及びこの文書の前のセクションでは扱わなかったオブジェクトのプロパティのエクスポーズ方法について解説する。可能であれば、APIの標準的なステート(state)を用いる。用いることができないときは、オブジェクトの属性(または同様のメカニズム)が必要となる。
VISIBLE/INVISIBLEやSHOWING/OFFSCREENなどのような管理されたステート(state)を計算する。一般的にAIRAの属性を持たない通常の要素に対して行われる場合と同様に行われる。FOCUSABLE/FOCUSEDについては、aria-activedescendantによる影響を受けることがあるので、aria-activedescendantにおけるルールを参照のこと。aria-requiredをサポートしているが、role="checkbox"のように、aria-checkedプロパティをサポートしているロール(role)は限られている。プロパティの計算については、以下の一覧表を参照のこと。ARIAのプロパティのマッピングルールに関する一覧表
重要な注記:ARIAの属性が、提示されていない、長さがゼロの文字列に設定されている、又はundefinedである場合、BooleanまたはNMTOKENの型のAIRAプロパティはどれも"undefined"である。これは、文字列、10進型、IDREF、またはIDREFSの型であるプロパティには影響を及ぼさない。
また、グローバルでないステート(state)及びプロパティは、それらをサポートするロール(role)を伴った要素上でのみ計算されるようにする。
| ARIAのステート(state) | エクスポーズすべきもの |
|---|---|
aria-activedescendant | aria-activedescendantで説明されているようにエクスポーズする。そして、支援技術がこの属性のあるコンテナ内でフォーカス変更を行うときに適切に設定する。undefinedではない場合は、支援技術からのフォーカス変更への対処で説明されているようにエクスポーズする。 ユニバーサルアクセス: |
aria-atomic | undefinedでもfalseでもない場合、atomic="true"をエクスポーズする。さらに、全ての子孫のcontainer-atomic="true"をエクスポーズする。文書のコンテンツまたはノードの可視性に対する変更で説明されているように、 |
aria-autocomplete |
|
aria-busy |
|
aria-checked |
|
aria-controls | リレーションで説明されているようにリレーションをエクスポーズする。 |
aria-describedby | リレーションで説明されているようにリレーションをエクスポーズする。
|
aria-disabled |
|
aria-dropeffect | オブジェクトの属性"dropeffect"としてエクスポーズする。 |
aria-expanded |
|
aria-flowto | リレーションで説明されているように、リレーションをエクスポーズする。 |
aria-hidden | プラットフォームのアクセシビリティAPIへのマッピングでは使用されていない。しかし、レイアウトシステムからの情報を用いて、要素がhiddenかどうかを判断している。助言:aria-hidden="true"のある要素が視覚的に認識できる場合、それはARIAにおいての正しい用法ではない。aria-hiddenプロパティは、可視、不可視の状態の変更をDOMベースの支援機器に伝達する場合にのみエクスポーズされる。しかし、レイアウトは真にhiddenとなっているすべてのノードの最も完全なセットを提供することができる。 |
aria-invalid | falseの場合、INVALID_ENTRY または同等のステート(state)をクリアし、falseでもundefinedでもない場合は、INVALID_ENTRYを設定する。さらに、falseではない、または undefined の場合、text属性(オブジェクトの属性ではなく)として値をエクスポーズする。現在の取り得る値はtrue、spellingまたはgrammarである。 |
aria-haspopup | falseの場合、
ROLE_SYSTEM_BUTTONMENUに変更する) |
aria-label | アクセシブルな名前でエクスポーズする。 |
aria-labelledby | アクセシブルな名前及びリレーションで説明されているとおり、リレーションをエクスポーズする。 |
aria-level | levelオブジェクトの属性、及びIAccessible2のgroupPositionにある値をエクスポーズする。treeアイテムで使用した場合は、RELATION_NODE_CHILD_OFに影響を与えることがある。“Group Position”の項参照。 |
aria-live | undefinedでない場合、“live”という名前のついたobjectの属性の値をエクスポーズする。文書コンテンツあるいはノードの可視状態の変更で説明されているように、"container-live" オブジェクトの属性を、全ての子孫の値とともにエクスポーズする。 |
aria-multiline | falseの場合、 ユニバーサルアクセス: "textbox" ロール(role)をAXTextAreaとして伝える。 |
aria-multiselectable | falseの場合、 |
aria-owns | リレーションで説明されているように、リレーションをエクスポーズする。 |
aria-pressed |
|
aria-posinset | "posinset"オブジェクトの属性、 及びIAccessible2のgroupPositionにある値をエクスポーズする。 |
aria-readonly | MSAAでは、 編集可能な要素上、例えば |
aria-relevant | undefinedでない場合、“relevant”と名の付くオブジェクトの属性の値をエクスポーズする。文書コンテンツあるいはノードの可視状態の変更で説明されているように、全ての子孫の値とともに"container-relevant" オブジェクトの属性をエクスポーズする。 |
aria-required | REQUIREDステート(state)としてエクスポーズする。 |
aria-selected |
|
aria-setsize | "setsize"オブジェクトの属性及び IAccessible2のgroupPositionの値をエクスポーズする。 |
aria-sort | ”sort”オブジェクトの属性の値をエクスポーズする。 |
aria-valuemax | 値 で説明されているように、AccessibleValueインタフェース経由でエクスポーズする。 ユニバーサルアクセス:AXMaxValue 属性を設定する。 |
aria-valuemin | 値で説明されているように、AccessibleValueインタフェース経由でエクスポーズする。 ユニバーサルアクセス:AXMinValue属性を設定する。 |
aria-valuenow | 値で説明されているように、AccessibleValueインタフェース経由でエクスポーズする。そして、 ユニバーサルアクセス:AXValueを設定し、必要に応じてNSAccessibilityValueChangedNotificationをポストする。 |
aria-valuetext | 値で説明されているように、"valuetext"オブジェクトの属性にエクスポーズする。 [アーロン:これで合っていると思うが?... ユニバーサルアクセス:NSAccessibilityValueDescription属性をvaluetext変数に設定する。] |
動的なARIAのプロパティの変更には、例えばstate changeイベントのようなイベントをエクスポーズして変化が起こったことを示す。簡潔さと性能のために、ユーザーエージェントは、支援技術が通常は無視するプロパティに対する変更イベントを取り除いても よい。 しかし、少なくとも、state changeイベントは、次の変更に対して実行されるべきである。
aria-disabled:ENABLED及びSENSITIVEのステート(state)に影響を及ぼす。aria-checkedまたはaria-pressed:CHECKEDステート(state)に影響を及ぼす。値が"mixed"に変更、または"mixed"から変更になる場合も、MIXED/INDETERMINATEに対するステート(state)の変更が実行される べきである。aria-invalid:INVALID_ENTRYステート(state)に影響を及ぼす。(APIにおけるNVALIDステート(state)は正当なステート(stete)が存在しないという意味であり、異なっているため注意すること)aria-expanded、aria-readonly、aria-required:アクセシビリティAPIの同じような名称のステート(state)に影響を及ぼす。他の変更のタイプ
aria-activedescendantにおける変更は、aria-activedescendantで説明されているように、focusイベントに影響を及ぼす。aria-valuenowにおける変更は、値で説明されているように、値変更のイベントに影響を及ぼす。aria-multiselectableの変更は、要素に対するアクセシブルなオブジェクトを破壊し新しく再生すべきである。なぜなら、アクセシビリティAPIを経由してエクスポーズされたインタフェースも同様に変更する大きな変更となるからである。aria-selectedにおける変更は、選択で説明されているように、selectionイベントに影響を及ぼすべきである。この計算は、後に説明する「名前」と「記述」の両方の計算で言及されている。
要素のテキスト等価物を計算するには、
カレントノードが非表示で、テキスト等価物の走査で使用されているaria-labelledbyまたはaria-describedbyによって現在直接指定されていない場合は、ノードをスキップする。
それ以外で、カレントノードがテキストノードの場合は、テキストコンテンツを末尾に追加する。空白が正規化されていれば、一般的にレンダリングされたテキストコンテンツを末尾に追加するのが好ましい。
それ以外で、aria-labelがある場合は、aria-labelのプロパティの値をこのノードのテキスト等価物に使用する。
それ以外で、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>
それ以外で、ネイティブのマークアップでテキスト等価物が提供されている場合は、テキスト等価物に追加する。ネイティブのマークアップにおけるテキスト等価物の例は、HTMLの<img>要素のalt属性値またはfor属性のある<label for>要素で示されるラベルである。しかしながら、ここではツールチップのマークアップは使わないこと。hの項にあるように基本的には最後の手段として使用するからだ。
このノードのユーザーが入力したカレントな値をテキスト等価物の末尾に追加する。しかしながら、同じテキストが繰り返して提示されることを避けるために、このテキストが同じノードに対するテキスト等価物の計算の最初か最後になる場合は付け加えないこと。例として、
<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に対して値に使用している。これはテキスト等価物の計算の途中にある。値はテキスト等価物の途中で発生するので、より大きなテキスト等価物の文脈の中に提示する必要がある。
このノードに対するテキスト等価物が空値で、カレントノードのロール(role)が"Name From: subtree"を許可する場合またはカレントノードがコントロールではないがラベルあるいは記述の一部である場合は、個々の子にこの名前の計算を再帰的に実装すること。ステップ1から開始して、名前文字列の結果の合計に集められて行くに従って結果を末尾に追加していく。この再帰法の結果がホワイトスペースのみとなった場合は、empty文字列になるまで削減してゆき、代わりに以下のルールを適用する。
それ以外で、このノードに対するテキストによる記述がまだemptyである場合合、カレントノードにいずれか(例、HTMLのtitle属性、XULのtooltiptext属性またはtooltip属性)がもしあれば、カレントノードに対する名前をツールチップから取得する
要素に対してアクセシブルな名前を計算するには、まず空文字列から始める。
aria-labelが存在せず、aria-labelledbyが存在する場合、aria-labelledbyが示している要素に対するテキスト等価物の計算を使って名前を収集する。aria-labelledbyにあるIDを登場順に処理する。文書中の要素上で特定されていないIDは無視する。
これ以外では、aria-labelledbyが使われていないことを意味するので、カレントの要素上でテキスト等価物の計算を使ってアクセス可能な名前を計算すべきである。
要素が <img> で、テキスト等価物が空値の場合、なんらかのラベル付けのための属性の存在を調べる。特にaria-labelやaria-labelledby、altまたはtitleなどである。これらのいずれかが存在していたとすれば、装飾目的であったり、冗長なイメージのコンテンツに対して、空値のテキスト等価物を設定した開発者の意図をうかがわせる。いずれの属性も存在しない場合は、イメージに対して開発者が単にアクセシブルなラベルをつけなかったことを示唆しており、実装では""ではなくNULL値をアクセシブルな名前として返すべきである。これによって、提供されていないアクセシブルな名前を補うために、支援技術が独自の経験則に基づいた処理を行う必要があることを支援技術に対してほのめかすことになる。
要素に対するアクセシブルな記述を計算するには、まず空文字列から始める。
aria-describedbyが存在していれば、aria-describedbyが示している要素から記述を収集する。aria-describedbyにあるIDを登場順に処理する。文書中の要素上で特定されていないIDは無視する。個々のIDに対してテキスト等価物の計算を用いる。
要素上で使用されているロール(role)のためにaria-valuenow属性がサポートされているときは、エクスポーズするアクセシブルなオブジェクト上でAccessibleValueインタフェースがサポートされていなければならない。 aria-valueminとaria-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をサポートし、readonly、disabledのいずれでもないスクリプトウィジェットは、aria-valuenowの変化に注視すべきであり、変化があった場合は内部のステート(state)、(使用している場合)aria-valuetext、及びウィジェットの視覚に関するステート(state)をリセットする。
全ての関係属性はどのエレメントに対してもグローバルに適用することができる。そのため、計算する前にロール(role)をチェックすることは重要ではない。関係属性はIDリスト(スペース区切りされたIDのリスト)を使用する。関係属性のIDは、getElementByIdが引数として返したIDを持っている要素とマッチする。
関係属性をエクスポーズする
aria-controlsはRELATION_CONTROLLER_FORとマッピングするaria-describedbyはRELATION_DESCRIBED_BYとマッピングするaria-flowtoはRELATION_FLOW_TOとマッピングするaria-labelledbyはRELATION_LABELLED_BYとマッピングするaria-ownsはATK/AT-SPI、 IAccessible2とは標準APIで関係のマッピングを持たない。関係属性を逆算する
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を計算する。
aria-levelを使用している場合は、 より低いaria-levelを伴ったtreeitemが見つかるまでtreeを遡り、それを指定する。treeの一番上まで達した場合はtree自体を示す。aria-atomic属性からRELATION_MEMBER_OF を計算する
RELATION_MEMBER_OFの関係を使用し、aria-atomic="true"を設定している先祖を指定すべきである。要素上で使用されているロール(role)によって等価なARIAプロパティがサポートされているときは、"posinset"や"setsize"、"level" といったオブジェクトの属性はエクスポーズされるべきである。さらに、 IAccessible2では、同じ情報がIAccessible2::groupPositionを経由してエクスポーズされなければならない。
階層が提供されていない場合は計算する。
aria-levelが提供されていない場合は、リレーションで説明しているように、明示的、あるいは計算して得られたRELATION_NODE_CHILD_OFに従って計算しなければならない。posinsetとsetsizeが提供されていない場合に計算を行う際
これらのプロパティはすべて、1ベースである。オブジェクトのプロパティが存在しない際または値が“0”の際は、プロパティが計算されていないか、サポートされていないことを表している。
これらの値が1ベースであるので、カレントアイテムは計算に含まれなければならない。posinsetについては、DOMの中でカレントアイテムの前にある場合のみアイテムを追加する。setsizeについては、DOMのカレントアイテムの後のアイテムを追加する。
一般的に、アクセシブルなオブジェクトのためにどのインタフェースがエクスポーズされるかをベースマークアップで決定すべきである。しかしながら、次のような場合は、どちらのインタフェースがエクスポーズされるべきかをARIAのマークアップが変更している。
AccessibleValue:値の項で述べたように、要素のいずれかのロール(role)がaria-valuenowをサポートしている場合、aria-valuenowを持ったオブジェクトに対してvalueインタフェースをエクスポーズするべきである。なぜなら、valueインタフェースによって値が設定され、aria-valuenowが実際に読み/書きとなるからである。値が妥当な値に変更され、カレント要素がreadonly、disabledのいずれでもない場合、ブラウザはaria-valuenowを設定する必要がある。開発者向け注記:valuenowを実装するあらゆるものはon DOMAttrChanged (IEではonpropertychange)を監視し、それに反応する必要がある。AccessibleTable:role="grid"及びrole="treegrid"に対してエクスポーズされるべきである。(注記:Mozillaは未対応 - 既知のバグ)AccessibleSelection:ロール(role)がaria-multiselectableをサポートしていて、aria-multiselectable="true"のとき、エクスポーズされるべきである。AccessibleHypertext:要素の子孫がロール(role)に基づいて切り取られてしまっている場合はエクスポーズされるべきではない。どのロール(role)がサブツリーを切り取るのかについては11.3.2.1参照のこと。ARIA特有の事項ではないが、アクセシブルなウェブアプリケーションという目的のために、インタフェースをエクスポーズするための、いくつかの役に立つ追加的な規則について言及する価値がある。
AccessibleAction: 将来のバージョンのARIAがアクションの取り扱いに対する正確性が向上するとしても、少なくとも"クリック"ハンドラを伴うものに対してエクスポーズされるべきである。また、MSAAにおいてはdoDefaultAction(#0アクションと同様)をサポートする必要がある。これはクリックにマッピングされる。AccessibleEditabletext:contenteditableまたはdesignModeを経由して編集可能になったリージョンに対してエクスポーズされるべきである。アクションは以下の規則によってエクスポーズされる。
ARIAのロール(role) | アクション |
| alert | no |
| alertdialog | no |
| application | no |
| article | no |
| button | click |
| checkbox | check/uncheck |
| columnheader | no |
| combobox | open/close |
| description | no |
| dialog | no |
| document | no |
| grid | no |
| gridcell | no |
| group | no |
| heading | no |
| img | no |
| label | no |
| link | jump |
| list | no |
| listbox | no |
| listitem | select/unselect if parent role is listbox |
| math | no |
| menu | no |
| menubar | no |
| menuitem | click |
| menuitemcheckbox | click |
| menuitemradio | click |
| option | select/unselect |
| presentation | no |
| progressbar | no |
| radio | select |
| region | no |
| row | no |
| rowheader | no |
| section | no |
| separator | no |
| slider | no |
| spinbutton | no |
| status | no |
| tab | switch |
| tablist | no |
| tabpanel | no |
| textbox | activate |
| toolbar | no |
| tooltip | no |
| tree | no |
| treegrid | no |
| treeitem | activate + expand/collapse |
文書の変更を処理することはARIAに限らず重要である。しかしながら、多くの場合AIRAのマークアップを伴うAJAX及びその他のユースケースを有効にすることは極めて重大なので、本項でそれをどのように行うか文書化ている。
テキストの変更に対してこれらのイベントを駆動させる。
IA2_EVENT_TEXT_REMOVED(IA2) 及びtext_changed:delete (ATK)を駆動。IA2_EVENT_TEXT_INSERTED(IA2) と text_changed:insert (ATK)問題のノードが要素であり、アクセシブルなオブジェクトを有しているノードの変化に対してこれらのイベントを駆動させる。
EVENT_OBJECT_HIDE(MSAA) 及び children_changed:remove (ATK)を駆動させる。MSAAのEVENT_OBJECT_DESTROYイベントは動作の安定性の問題が過去にあり、支援技術が避けているため使用しない。いずれの場合でも、ユーザーの視点では、非表示のものと無効化されたものとの間には違いはない。EVENT_OBJECT_SHOW(MSAA) 及び children_changed:add (ATK)とを駆動させる。ノードが要素ではない、またはアクセシブルなオブジェクトを持たない場合:
上で述べた変更イベントのいずれかを駆動するときは、(ページの読み込みなどによって引き起こされたタイムアウトとは反対に)ユーザーの入力によって変更が引き起こされたかどうかについての情報を提供するととても有用である。これによって支援技術はユーザーのアクションからの変更とは反対の実世界からの変更を提示するための別の規則を持つことができる。 マウスホバーは明確なユーザーの入力とはみなされない。なぜなら、マウスの偶発的な衝突で起こりうるからである。
変更がユーザーの入力によって起きたかどうかをエクスポーズするためには:
変更の状況についてのさらなる有益な情報をエクスポーズする:
aria-atomic="true"を伴った先祖を示すべきである。container-live、container-channel、container-relevant、container-busy、container-atomicといったオブジェクトの属性は、関連するARIAのプロパティに対する計算値を提供してアクセシブルなイベントのオブジェクトにエクスポーズされるべきである。計算値は直近の先祖の値である。デフォルトの値が使用されている場合はオブジェクトの属性はエクスポーズしないことを推奨する。 追加的なMSAAイベントが必要になることがある:
ROLE_SYSTEM_ALERTを伴った先祖に何かしら変更があった場合、警告のためにEVENT_SYSTEM_ALERTイベントを駆動すべきである。この警告のロール(role)はaria-liveプロパティに対して"assertive"という暗示された値を持つ。選択には二つの場合がある。
単一選択の場合では、選択のイベントとステート(state)をフォーカスから切り離して管理することが常に必要というわけではない。なぜなら、選択 はfocusを反映するからである。一つの例外はタブリストに対してである。タブの場合、タブまたは関連付けられたタブパネルにフォーカスがある場合、タブはSELECTEDとみなされる。これを実装するには、フォーカスの当たっている箇所からタブパネルを見つけるまで親鎖を上がって行き、aria-labelledbyの関係をタブパネルから関連するタブまで全探索し、見つかったタブをフォーカスが当たっているとマークする。
aria-multiselectableプロパティをサポートするロールを持った要素でaria-multiselectable="true"のとき、複数選択の場合が発生する。これにはいくつかの重要な側面がある。
MULTISELECTABLE及びMSAAではさらに EXTSELECTABLE。aria-multiselectableを伴ったコンテナのAccessibleSelectionインタフェースをサポートすること。選択インタフェースは、支援技術が実際に子孫に選択を設定するのに使用することができる。
aria-selectedが定義されていない場合、すなわち、要素がSELECTABLEでない場合は、特定の子孫に対しては機能させないようにすべきである。特定の子孫が何らかの理由によりDISABLEDまたはREADONLYとなっている場合も機能させないようにすべきである。ある項目から選択をクリアする際は、aria-selected="false"と設定するが、属性は削除しないようにする。そうすることで依然としてSELECTABLEとなっている。開発者向け注記:スクリプトはaria-selectedの変化に留意する必要がある。なぜならば、選択は、マウスやキーボードではなく、支援技術によって発生することがあるからである。aria-selectedに変更があった場合は、次のように、正しいイベントを駆動させる。| シナリオ | MSAA/IA2 | ATK/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)の変更イベントは性能のために切り取ることができる。 |
frameとiframe要素を扱った文書アクセシブルな外部文書に対するアクセシブルな名前を計算する。
アクセシブルな内部文書に対するアクセシブルな名前を計算する。
aria-labelledbyを使って深さ優先の名前計算をする。名前がまだ空値ならば、<frame>または<iframe>からtitle属性を使用する。aria-labelledbyから深さ優先の名前計算を使うこと。もし、まだ空値ならばARIAのルートノードのtitile属性を使用すること。アクセシブルな内部文書に対するアクセシブルな説明を計算する。
aria-describedbyを使用して深さ優先の説明計算をすること。aria-describedbyから深さ優先の名前計算を使用する。サブ文書中にあるノードのcontainer-fooを計算する:container-live、container-atomic、container-relevant、container-channel及びcontainer-busyについては、内部ノードが同一文書内にある外部ノードをオーバーライドする。なぜなら、内部のサブツリーはより意味のある文脈だからである。しかしながら、外部文書の作者は別人で、ライブのiframeに対してその文脈を定義したいと考えるかもしれないので、外部文書が内部文書をオーバーライドする。したがって、
aria-live、aria-atomic、aria-relevant、及びaria-busyのプロパティからcontainer-[プロパティ]のオブジェクトの属性に流し込むためのプロパティを収集しながら、外部文書からの物も含めて、親チェーン全体を巡るアクセシブルな内部文書に対するその他のプロパティの計算
aria-selected、aria-valuenow、aria-valuetext、aria-activedescendant)に対しては、ARIAのルートノード上でのみARIAのマークアップを使用する属性セレクタをサポートする際はARIA属性を含めなければならない。例えば、.fooMenuItem['aria-haspop=true'] は "fooMenuItem"クラス及びtrue値を持ったARIA属性"aria-haspopup"を伴った全ての要素を選択するべきである。表現はARIA属性の動的な変更に伴って更新されなければならない。これにより開発者はスタイリングとARIAのセマンティクスをマッチさせることができる。
aria-controls="elem1"においては、、"elem1"がターゲット要素。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”属性にのみマッチングするのが正しい挙動だと思う。
Q:10進型に対して非数値の値が指定されているとどうなるか。
A:プロパティの文字列バージョンが求められている場合は、ユーザーエージェントは開発者によって指定された文字を単純に返す。しかしながら、明確に10進型が要求されている場合は、ユーザーエージェントは文字列を10進型に変換できず、デフォルトの値を返す。
一般的に、ユーザーエージェントはARIAのプロパティのバリデーションをあまり行わない。要求に応じて小さなバリデーションが起動される。たとえば、有効なIDがARIAのリレーションに対して指定されているか確かめたり、aria-posinsetを(aria-setsizeも含めて)1以内にするといったことである。ユーザーエージェント次のような論理的なバリデーションに対しては責任がない。
aria-activedescendant。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)の変更に伴い、オブジェクトに対して適切な無効化イベントを発生させ、支援技術がキャッシュあるいはバーチャルバッファーを更新できるようにする。関連する無効化イベントは次の通り。
EVENT_OBJECT_REORDERを伴ったEVENT_OBJECT_HIDEとEVENT_OBJECT_SHOW。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-valueminとaria-valuemaxによって設定される制限の中に新しい値が入っていることを保障すべきか。
A. その通り。制限を越えている場合は値を設定してはならない。しかしながら、ユーザーデータの妥当性を保障するのはwebアプリケーションの最終的な責任であることに留意すること。
Q.aria-valuenowを取得するために支援技術がプラットフォームのアクセシビリティAPIゲッターを使用している場合、ユーザーエージェントはaria-valueminとaria-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-level、aria-setsizeまたはaria-posinsetが0またはマイナスの場合はどうするか。
A. 1を返す。
Q. aria-posinsetがaria-setsizeより大きい場合はどうするか。
A.aria-posinsetの代わりにaria-setsizeを返す。
Q. 任意のウィジェットのために必須のariaのプロパティ(例、ロール(role)が必須としている)が欠落している場合はどうするか。
A.
このセクションは、参考情報である。
このセクションは、参考情報である。
このセクションは、参考情報である。
この文書の策定にあたっては、以下の方々からの協力を仰いだ。
アーロン・レベンサール(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)の各位にもお礼を申しあげる。
この発行物は、米国教育省、国立障がい・リハビリテーション研究所(NIDRR)が歳出した政府資金によって一部賄われている(契約番号:ED05CO0039)。この発行物の内容は、必ずしも米国教育省の見方または方針を反映したものではなく、また、商号、商用製品、組織についての言及も、必ずしも米国政府による是認を意味するものではない。