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

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

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

2012年5月24日

Bug-org 630810 Should convert from native keycode to DOM keycode for every keys on Windows
初回投稿日時: 2012年05月24日13時26分39秒
カテゴリ: Mozilla Core Mozilla15 バグ修正
SNS: (list)

Keycode ReimplementationのWindows版です。

Gecko(というかほとんどのブラウザ)はキーイベントのkeyCodeの値に、Windowsのキーメッセージで与えられるvirtual keycodeと同じ値で定義しています。おそらくNetscapeあたりが最初に実装した時から、それを見よう見まねで各社が適当にそれっぽく動くようにしたのが原因だと思いますが、とにかく標準的なルールが全く無く、US ANSIキーボード以外での値がブラウザ間で互換がとれていなかったり、Geckoでもプラットフォームごとに値が違うことが多いという状況でした。

これを改善すべく、簡単なルールを決め、GeckoのWindows版、Mac版、Linux(GTK)版ではほぼ同じ挙動をとるように今回改善しています。

そのルールは全プラットフォーム版をMDNにも記述しましたが、こちらではWindowsに絞った内容で紹介しておきます。

  1. Windowsではvirtual keycodeがAからZか、0から9のキーに対しては、これに対応したDOMキーコード(これに関してはそのままの値)を使用する
  2. それ以外の文字を入力するキーでは、そのキーで入力される文字がASCII文字の場合、それにあったキーコードを利用する
  3. もしその文字がASCII文字ではないものの、Shiftキーを押しながらだとASCII文字を入力できる場合、それにあったキーコードを利用する
  4. それ以外のキーに関してはそのキーにあったキーコードが利用される
  5. 上記ルールで対応するキーコードが求められない場合は0とする

Windowsではこれまで+を入力するキーと、-を入力するキー以外では、システムのvirtual keycodeをそのままDOMキーイベントのkeyCodeに設定していました。平たく言うと、何も考えずに垂れ流ししていたわけです。このままでは他のプラットフォームでは手詰まりに陥るのでWindowsでもきちんと対応するDOMキーコードを自身で定義しているか確認し、存在しない場合にはゼロとするようにしています。

Windowsではあまりキーコードが変化するキーはありませんが、Windowsキーには新たに専用のキーコードが割り当てられています。

JISキーボードの;+キーはDOM_VK_PLUSではなく、DOM_VK_SEMICOLONに変化しています。他の記号キーに関してもいくつか変わっている可能性はあります。ただ、元々文字を入力するキーのkeyCode値をkeydownもしくはkeyupイベントでチェックすべきではないので実際のWebアプリへの影響は限定的だと思います。

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

bug-org 630810を含むエントリ