Bug-org 354358 keydown/keyup events should be dispatched even during composition (but keypress shouldn't be so)
初回投稿日時: 2018年12月11日23時09分31秒
最終更新日時: 2018年12月11日23時13分41秒
カテゴリ: Events IME KeyboardEvent Mozilla Core Mozilla65 バグ修正
SNS:
Tweet (list)
非常に長い長い道のりでしたが、ついにこのバグ修正、そして続けてポストされる記事にある、keypress
イベントの挙動を他のブラウザにあわせた修正が完了しました。
UI Events (DOM Level 3 Events)のWGにInvited Expertとして参加していた時に、WGのメンバーと議論を重ね、IMEの未確定文字列がある間(compositionstart
からcompositionend
の間)、キーボードイベントはどのように発火されるべきか、されないべきかというのを決めて、現在の仕様案のように結論付けられています。
私の主張は、Geckoがkeydown
もkeyup
も未確定文字列がある場合に発火していないこともあり、IMEを知らない開発者に不用意にこれらのイベント中にSelection
を変更されたりして未確定文字列を強制確定しないといけないケース、つまり、IMEユーザがIMEを意識せずに作られたWebアプリで困らないように、全く発火させないという形でした。
一方でWG側の主張は、keydown
とkeyup
はキーボードのキーの物理状態を示すイベントであり、keypress
は文字入力を示す、論理状態を示すイベントであるので、keydown
とkeyup
は未確定文字列があっても発火すべき、というものでした。
そして色々とあって、WG側の案が標準仕様として残ることになりました。
このバグの修正により、keydown
イベントと、keyup
イベントが未確定文字列がある場合にも発火するように修正されています。
これらのkey
値は、IMEが処理していた場合にはProcess
、そうではない場合はIME無しで入力される文字、もしくは本来のキー名(Enter
等)となります。この定義が非常に曖昧なのと、プラットフォーム、もしくはアクティブなIMEによって、どのキーイベントを処理したと主張するかはそれぞれに依存することになりますので、KeyboardEvent.isComposing
を参照して、未確定文字列が存在するかどうかを確認する方がシンプルなコードになるでしょう。
ちなみにGeckoでは未確定文字列がある場合、各OS用のキーイベントハンドラが、クロスプラットフォーム部分に対してGecko内のイベントを発火しないようにしていました。このため、最初に全ての内部キーボードイベント、内部IMEイベントをTextEventDispatcher
という新しいクラスを介して発火するように書き換え、ここで集中管理することで、長期間、NightlyとEarly-Betaでのみテスタ向けに新しい動作を有効化していました。