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

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

もずはっく日記(2013年3月)

2013年3月27日

Bug-org 807241 [TSF] Should use ITfMessagePump and ITfKeystrokeMgr
初回投稿日時: 2013年03月27日19時49分24秒
カテゴリ: Mozilla Core Mozilla22 TSF Windows バグ修正
SNS: (list)

WindowsのIMEのAPIセットが、IMMからTSFへの移行するにあたり、TSFにネイティブ対応していないアプリのために、IMM-TSFのエミュレーション機能である、CUASと呼ばれるシステムが、通常のアプリの場合は動作しています。これは、メッセージをフックし、様々な処理を自動で行い、必要があればIMMのメッセージを発行したりしています。

ITfMessagePumpは、PeekMessageW()メソッドを持っていて、これを利用すると、通常のPeekMessageW()よりは生のメッセージキューからメッセージを取得し、処理を行うことができます。

TSF対応アプリが、従来からあるPeekMessageW() APIを利用してメッセージを取得した際に、CUASが先にメッセージをTSFに渡してしまい、もし、キーイベントが処理されてしまった場合、アプリはキーイベントの発生自体が分からなくなっていることに、テスト中に気付きました。

これでは、D3Eの仕様書で定義されている、keydownイベントと、keyupイベントを、未確定文字列がある場合でも発行する、という仕様に従うことができないので、その準備として今回の修正を行いました。

これにより、TSFモードの場合、PeekMessageW()の呼び出しが、virtual callになってしまうので、かなりパフォーマンスが悪くなっているのではないかと思われます。色々と検討してみたんですが、virtual callを阻止して、直接実装されているメソッドを呼び出す方法が思いつきませんでしたので、今のところ、必要悪なパフォーマンス低下になっています(IMMモードでは、従来通り、CのPeekMessageW()を呼び出すので、パフォーマンスに変化はありません)。

また、この修正により、CUASが自動でキーイベントをTSFに渡してくれなくなりますので、ITfKeystrokeMgrを利用して、nsTextStore自身がTSFにキーイベントを通知するように修正しています。

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

bug-org 807241を含むエントリ