アクセシビリティのツールキット チェックリスト
新ツールキット実装時の必要事項
原著者:Aaron Leventhal - aaronleventhal@moonset.net
作業
新ツールキット実装時に重要なことは:
- 異なるプラットフォーム間に対応する標準キーボードの機能を実装する。
- UI(ユーザインターフェース)の公開: 画面読み上げ機能、画面拡大鏡、音声検知ソフトウェアといった補助テクノロジーがソフトウェアを理解するための方法として。
- オペレーテイングシステムとのテーマ互換性 を、すくなくともオプションとして供給する。あなたのソフトウエアーをハイコントラストや大フォントテーマで動作させている低視力のユーザーがいるでしょうから。
- 508項 よりさらに先を行く。万人に対して本当のユーザビリティーを実装し、あなたのツールキットが各プラットフォームのガイドラインにそったものとする。
手段
2 種類の基本的なツールキットがあり、アクセシビリティを実装する際にはそれぞれが異なる問題を引き起こします。
- Eclipse と wxWidgets のようなネイティブなウィジェットツールキットは、すでになにかのアクセシビリティが内蔵されています。これらのツールキットは、各プラットフォーム用の一貫した API によって OS が実装するウィジェットを包み込みます。個々のウィジェットは主にオペレーテイングシステムから発生するので、すでにキーボードコマンドを実装しておりオペレーテイングシステムの視覚的テーマに準拠します。同様に、補助テクノロジーは、すでにネイティブなウィジェットを理解しているので、カスタムの制御用に MSAA のサポートを実装することだけが必要になります。ただし、ラッピング層がアクセシビリティバグを引き起こす可能性もありますので、広範囲にわたってテストをおこなって穴をふさぐ必要があります。また wxWidgets のように、独自の描画コントロールおよびオーナー描画コントロールが簡単にアクセシビリティ API をサポートできるような方法を提供する必要もあります。カスタム化とオーナー描画コントロールは将来にわたり存在するでしょうし、現在も当然あります。例えば、Windows ではチェックボックスのリストが、チェック済 / 未チェックという複数の画像を使って実装されています。
- オーナー描画ツールキット は、XUL および Flash の Flex UI フレームワーク のように、ネイティブなウィジェットをほとんどまたは全く使用しません。これらのツールキットは最初からアクセシビリティを実装してもらい、キーボードや API あるいは OS のテーマサポートに限っては、有償で入手する必要があります。この場合、完全もしくは部分的なアクセシビリティソリューションを追加するだけでも大仕事となり、MSAA ソリューションが動作しない部分では Windows の補助テクノロジーベンダーとの共同作業だけでなく、複数人のフルタイムの従業員が必要になるでしょう。多くの場合、こうしたツールキットは各制御用に別ウィンドウを使用しません。このような場合は、MSAA イベントシステムが各イベントに対して正しい IAccessible を呼び出せるように、一意の 32 ビットの子 ID を生成するようにしてください。
チェックリスト
このチェックリストは現時点では Microsoft Windows のみに対応しています。欠けている部分もすべて埋めるとともに、Linux や OS X に対応した情報も加えたいと考えています。質問がある場合、またご支援をいただける場合は、Eメールを送ってください。aaronleventhal@moonset.net
概要
- ダイアログ ボックス/ウインドウズ/一般
- Esc キーはダイアログ ボックスを取り消し、親ウインドウ上で前に表示していたものを再表示する。
- Alt+F4 はウィンドウを閉じる。Esc キーに近いが、キャンセルボタンのないダイアログボックスでも動作する。
- Alt+space は、Restore(復元), Move(移動), Size(サイズ変更), Minimize(最小化),Maximize(最大化), Close(閉じる)によってウインドウのメニューを開く。
- Move(移動)と Size(サイズ変更)オプションは、キーボード上の矢印キーによって使用可能になるようにする。
- ウインドウズでは最初のフォーカスは、クリック可能なタブ付きプロパティシートラベル以外の、最初のフォーカス可能なウィジェットに行く。
- タブオーダーを定義可能にする。デフォルトのタブオーダーはドキュメントウィンドウのオーダーにあるべき。
- Tab キーでの移動は、表示されない項目を含まずに、最初に戻らなければならない。
- 動的に追加された項目によって、タブサイクルが乱されたり、無秩序になったりしてはならない。
- タブサイクルは前進しても後退しても同じであること。
- F6 と Shift+F6 キーの組合せによってウインドウ内のペイン間を順番に回るべき。
- あらゆるウィジェット上でフォーカスが見える状態であること。フォーカスは必ず見えること。
- Shift+F10 かコンテキストメニューキーボードはフォーカスされた項目を右クリックされたのと同じように動作するべき。そしてコンテキストメニューは現在フォーカスされている対象の直下かすぐ右側に示すべきである。
- チェックボックスと言ったほとんどのウィジェットは、それ自体の外側にラベルを持つことができる。こうすることで、ウィジェットがクリックされたり、ニーモニックが押された時に、そのウィジェットにフォーカスすることができる。システムは、ウィジェットに関連のない静的な独立したテキストとしてではなく、各ウィジェットに対してこうしたラベルを作成・関連付ける必要がある。MSAA をサポートするにあたっては、どのラベルがどのウィジェットに対応しているかを知っておく必要がある。
- MSAAのサポート:クラス#32770 の標準ダイアログウインドウでなければ、ROLE_DIALOG を使用してウインドウを出現させる。そうしないと、フォーカスを受け取っても自動的にダイアログを読まないスクリーンリーダーがある。すでに標準ウインドウクラスの msctls_statusbar32 を使用しているステータスバーでなければ、ROLE_STATUSBAR を使用して、ステータスバーを出現させる。各ウインドウの MSAA ツリーで親子関係が正しく明示されるようにする。
- MSAA サポート全般
- フォーカスイベント
- イベントの呼び戻しを操作。これはフォーカスされたり、連携する他のイベントが存在する可能性のあるすべてのウィジェットの、ウインドウ化されない子用の一意の ID を必要とする。つまり、一意の子 ID が各ツリーアイテム用に必要になる
- 最も重要な基本的 IAccessible イベントをサポートする
- get_accParent: IAccessible の親を取得
- get_accChildCount: IAccessible の子の数を取得
- get_accChild: IAccessible の子を取得
- get_accName: IAccessible の「名前」を取得。例として、ボタン、チェックボックス、メニューアイテムの名前。ラベルが、各ウィジェットと別々ではなく、一緒に作成されるべき理由のひとつがこれ
- get_accValue: IAccessible の「値」を取得。例としてスライダーの番号、リンク用の URL、ユーザーがテキスト領域に入力するテキストなど
- get_accRole: この IAccessible が使用されている理由を表す列挙値を取得。 例としてリンク、スタティックなテキスト、編集可能テキスト、チェックボックス、テーブルセルなど
- get_accState: on/off のあり得る状態を示す 32 ビットのフィールド。例として、フォーカスされた、フォーカス可能な、選択された、選択可能な、表示できる、(パスワードで)保護された、チェックされたなど
- get_accKeyboardShortcut: この IAccessible (アンダーライン付きの alt キーとの組合せニーモニック)用のキーボードショートカットを取得
- get_accFocus: フォーカスされた子がどれか分かる
- get_accSelection: この項目のどの子が選択されたか分かる
- accLocation: この IAccessible ノードの x,y 座標と高さと幅を取得する
- accNavigate: この IAccessible から最初また最後の子へ、前後の兄弟へ、上、下、左、右へと移動[重要だが、up/down/left/right キーは実装不要]
- accDoDefaultAction: get_accDefaultAction によって記述されたアクションを実行
- unavailable、focused、readonly、offscreen、focusable など最も重要な基本的 MSAA の状態を全ての項目でサポートする
- 余分な手間を省くために、MSAA Server を実装するをご利用下さい。
- ニーモニック
- XML においてウィジェットをテキストラベルによって定義する機能。 (ラベルの属性や先頭の char を使用)
- 全て標準の共通ダイアログボックス用に自動的にニーモニックを定義。(Yes/No の確認ダイアログボックス、および Retry/Exit のエラーダイアログボックスのように)
- メソッドの呼び出しによって作成されたダイアログボックス内のニーモニックをサポート
- レイアウトエンジン - 正しい文字下にアンダーラインを引く。
- イベント - キーストロークに正しい動作をさせる。
- MSAA サポートは、IAccessible の get_accKeyboardShortcut を使用する
- MS Windows 設定のためのサポート
- ハイコントラストチェックボックスが設定 (アクセシビリティコントロールパネルで SPI_GETHIGHCONTRAST) される時や、ユーザーがあなたのソフトウエアーで「ネイティブ」なスキンを選択するときは、現在の OS のスキンからすべての look and feel を取得する
- LeftAlt+LeftShift+printscreen キー を使用してハイコントラストテーマが動的に切り替え可能
- アプリケーションがふるまいを変更できるように XML/scripts へ SPI_GETSCREENREADER フラッグを公開する
- 項目選択用に可能な箇所はどこでもシステムのハイライト色を使用する。ただしこの時、一度に2箇所以上同じ色を使用しない。そうしないと、ハイライトが変更されるたびに、スクリーンリーダーがその色のついたものを読み上げてしまう。
- キャレットの正確な幅の調整には SPI_GETCARETWIDTH に留意する。
- 「マウスポインターのデフォルトボタンへのルート」設定に留意する
- ユーザーが、alt キーが押されている時以外に、ニーモニックの隠蔽を希望することは可能。これは、SPI_GETKEYBOARDCUES と SPI_GETMENUUNDERLINES によってサポートされる
簡単なウィジェット
- ボタン
- タブ、矢印、変更されていない文字ニーモニック
- 画像付きボタン用テキストラベルを要求かつサポートする、これはツールチップと同でありうる。
- スペースキーがボタンを作動する。
- エンターキーがフォーカスされたボタンを作動する。(つまりその時点でフォーカスされているボタン。他のボタンがフォーカスされているときには、デフォルトボタンは濃い枠で表示されない)
- ボタンをクリックすることで作動するポップアップを備える時、エンターキーやスペースバーもまたポップアップを作動するべき。
- ツールバーやツールバーのボタンはフォーカス可能ではないが、ツールチップは可能にすべき。できれば、ツールチップがキーボードショートカットと連携してキーボードショートカットに自動的にテキストを追加できるようにするべき。
- MSAA のサポートは haspopup の状態を含む。
- デフォルトボタン
- XML で定義する機能
- エンターキーが起動させるが、他のウィジェットがエンターキーを必要とするフォーカスを備えている時はできない。
- 現在フォーカスされているウィジェットがエンターキーを必要としない時、濃い枠線を動的に描く。
- イベント - キーストロークを正しく動作させる。
- MSAA サポート (デフォルト状態)
- リンク
- エンターキーはリンクを作動させる(このようにリンクがフォーカスされているときは、デフォルトボタンは濃い枠線をこれ以上表示しない)。
- MSAA サポートはリンク接続された状態および、目的地の URL を保持するアクセス可能値を含む。
- テキスト領域 - 1行および複数行
- これらのテキスト領域にはネイティブのウィジェットを使うのがおそらくベスト。そうしないと、アクセシビリティのサポートは著しく困難になる。
- Tab キーは必ず次の項目をフォーカスすべきで、相当な理由と移動させる別の方法がない限りは、タブを挿入させるべきではない。
- 必ずシステムの選択色を使用する。そうでないと、スクリーンリーダーがテキストを読まない
- フォーカスがテキスト領域にない時は、必ずキャレットが点滅しないようにする。
- 以下の標準編集キーを使用して操作すること:矢印キー、home、end、pageup、pagedown、ctrl+left/right、選択用 shifted キー、delete、ctrl+delete、backspace、ctrl+backspace、ctrl+a、ctrl+b、ctrl+c、ctrl+i、ctrl+u、ctrl+x、ctrl+v、ctrl+[shift]+z キー
- 複数行のテキスト領域では、エンターキーが新しい行を挿入する。(このように複数行の領域がフォーカスされた時は、デフォルトボタンがそれ以上、濃い枠線を表示することはない。)
- オートコンプリートテキスト領域では、必ず up/down 矢印が押されない限りは、オートコンプリートポップアップが実際のフォーカスや MSAA フォーカスを受け取らないようにすること。リストそれ自体の中では、フォーカスが実際にない限り、デフォルトのシステムハイライト色を使用しないこと。
- オートコンプリートテキスト領域では、オートコンプリートされ選択されたテキストが、必ず delete キーや backspace キーによって取り除かれるようにすること。
- オートコンプリートテキスト領域では、左矢印キーや右矢印キーがポップアップを閉じてテキストの文字から文字へと移動を開始するようにする。
- MSAA サポートは、パスワードで保護されているテキストと読み取り専用領域で read only となっているテキストを保持するアクセス可能値を含む 。
- チェックボックス
- スペースバーによる切り替え
- MSAA サポートはチェックボックスの状態および statechange イベントを含む。
- スライダー
- スライダーを移動させるキーボードのサポートに使用: 矢印キー、home、end、PgUp、PgDn キー
- MSAA サポートは ROLE_SLIDER、アクセス可能値、値変更イベントを含む。
- プログレスバー
- MSAA サポートはアクセス可能な名前、値、名前と値変更イベントを含む。
グループ化された操作ウィジェット
- メニュー
- 矢印キー, Enter, Escape キー
- Alt キーによってのみ、メインメニューへ入る。
- メニューから離れると、フォーカスは以前にあった場所へ戻る
- 変更されたニーモニックと変更されないニーモニック
- MSAA サポート (フォーカスイベント、メニュー開始完了イベント、ラジオメニュー項目、チェックボックスメニュー項目を含む)
- スタチックテキストおよびグループボックス
- MSAA サポート
- ラジオグループ
- 選択されたラジオボタンのみがタブオーダーになっている。
- 他のラジオボタンは up/down 矢印によって選択とフォーカスが可能になる。
- フォーカスされたラジオボタンが必ず選択され、かつフォーカスされないものはけして選択されない。
- ラジオボタンのラベルが、テキスト領域やコンボボックスやあるいはプロンプトとして他の制御を備える時も、キーボードと MSAA サポートが引き続き正しく動作すること。
- MSAA サポートはチェックボックスの状態と状態変更イベントを含む。
- タブパネル
- Ctrl+[shift]+tab や Ctrl+PgUp/PgDn はタブを切り替える。
- タブはフォーカス可能となる。そして次に left/right 矢印キーを押して切り替える
- 一回目のタブクリックでタブが切り替わり、二回目のクリックでフォーカスされる。
- MSAA サポート。注:ユーザーのアクセスを容易にするために「5 of 3」などのように、現在のタブの位置を表示するアクセシビリティの記述を使用できる。「of」は補助テクノロジーによって解釈可能でありローカライズ不要。
- リストとコンボボックス
- タブ付きリストの場合、他の項目がすでに選択されていなければ、最初の項目を選択する。
- F4キー や Alt+down キー や alt+up キー はコンボボックスの開閉を切り替える。
- Escape キーはコンボボックスが開いていれば閉じる。(Escape キーでダイアログボックス全体を閉じてしまわないように注意する)
- Up/down 矢印キーの移動:Shift+up と shift+down は移動し選択範囲を広げる。
- 文字を入力すると移動できる。(同じ文字を入力するとその文字を含む各項目に移動し、異なる文字を入力するとその文字列全体ではじまる最初の項目に移動する)
- 複数選択は Ctrl+ 矢印を押すと選択することなくフォーカスを動かすことができる。そしてスペースキーを押すと項目を選択でき、Shift+ スペースを押すとその時点のポイントを選択でき、Ctrl+ スペースを押すとその時点の項目の選択状態を切り替えることができる。
- Shift+F10 キーかコンテキストメニューキーを使い現在の項目のコンテキストメニューを表示する。コンテキストメニューイベントを発生させる。Mac OS X では Ctrl+ スペースでコンテキストメニューが開く。
- スペースバーはチェックボックスを切り替える。
- リストがフォーカスされていないときは、リストボックスに、オーナー描画リスト項目を使用して異なるハイライト色を表示すること。そうしなければ、リストはフォーカスされずに、スクリーンリーダーは選択されたリスト項目を本来読んではいけない時に読むことがある。フォーカスされていないリストでは、より薄い色のハイライトを使用してフォーカスされていない状態であることを示す。オートコンプリートリストでは、システムカラー補正を1個使用してアクティブな状態に見せるが、リスト項目はユーザーがただタイプして編集しようとしている間は呼応しない。
- MSAA サポートは、選択可能なアクセス、選択可能な状態、複数選択可能な状態、拡張選択可能な状態および、チェクボックスの子用の状態変更イベントを含む。
- ツリー
- ツリー一覧がタブ付きの場合、他の項目がすでに選択されていなければ、最初の項目を選ぶ。
- Up/down 矢印キー移動
- 左矢印は始めに枝を折り畳んで親へ移動する。
- 右矢印は始めに枝を広げて、最初の子へ移動する。
- Ctrl+矢印キーを使い選択せずにフォーカスを移動することで複数選択は可能。そして、スペースキーで項目を選択し、shift+space キーで現在のポイントへを選択するか control+space キーで現在の項目を選択に切り替える。
- 一文字または複数文字をタイプして移動させる(これについては、上記リストサポートと同等である)。
- Shift+F10 キーかコンテキストメニューキーを使い現在の項目のコンテキストメニューを表示する(Mac OS X では Ctrl+スペースでコンテキストメニューが開く)。
- スペースバーはチェックボックスを切り替える。
- エンターキーは、もしダブルクリックがそうできるならば、項目を有効にすべきである。
- MSAA サポートは、リスト内の現在のレベルや位置を示す選択可能なアクセス、情報伝達画像や対話式画像のための代替テキスト、選択可能、複数選択可能、拡張選択可能な状態、チェックボックスの子要素の拡張、折り畳み、切替用の状態変更イベントを含む。ユーザーが容易にアクセスできるために、「L3, 6 of 9」などのように、現在のツリー一覧のレベルと、位置を示す記述可能なアクセスを利用できることに留意する。「of」と「L」とは、補助テクノロジーによって解釈されるので、ローカライズはしないこと。
- Mac OS X の相違点: option+left キーと option+right キーは多重レベルの拡張と折り畳みをする。
- Mac OS X の相違点: ユーザーは複数行を選択でき1キーエンターで拡張できる。拡張後は、複数選択(お互い離れている)は保持される。