この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2014年5月)

2014年5月30日

Bug-org 865649 Implement KeyboardEvent.code (only for physical keyboard)
初回投稿日時: 2014年05月30日12時12分23秒
最終更新日時: 2014年05月30日12時13分30秒
カテゴリ: Events Mozilla Core Mozilla32 Mozilla33 バグ修正
SNS: (list)

個人的には、Firefox 32、Firefox 33の目玉になる機能です。KeyboardEvent.codeの初期実装が完了しました。

KeyboardEvent.codeは、キーボードの物理キーを一意に識別できる属性です。

例えば、JISキーボードの@キーは、ANSIキーボードでは[キーですし、OSのキーボードレイアウトを変更すると、様々な文字の入力キーになりますが、選択されているキーボードレイアウトや、モディファイアキーの状態に関係無く、このキーのイベントのKeyboardEvent.code値は、"BracketLeft"となります。JISキーボードのことしか知らない開発者の方には誤解を生みそうな値ですが、USBの仕様に沿う形でこのような名前になっています。

ただし、ここで言う、物理キー、というのは、あくまでもOSから一意に判断できるキーの話です。例えば、テンキーが独立していないノートPCでNumLockをかけると、Mキーが0キーになったりします。この場合、NumLockがかかっていなかったら、"KeyM"となりますが、NumLockがかかっている場合、"Numpad0"となります。ただし、テンキーが独立しているキーボードを利用している場合、テンキーの0キーは、NumLockがかかっていない時にInsertキーになりますが、KeyboardEvent.code値は、常に"Numpad0"となります。

KeyboardEvent.keyが選択しているキーボードレイアウトや、モディファイアキーの状態を含めて、そのキーが押された時の機能を表現している属性であるのに対して、KeyboardEvent.codeはそれらの状態を無視しているという、この特性の違いをうまく利用して実装に利用してみてください。

なお、実装は、Mac以外ではスキャンコードからマッピングされていますが、Macのみ、キーイベントからスキャンコードがとれませんので、仮想キーコードを利用しています。Macの仮想キーコードは、キーボードレイアウトに依存せず、キーの位置を示すことを確認していますが、PC用のキーボードを接続した場合、PrintScreenPauseScrollLockキーはそれぞれ、F13からF15キーにマッピングされてしまうので、接続しているキーボードの種類に関係なく、これらのキーの値は"F13"から"F15"になってしまいます。

詳細なマッピング情報はMDNで公開していますので、他のブラウザでの実装時に互換性をしっかりと持って貰えることを期待しています。

現在のところ、OSのイベントで、物理キーを完全にエミュレーションしている場合にのみ、期待通りに動作します。例えば、スクリーンキーボード等の外部アプリから、スキャンコードが適切に設定されていない場合には、値が空文字列か、デタラメな値になる可能性があります。後者はどうしようもありませんが、前者は今後、APIを活用して対応していく予定です。

この属性は、Gecko 32で実装されましたが、リリースビルドでは設定で無効化されていることに注意してください。現在のところ、Gecko 33から、リリース版でも有効化する予定です。

関連するかもしれないエントリ

bug-org 865649を含むエントリ