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

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

もずはっく日記(2018年12月)

2018年12月11日

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: (list)

非常に長い長い道のりでしたが、ついにこのバグ修正、そして続けてポストされる記事にある、keypressイベントの挙動を他のブラウザにあわせた修正が完了しました。

UI Events (DOM Level 3 Events)のWGにInvited Expertとして参加していた時に、WGのメンバーと議論を重ね、IMEの未確定文字列がある間(compositionstartからcompositionendの間)、キーボードイベントはどのように発火されるべきか、されないべきかというのを決めて、現在の仕様案のように結論付けられています。

私の主張は、Geckoがkeydownkeyupも未確定文字列がある場合に発火していないこともあり、IMEを知らない開発者に不用意にこれらのイベント中にSelectionを変更されたりして未確定文字列を強制確定しないといけないケース、つまり、IMEユーザがIMEを意識せずに作られたWebアプリで困らないように、全く発火させないという形でした。

一方でWG側の主張は、keydownkeyupはキーボードのキーの物理状態を示すイベントであり、keypressは文字入力を示す、論理状態を示すイベントであるので、keydownkeyupは未確定文字列があっても発火すべき、というものでした。

そして色々とあって、WG側の案が標準仕様として残ることになりました。

このバグの修正により、keydownイベントと、keyupイベントが未確定文字列がある場合にも発火するように修正されています。

これらのkey値は、IMEが処理していた場合にはProcess、そうではない場合はIME無しで入力される文字、もしくは本来のキー名(Enter等)となります。この定義が非常に曖昧なのと、プラットフォーム、もしくはアクティブなIMEによって、どのキーイベントを処理したと主張するかはそれぞれに依存することになりますので、KeyboardEvent.isComposingを参照して、未確定文字列が存在するかどうかを確認する方がシンプルなコードになるでしょう。

ちなみにGeckoでは未確定文字列がある場合、各OS用のキーイベントハンドラが、クロスプラットフォーム部分に対してGecko内のイベントを発火しないようにしていました。このため、最初に全ての内部キーボードイベント、内部IMEイベントをTextEventDispatcherという新しいクラスを介して発火するように書き換え、ここで集中管理することで、長期間、NightlyとEarly-Betaでのみテスタ向けに新しい動作を有効化していました。

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

bug-org 354358を含むエントリ